注:整个博客中出现的文件,都要修改成自己电脑中所要查看的图片或视频的路径
一、计算机视觉
定义
计算机视觉 是研究如何让计算机从数字图像或视频中自动获取、处理、分析和理解信息 的学科,旨在使计算机能够模拟人类视觉系统的功能,从视觉输入中提取有意义的信息并做出决策。
安装库
需要安装 opencv-python==3.4.18.65 opencv-contrib-python==3.4.18.65
直接在终端pip install即可


二、核心图像操作
1. imread()
-
功能:读取图像文件
-
参数:(路径, 读取模式)
-
模式:彩色(1)、灰度(0)、包含Alpha(-1)
-
用法
python# 基本用法 img = cv2.imread('image.jpg') # 默认彩色 img = cv2.imread('image.jpg', cv2.IMREAD_COLOR) # 彩色 img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) # 灰度 img = cv2.imread('image.jpg', cv2.IMREAD_UNCHANGED) # 包含Alpha通道 # 或使用数字 img = cv2.imread('image.jpg', 1) # 彩色 img = cv2.imread('image.jpg', 0) # 灰度 img = cv2.imread('image.jpg', -1) # 包含Alpha
2. imshow()
-
功能:显示图像窗口
-
参数:(窗口标题, 图像矩阵)
-
注意:需配合waitKey()使用
-
用法
python# 显示单张图像 cv2.imshow('Image Window', img) # 显示多张图像 cv2.imshow('Image 1', img1) cv2.imshow('Image 2', img2)
3. imwrite()
-
功能:保存图像文件
-
参数:(保存路径, 图像矩阵, 可选参数)
-
支持:多种格式(jpg/png/tiff等)
-
用法
python# 基本保存 cv2.imwrite('output.jpg', img) cv2.imwrite('output.png', img) # 带参数保存 # JPEG质量参数 cv2.imwrite('output.jpg', img, [cv2.IMWRITE_JPEG_QUALITY, 90]) # PNG压缩参数 cv2.imwrite('output.png', img, [cv2.IMWRITE_PNG_COMPRESSION, 8]) # 同时设置多个参数 params = [cv2.IMWRITE_JPEG_QUALITY, 95, cv2.IMWRITE_JPEG_PROGRESSIVE, 1] cv2.imwrite('high_quality.jpg', img, params)
4. waitKey()
-
功能:等待键盘输入
-
参数:(延迟毫秒数,0=无限等待)
-
返回:按键ASCII码
-
用法
python# 基本用法 cv2.waitKey(0) # 无限等待 cv2.waitKey(1000) # 等待1秒 # 常用模式 while True: # 显示视频帧 cv2.imshow('Video', frame) # 检测按键 key = cv2.waitKey(1) & 0xFF if key == ord('q'): # 按q退出 break elif key == 27: # ESC键 break elif key == ord('s'): # 按s保存 cv2.imwrite('screenshot.jpg', frame)
5. resize()
-
功能:调整图像尺寸
-
参数:(原图, 目标尺寸, 插值方法)
-
常用插值:INTER_LINEAR/INTER_NEAREST/INTER_AREA
-
用法
python# 方法1:直接指定尺寸 resized = cv2.resize(img, (640, 480)) # 方法2:使用fx, fy缩放因子 resized = cv2.resize(img, None, fx=0.5, fy=0.5) # 缩小一半 # 方法3:指定插值方法 # 最近邻插值(速度快,质量低) resized1 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_NEAREST) # 双线性插值(平衡,默认) resized2 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_LINEAR) # 区域插值(适合缩小) resized3 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_AREA) # 双三次插值(质量高,速度慢) resized4 = cv2.resize(img, (640, 480), interpolation=cv2.INTER_CUBIC)
三、窗口控制
6. destroyAllWindows()
-
功能:关闭所有窗口
-
无参数
四、实用功能
7. cvtColor()
-
功能:颜色空间转换
-
常用:BGR2GRAY/BGR2RGB/BGR2HSV
-
用法
python# BGR转灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR转RGB rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # BGR转HSV hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # HSV转BGR bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR) # 灰度转BGR bgr_from_gray = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR)
8. split()/merge()
-
功能:通道分离/合并
-
split:分离BGR通道
-
merge:合并通道
-
用法
python# 分离BGR通道 b, g, r = cv2.split(img) # 分别显示各通道 zeros = np.zeros(img.shape[:2], dtype="uint8") cv2.imshow("Blue", cv2.merge([b, zeros, zeros])) cv2.imshow("Green", cv2.merge([zeros, g, zeros])) cv2.imshow("Red", cv2.merge([zeros, zeros, r])) # 合并通道 merged = cv2.merge([b, g, r])
五、图像信息
9. shape属性
-
功能:获取图像维度
-
格式:(高度, 宽度, 通道数)
10. dtype属性
-
功能:获取数据类型
-
通常:uint8
六、视频相关
11. VideoCapture()
-
功能:打开视频/摄像头
-
参数:(设备索引或视频路径)
-
用法
python# 从摄像头读取 cap = cv2.VideoCapture(0) # 0表示默认摄像头 # 从视频文件读取 cap = cv2.VideoCapture('video.mp4') while cap.isOpened(): ret, frame = cap.read() # ret:是否成功, frame:帧数据 if not ret: break cv2.imshow('Video', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release()
12. VideoWriter()
-
功能:保存视频
-
参数:(输出路径, 编码, 帧率, 分辨率)
-
用法
python# 设置视频参数 fps = 30.0 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 创建VideoWriter对象 fourcc = cv2.VideoWriter_fourcc(*'XVID') # 编码格式 out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height)) while cap.isOpened(): ret, frame = cap.read() if not ret: break out.write(frame) # 写入帧 cv2.imshow('Recording', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break out.release()
七、数学运算
13. add()/subtract()
- 功能:图像加减运算
14. addWeighted()
-
功能:图像加权融合
-
实现:dst = α·img1 + β·img2 + γ
八、用法示例
1、读取图片
python
'''读取图片'''
import cv2
a = cv2.imread('true.png')
# print(a)
cv2.imshow('true', a)
b = cv2.waitKey(0)
# print(b)
cv2.destroyAllWindows()
print("图像形状 (shape):",a.shape)
print("图像数据类型 (dtype):",a.dtype)
print("图像大小(size):",a.size)

2、读取图片的灰度图
python
'''读取图片的灰度图'''
import cv2
b = cv2.imread('true.png',cv2.IMREAD_GRAYSCALE)
# print(b)
cv2.imshow('tr', b)
c = cv2.waitKey(0)
print(c)
cv2.destroyAllWindows()
print("图像形状 (shape):",b.shape)
print("图像数据类型 (dtype):",b.dtype)
print("图像大小(size):",b.size)
# 图片保存
cv2.imwrite('true_GRAY.png',b)

3、读取视频
python
'''视频'''
import cv2
video_capture = cv2.VideoCapture("视频.mp4")#摄像头0
if not video_capture.isOpened():
print("无法打开视频文件")
exit()
#循环读取视频帧
while True:
ret, frame = video_capture.read()
if not ret:
break
#灰度
frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#显示当前帧
cv2.imshow("video",frame)
#检查用户是否按下'Esc'键,如果是则退出循环,esc=27,空格是32
if cv2.waitKey(60)==27:#这里的60指的是60ms,当是0时会卡在第一帧画面,想要得到下一帧要按下任意键
break
#释放资源
video_capture.release()#将前面加载的文件释放出去
cv2.destroyAllWindows()
在这个代码里可以通过修改waitKey()括号中的数字来控制视频播放的速度
当前代码显示的是灰度的视频,若想显示彩色的,可以将
frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
这一行删去或注释掉,若想修改成其他的,也可以通过上面提到的cvtColor的一些用法改变
4、对图片进行切片
python
'''对图片进行切片'''
'''ROI:区域感兴趣(Region of Interest)的缩写。它指的是图像或视频中感兴趣的特定区域,需要进行分析或处理。
#ROI可以由用户手动选择,也可以使用计算机视觉算法自动检测。'''
import cv2
a = cv2.imread(r'./true.png')
b = a[20:220,30:230]# 直接对numpy 数组进行切片
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、提取rgb颜色通道
1)将三个通道都分离
python
import cv2
ai=cv2.imread(r'./xiaomao.jpg')
a = cv2.resize(ai,dsize=None,fx=0.3,fy=0.3)
#提取颜色通道
a1=a[:,:,0]#蓝色通道
a2=a[:,:,1]#绿色通道
a3=a[:,:,2]#红色通道
b,g,r=cv2.split(a)#或用此分离颜色通道
cv2.imshow('b',b)
cv2.imshow('g',g)
cv2.imshow('r',r)
cv2.waitKey(0)
cv2.destroyAllWindows()

2)将一个通道或两个通道修改为0(即删除某个通道)
下面代码中我将绿色和蓝色通道都设为0,所有显示的图片是全蓝的
python
import cv2
ai=cv2.imread(r'./xiaomao.jpg')
a = cv2.resize(ai,dsize=None,fx=0.3,fy=0.3)
a_new=a.copy()
# a_new[:,:,0]=0#将蓝色设置为0
a_new[:,:,1]=0#将绿色设置为0
a_new[:,:,2]=0#将红色设置为0
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
