文章目录
1. 前言
最近在学习OpenCV的Python版本,是计算机视觉方面必须掌握的一个跨平台库,里面针对图形图像视频的处理方法有很多,为了避免遗忘和以后随用随查,记录分享在此。欢迎各位大佬指出不足之处!
2. 图片读取
2.1 函数简述和原型
该函数用于读取各种常见格式的图片,读取结果均为ndarray。对于单通道灰度图像即为二维矩阵,对于彩色3通道图像即为heigh*width*channels
的三维矩阵。应注意作为矩阵,第一个下标为行数,对应图片的高,第二个下标为列数,对应图片的宽。官方文档:https://docs.opencv.org/3.4.2/d4/da8/group__imgcodecs.html#ga288b8b3da0892bd651fce07b3bbd3a56
img = cv2.imread(filename[, flags])
2.2 参数
- filename:要读取的图片的路径,可以是相对路径,字符串形式;
- flags:读取图片的模式,常用的有以下几种:
- cv2.IMREAD_UNCHANGED: 包含图片透明度信息(alpha通道)的彩色图片,有透明度信息时则图片有4通道,常见于png格式图片;
- cv2.IMREAD_GRAYSCALE: 以灰度方式的读取图片,读取出的是单通道灰度图片;
- cv2.IMREAD_COLOR: 读取3通道BGR彩色图片,读取出的是3通道BGR色彩空间下的图片;
2.3 返回值
- img:返回的图像数据,均为numpy.ndarray类型,并且其中数据类型也均为numpy.uint8,图像大小由图像文件决定,图像通道数由读图模式决定。
3. 色彩空间转换
3.1 函数简述和原型
该函数用于将读取到的图片色彩空间进行转换。注意OpenCV中的RGB彩色空间的通道顺序相反,顺序为BGR,故在使用matplotlib等库进行图像展示时,需要将图像转换至RGB彩色空间。官方文档:https://docs.opencv.org/3.4.2/d7/d1b/group__imgproc__misc.html#ga397ae87e1288a81d2363b61574eb8cab
dst = cv2.cvtColor(src, code)
3.2 参数
- src:要转换色彩空间的图片,ndarray;
- code:色彩空间转换方式,常用有以下几种:
- cv2.COLOR_GRAY2BGR: 单通道灰度图像转换到3通道BGR色彩空间;
- cv2.COLOR_BGR2GRAY: 3通道BGR图片转换为单通道灰度图;
- cv2.COLOR_BGR2RGB: BGR色彩空间转换为RGB色彩空间,常用于使用其他图像库展示;
- cv2.COLOR_BGR2HSV:BGR色彩空间转换为HSV色彩空间;
3.3 返回值
- dst:返回色彩空间转换后的图像数据,宽高与转换前一致,通道数目根据转换的色彩空间决定。
4. 图片展示
4.1 函数简述和原型
该函数用于将图片展示到OpenCV的GUI窗口中。官方文档:https://docs.opencv.org/3.4.2/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563
cv2.imshow(winname, mat)
4.2 参数
- winname:展示窗口的名称,如果目前还没有定义该名称的展示窗口,则OpenCV会自动新建一个;
- mat:要展示的图片,应注意对于RGB色彩空间,OpenCV中的顺序为BGR;
4.3 用法举例
img = cv2.imread(r'.\image.jpg', cv2.IMREAD_COLOR)
cv2.imshow('show image', img)
# 应注意在展示图片后需要hold住程序,否则窗口也就一闪而过了
cv2.waitkey(0)
# 最后销毁一下窗口回收资源
cv2.destroyAllWindows()
5. 图片写入
5.1 函数简述和原型
该函数主要用于将处理后的图像保存至文件。官方文档:https://docs.opencv.org/3.4.2/d4/da8/group__imgcodecs.html#gabbc7ef1aa2edfaa87772f1202d67e0ce
retval = cv2.imwrite(filename, img[, params])
5.2 参数
- filename:保存的图片路径和名称;
- img:要保存的图像数据;
- params:保存时的参数,可选;
5.3 返回值
- retval:布尔类型,图片是否保存成功;
6. 视频处理类初始化
OpenCV中使用VideoCapture类作为视频的处理类,既可以从视频文件中读取视频流,也可以从摄像头设备中读取视频流。官方文档:https://docs.opencv.org/3.4.2/d8/dfe/classcv_1_1VideoCapture.html
6.1 函数简述和原型
该函数主要用于初始化VideoCapture视频处理类。
cap = cv2.VideoCapture(filename/index)
6.2 参数
初始化的参数既可以是要打开的视频文件的路径(filename),也可以是摄像头设备的ID(index)。摄像头设备的ID默认从0开始。
6.3 返回值
- cap:返回的就是VideoCapture视频流处理对象;
7. 获取视频流信息
7.1 函数简述和原型
建立VideoCapture后,可以通过该类中的get
函数获取视频流的各种信息。
retval = cv2.VideoCapture.get(propId)
7.2 参数
- propId:要获取的信息对应的ID,常用的有如下几种:
- cv2.CAP_PROP_FRAME_WIDTH: 视频流中帧的宽度;
- cv2.CAP_PROP_FRAME_HEIGHT: 视频流中帧的高度;
- cv2.CAP_PROP_FRAME_COUNT: 视频流中帧的总数量,对于摄像头来说,该值为-1;
- cv2.CAP_PROP_FPS: 视频流中的帧速率;
7.3 返回值
- retval:返回的就是要获取的视频流属性值,应注意返回的类型均为double,因此对于宽度、高度、帧总数等往往需要转型;
8. 设置视频流属性
8.1 函数简述和原型
可以通过该函数设置VideoCapture中视频流的各种属性。
retval = cv2.VideoCapture.set(propId, value)
8.2 参数
- propId:要设置的属性对应的ID,与获取的属性ID一致,常设置的属性有如下几种:
- cv2.CAP_PROP_POS_FRAMES: 视频流中帧的位置,可以通过设置该属性直接跳到视频中的某一帧;
8.3 返回值
- retval:布尔类型,返回是否成功设置视频流属性;
9. 获取视频帧
9.1 函数简述和原型
可以通过该函数获取VideoCapture中视频流的下一帧。
retval, image = cv2.VideoCapture.read()
9.2 返回值
- retval:布尔类型,返回是否成功获取到视频流中的帧;
- image:帧图像数据,一个ndarray;
9.3 用法举例
# 打开第一个摄像头设备
cap = cv2.VideoCapture(0)
# 根据FPS计算每一帧应该停留的时间
timeElapse = int(math.floor(1000/cap.get(cv2.CAP_PROP_FPS)))
# 创建窗口以备展示视频
cv2.namedWindow('Video Player', cv2.WINDOW_NORMAL)
while True:
ret, frame = cap.read()
if not ret:
print('Cannot Get Frame From Camera')
break
cv2.imshow("Video Player", frame)
if cv2.waitKey(timeElapse) == ord('q'):
break
# 释放资源
cv2.destroyAllWindows()
cap.release()