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)的图像。
- 具体选项可以查看官方文档

- 写:
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原点),字体,字体大小,颜色,字体粗细,(后两个不清楚)
- 字体类型的选项有
- 字体大小是浮点数,原始字体的大小,乘以本参数,就是最终字体大小
- 字体粗细是整数
- 写入中文文本:
- 好像有什么通过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下,字体文件名称可通过
右键+属性
查看,例如 
- 在Linux下,
fc-list :lang=zh
命令中就有显示,例如
- 在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. 展示窗口
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。
- 以查询
cv2.VideoCapture
相关API为例
- 首先,通过关键字查询对应的类,然后选择。

- 然后,查询相关的API,如果有
Python
关键字,说明就有对应的cv2 API。