【总结】OpenCV-Python常用API(一)—— 基本IO

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章