Python手册(6) cv2

文章目录

    • 0. 前言
    • 1. 图像操作
      • 1.1. 读写
      • 1.2. 常用操作
    • 2 . 视频操作
      • 2.1. 读视频
      • 2.2. 写视频
    • 3. 展示窗口
      • 3.1. 流水账
      • 3.2. 应用
    • 附录
      • 关于如何查询Opencv-Python API

0. 前言

  • 包含API
    • cv2.imread
    • cv2.imwrite
    • cv2.resize
    • cv2.cvtColor
    • cv2.VideoCapture
    • cv2.VideoWriter
    • cv2.namedWindow
    • cv2.imshow
    • cv2.waitKey
    • cv2.destroyWindow

1. 图像操作

1.1. 读写

  • 读:cv2.imread(filename, mode)
    • 得到的是 numpy.ndarray 对象,数据类型为 np.uint8
    • mode 指的是读取的模式,默认为cv2.IMREAD_COLOR
    • 如果原本图像与指定的mode不同,则会自动转换图像。
      • 例如,原始图像为RGB,输入模式选择 cv2.IMREAD_GRAYSCALE,则得到shape为(h, w)的灰度图。
      • 例如,原始图像是灰度图,输入模式选择 cv2.IMREAD_COLOR,则得到shape为(h, w, 3)的图像。
    • 具体选项可以查看官方文档image_1e8quui4bqj912ch1nsj1brfft223.png-124.6kB
  • 写:cv2.imwrite(filename, img[, params])
    • params 指的是 ImwriteFlags,输入的形式为 [paramId_1, paramValue_1, paramId_2, paramValue_2, ...],具体参数可以查看官方文档。
    • 实例:cv2.imwrite('/path/to/target/image.jpg', img, [cv.IMWRITE_JPEG_QUALIRY, 100])

1.2. 常用操作

  • 获取像素点:
    • cv2中图像通过 numpy.ndarray 表示,shape为 (height, width[, channel])
    • 可以直接通过指定下标来获取对应的像素点取值。
  • 设置图像尺寸:cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
    • 目标尺寸dsize的格式为 (width, height)
      • 注意,与熟悉的 (height, width) 刚好相反
      • 如果为0则表示
    • fx/fy 分别表示x轴(宽度)/y轴(高度)的缩放比例。
      • 若指定了 dsize 则这两个参数无效。
      • 默认为0,不进行额外缩放。
    • interpolation 表示差值方法,默认为双线性插值。
      • 完整版可以查看官方文档
      • image_1e8r210ma1pm85bj1q7712clok62t.png-88.3kB
  • 颜色空间转换:cv2.cvtColor
  • 画框:
  • 写字:

2 . 视频操作

2.1. 读视频

  • 主要就是对 cv2.VideoCapture 的操作。
  • 定义:cv.VideoCapture(index/filename/url[, apiPreference])
    • 第一个参数可以是本机摄像头编号、本地文件名、url数据流。
    • 第二个参数没细看,一般都不用,好像是用来指定后端类别,如ffmpeg。
  • 获取各类属性:cap.get()
    • 常用的如下,更多可以查看官方文档
    • 也有对应的 cap.set() 来改变参数。
1
2
3
4
5
6
cv2.CAP_PROP_POS_FRAMES // 下一次要处理的帧编号,从0开始计数
cv2.CAP_PROP_FRAME_COUNT // 总帧数
cv2.CAP_PROP_FRAME_WIDTH // 宽度
cv2.CAP_PROP_FRAME_HEIGHT // 高度
cv2.CAP_PROP_POS_FRAMES // 当前位置(在第几帧)
cv2.CAP_PROP_FPS // FPS

  • 读取视频:flag, frame = cap.read()
  • 释放资源:cap.release()
  • 使用实例:
1
2
3
4
5
6
7
8
9
10
11
12
cap = cv2.VideoCapture('/path/to/mp4')
// 另一种方法
// cap = cv2.VideoCapture()
// cap.open('/path/to/mp4')

while True:
    flag, frame = cap.read()
    if not flag:
        break
    ...

cap.release()

2.2. 写视频

  • 主要就是对 cv2.VideoWriter的操作。
  • 定义:cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
    • fourcc:指定编码器参数,通过 cv2.VideoWriter_fourcc(*'XVID') 来定义。
      • 下面参考了这里
      • mp4v对应mp4。
      • I420对应avi,未压缩的YUV颜色编码,4:2:0色度子采样,兼容性好,但文件较大。
      • xvid对应avi,MPEG-4编码类型,视频大小为平均值,MPEG4所需要的空间是MPEG1或M-JPEG的1/10,它对运动物体可以保证有良好的清晰度。
      • flv1对应flv,流媒体格式是一种新的视频格式,形成的文件极小、加载速度极快,使得网络观看视频文件成为可能,有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等缺点。
    • fps:指定帧率。
    • frameSize:指定视频尺寸,结构是 (w, h)
  • 获取/设置属性:writer.get/set
    • 主要包括了四个参数:
      • cv2.VIDEOWRITER_PROP_QUALITY
      • cv2.VIDEOWRITER_PROP_FRAMEBYTES
      • cv2.VIDEOWRITER_PROP_NSTRIPES
      • cv2.VIDEOWRITER_PROP_IS_COLOR
    • 具体请查看官方文档
  • 写数据:writer.write(img)
  • 释放资源:writer.release()
1
2
3
4
5
6
7
writer = cv2.VideoWriter('./test.mp4', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, size)
// writer = cv2.VideoWriter('./test.mp4', -1, fps, size)
...
while flag:
    ...
    writer.write(frame)
writer.release()

3. 展示窗口

  • TODO
    • 视频进度条

3.1. 流水账

  • cv2.namedWindow('Example', cv2.WINDOW_AUTOSIZE)
    • 构建窗口。
    • 第一个参数是框的名称,第二个用于尺寸参数。
  • cv2.imshow('Example', img)
    • 在窗口中展示图片。
    • 第一个参数用于选择定义过的 cv::namedWindow,第二个参数是图像对象,即ndarray对象。
  • cv2.waitKey(0)
    • 停留在当前画面的时间。
    • 如果是0,则无限停留;如果是数字,则停留对应的毫秒。
    • 返回值是按下按钮的ASCII码。
  • cv2.destroyWindow('Example')
    • 关闭窗口。
    • 参数是窗口名称。

3.2. 应用

  • 创建窗口,显示图片,按键结束,销毁窗口。
1
2
3
4
cv2.namedWindow('Example', cv2.WINDOW_AUTOSIZE)
cv2.imshow('Example', img)
cv2.waitKey(0)
cv2.destroyWindow('Example')

附录

关于如何查询Opencv-Python API

  • 首先明确,官方并没有给出cv2单独的文档,而是与C++ API放在一起,Python与C++的API相同。

  • 在官网中打开打开 Modules 选项卡,然后在右上方Search中寻找自己需要的API。image_1e8qugcso18ifae1sqmqhv9049.png-251.4kB

  • 以查询 cv2.VideoCapture 相关API为例

    • 首先,通过关键字查询对应的类,然后选择。image_1e8quhqnct7dbg41vf2dhieqlm.png-20.6kB
    • 然后,查询相关的API,如果有Python关键字,说明就有对应的cv2 API。image_1e8qumeio7c315fhmtb15988381j.png-103.1kB