0. 前言

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

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)的图像。
    • 具体选项可以查看官方文档img
  • 写: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 表示差值方法,默认为双线性插值。
  • 颜色空间转换:cv2.cvtColor
  • 画框:

1.3. 写入文本(包括写入中文与英文)

  • 写入英文文本:
    • cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)
    • 参数分别是:图片,文本,文本左下方位置(左上角是0, 0原点),字体,字体大小,颜色,字体粗细,(后两个不清楚)
    • 字体类型的选项有
      • img
    • 字体大小是浮点数,原始字体的大小,乘以本参数,就是最终字体大小
    • 字体粗细是整数
  • 写入中文文本:
    • 好像有什么通过opencv的contrib实现,但我没试过。
    • 网上都建议使用 pillow 实现,这里记录一下。
      • 这种方法有一个问题需要处理:指定字体,后面单独记录下。
      • 下列函数的输入的是一张cv2读取的bgr图片。
def _add_chinese_in_image(img, context, color=(255, 0, 0)):
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = Image.fromarray(np.array(img))

    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype("MSYH.TTF", 20, encoding="utf-8")
    draw.text((0, 0), context, color, font=font)

    img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
    return img
  • 字体相关
    • 在Windows下,字体在 C:\Windows\Fonts,随便选择一个中文字体就可以了。
    • 在Linux下,字体保存在 /usr/share/fonts 下,可以通过 fc-list :lang=zh 查询中文字体。
    • 在指定字体时,需要指定字体文件的名称。
      • Windows下,字体文件名称可通过右键+属性查看,例如 img
      • 在Linux下,fc-list :lang=zh 命令中就有显示,例如img
    • 在Linux中安装中文字体
      • 第一步:在 /usr/share/fonts 下随便建立一个新的文件夹,例如 /usr/share/Msyh
      • 第二步:将Windows下的字体文件导入上面的文件夹中。
      • 第三步:在 /usr/share/fonts 目录下运行 fc-cache -vf,刷新字体缓存。
      • 第四步:通过 fc-list :lang=zh 验证安装结果。

2 . 视频操作

2.1. 读视频

  • 主要就是对 cv2.VideoCapture 的操作。
  • 定义:cv.VideoCapture(index/filename/url[, apiPreference])
    • 第一个参数可以是本机摄像头编号、本地文件名、url数据流。
    • 第二个参数没细看,一般都不用,好像是用来指定后端类别,如ffmpeg。
  • 获取各类属性:cap.get()
    • 常用的如下,更多可以查看官方文档
    • 也有对应的 cap.set() 来改变参数。
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()
  • 使用实例:
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()
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. 应用

  • 创建窗口,显示图片,按键结束,销毁窗口。
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。img
  • 以查询 cv2.VideoCapture 相关API为例
    • 首先,通过关键字查询对应的类,然后选择。img
    • 然后,查询相关的API,如果有Python关键字,说明就有对应的cv2 API。img
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐