当前位置: 首页 > news >正文

opencv-python基础

一.opencv-python简述

其使用Numpy,所有OpenCV数组结构都转换为Numpy数组,是一个高度优化的数据库操作库。

二.环境安装

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

三.基本概念

- 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。

- 数字图像利用0/1编码记录信息,opencv中常用的是8位图像,大多数彩色和灰度图像使用8位(uint8)表示每个通道的像素值,范围从0到255,其中 最黑,1(255) 最白。

- 几乎所有颜色都可以通过RGB三原色按照不同比例调配而成。

四.图像存储

- 彩色图像:三维数组

- 灰度图像:二维数组(矩阵)

- 在OpenCV中,默认情况下,彩色图像是以BGR蓝-绿-红)顺序存储

- 形状(Shape):

图像的尺寸由其高(h)、宽(w)和通道数(c)决定。可以通过 img.shape 属性获取(h,w,c)。

  - 彩色图像,返回一个包含三个值的元组 (height, width, channels)。

  - 灰度图像,返回一个包含两个值的元组 (height, width),因为其只有一个通道。

- 数据类型(dtype):图像中的每个像素值的数据类型决定了可以存储的最大值。例如,8位无符号整数(uint8)允许的范围是从0到255。

  - 单通道(灰度图像):每个像素由一个数值表示,代表该点的亮度。值越低越暗,值越高越亮。

五.图像基本操作

5.1 创建窗体(窗口)

cv2.namedWindow(winname  [,窗口属性])

参数:

- winname:窗口名

- 窗口属性:窗口大小是否可调整

    - cv2.WINDOW_AUTOSIZE :默认,窗口会根据加载的图像自动调整到合适的大小,并且用户不能拖动窗口边缘来调整窗口大小。

    - cv2.WINDOW_NORMAL :窗口大小是可调整的,用户可以通过鼠标拖动窗口边缘来自由改变窗口大小。

import cv2 as cv
import numpy as np

# 创建窗体
cv.namedWindow("win1",cv.WINDOW_AUTOSIZE)
cv.imshow("win2",cv.WINDOW_NORMAL)

运行后会出现两块窗口,暂时不管。

5.2 读取图像

cv2.imread(path  [,读取方式])

  参数:

  - filename:图像路径

  - 读取方式:彩色·默认、灰色等

# 读取方式为灰色
img = cv.imread("../images/cat1.png", cv.IMREAD_GRAYSCALE)

继续往下

5.3 图像显示

cv2.imshow(winname,img)

参数:

- winname:显示图像的窗口名,以字符串类型表示

- img:要显示的图像

cv.imshow("win1",img)
cv.imshow("win2",img)

# cv.waitKey(n):n>0,意味着程序将等待n毫秒。
cv.waitKey(0)

# cv2.destroyAllWindows(winname):会在当前程序执行到该语句时立即销毁打开的窗口,并释放与这些窗口相关的资源。
# 默认关闭所有
cv.destroyAllWindows()

5.4 保存图像

cv2.imwrite(path,img)

参数:

- path:图片保存的路径和图片名

- img:要保存的图像

cv.imwrite('output.jpg', img)

5.5 创建黑色图像

使用 np.zeros() 创建全黑图像,再修改像素值(255)成为全白图像。

numpy.zeros((height,width,channels),dtype=np. uint8)

import cv2 as cv
import numpy as np

w = 480
h = 640

# c = 1 的时候就是灰度图像,单通道,但是为二维图像
c = 3


b = np.zeros((h,w,c),dtype=np.uint8)
cv.imshow("black",b)

cv.waitKey(0)
cv.destroyAllWindows()

# 更改为白色图像
# 利用数组切片更改值
b[:,:,:] = 255

cv.imshow('white',b)
cv.waitKey(0)
cv.destroyAllWindows()

# 随机像素值图像

b[:,:,:] = np.random.randint(0,256,(h,w,c))

cv.imshow('random',b)
cv.waitKey(0)
cv.destroyAllWindows()

5.6 图像裁剪(切片)

img[y:y+h,x:x+w]

提取的是从 (x,y) 开始,高度为 h,宽度为 w 的矩形区域

import cv2 as cv
import numpy as np


f = cv.imread('../images/cat1.png')

y = 200
x = 200
h = 400
w = 400

# 先长后宽,这样理解简单些
s = f[y:y+h,x:x+w]
cv.imshow('s',s)
cv.waitKey(0)
cv.destroyAllWindows()

这里切记,opencv中坐标原点在图像的左上角,也就是w做横轴,h做纵轴。

5.7 调整大小

cv2.resize(img,dsize,dts)

- img:输入图像,通常是二维或三位NumPy数组。

- dsize:输出图像的尺寸,是一个二元组 (w,h)

- dst:缩放后的图像

import cv2 as cv
import numpy as np
f = cv.imread('../images/cat1.png')

s = cv.resize(f, (100,100))
cv.imshow('s', s)
cv.waitKey(0)
cv.destroyAllWindows()

六.图像绘制

6.1 直线

cv2.line(img,start,end,color,thickness)

参数:

  - img:要绘制直线的图像

  - startend:直线的起点和终点,都是两个元组(坐标)

  - color:直线的颜色,对于彩色图像,使用 BGR 格式(b,g,r)指定颜色

  - thickness:线条粗细,值越大越宽

  - 隐藏参数,cv2.LINE_AA ,表示使用抗锯齿算法绘制图像,这在每个绘制函数中都隐式存在,默认为 cv2.LINE_8

import cv2 as cv

img = cv.imread('../images/cat1.png')

# 画一条直线,起点终点分别指定,同时为蓝色
cv.line(img,(100,100),(200,200),(255,0,0),3)
cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

6.2 圆形

cv2.circle(img,centerpoint,r,color,thickness)

参数:

  - img:要绘制圆形的图片

  - centerpointr:圆心和半径

  - color:线条颜色

  - tnickness:线条宽度,为-1时生成闭合图案并填充颜色

import cv2 as cv

img = cv.imread('../images/cat1.png')

cv.circle(img, (100, 100), 50, (255, 0, 0), -1)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.3 绘制矩形

cv2.rectangle(img,leftupper,rightdown,color,thickness)

参数:

  - img:要绘制矩形的图像

  - leftupperrightdown:矩形的左上角和右下角坐标

  - color:线条的颜色

  - thickness:线条的宽度

import cv2 as cv

img = cv.imread('../images/cat1.png')

cv.rectangle(img, (100, 100), (300, 300), (0, 255, 0), 2)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.4 绘制文本(向图片中添加文字)

cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)

参数:

  - img:要添加文字的图像

  - text:要写入的文本数据(此处是不能加中文的,会显示问号(?),matplotlib可以显示中文)

  - station:文本的放置位置

  - font:字体样式

  - Fontscale:字体大小

  - thickness:字体线条宽度

  - cv2.LINE_AA :使用反走样技术绘制文本边框

import cv2 as cv

img = cv.imread('../images/cat1.png')

cv.putText(img, 'Hello World', (50, 50), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv.imshow('Image', img)
cv.waitKey(0)
cv.destroyAllWindows()

6.5 读取视频

cap = cv2.VideoCapture(path)

- path : 为0代表从默认摄像头捕获视频流

ret,frame = cap.read()

- 得到一个布尔值和一帧图像,布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败,如果为True,frame则是当前帧的图像数据。

那视频都是一帧一帧的,我要怎么读取呢?来一起看看

import cv2 as cv

# 本地视频
cap = cv.VideoCapture('../video/arknights_run.mp4')

# 循环获取视频每一帧
while True:
    ret, frame = cap.read()
    # 考虑视频最后一帧为空,跳出循环
    if not ret:
        break

    cv.imshow('frame', frame)
    # 0xFF把键盘敲入的键转换为ASCII码
    if cv.waitKey(40) & 0xFF == ord('q'):
        break

cap.release()
cv.destroyAllWindows()
# 获取摄像头
cap = cv.VideoCapture(0)
while True:
    # 读取摄像头
    ret, frame = cap.read()
    # 显示
    cv.imshow('frame', frame)
    # 按q键退出
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 释放摄像头
cap.release()
# 释放窗口
cv.destroyAllWindows()

相关文章:

  • 如何让老电脑运行快些(极限榨干老电脑硬件)
  • 傅利叶发布首款开源人形机器人N1:开发者可实现完整复刻
  • 科普:关系图谱中的网络特征如何输入到模型中?
  • 华为RH2288H V3服务器极速重装:从RedHat到openEuler 24超详细重装指南
  • 2025ArkTS基础UI(一)——Column、Row、Text、Button组件
  • 主服务器和子服务器之间通过NFS实现文件夹共享
  • 【数据结构】集合框架、时间复杂度和空间复杂度
  • 同时打开多个Microchip MPLAB X IDE
  • JAVA虚拟机(JVM)学习
  • vue 实战:百度音乐项目
  • 网络机顶盒OTT业务HTTPS网络包分析:Wireshark抓包与解析技术指南
  • 每日一题(小白)模拟娱乐篇27
  • router.js 中使用国际化
  • 【AI论文】OLMoTrace:将语言模型输出追溯到万亿个训练标记
  • Spring配置方式演进:从XML到注解,构建灵活高效的开发体系
  • 基于数字水印的公文流转系统设计与实现
  • Java的关键字、标识符与数据类型详解
  • 内联汇编知识点earlyclobber=
  • Windows启动总是卡在LOGO画面有哪些原因
  • Java 设计模式:装饰者模式详解
  • 网站cms分站系统/新闻发稿平台有哪些
  • 长沙网站制作公司推荐/网络营销在哪里学比较靠谱
  • 织梦做分类信息网站/重庆百度搜索优化
  • 网站开发到上线的流程/互联网广告投放平台加盟
  • 拉萨网站建设价格/宁波网络营销推广公司
  • 网站开发使用哪种语言/房地产营销策略有哪些