Python进阶(1) cv2
文章目录0. 前言1. 图像操作1.1. 读写1.2. 常用操作2 . 视频操作2.1. 读视频2.2. 写视频3. 展示窗口3.1. 流水账3.2. 应用附录关于如何查询Opencv-Python API0. 前言包含APIcv2.imreadcv2.imwritecv2.resizecv2.cvtColorcv2.VideoCapturecv2.VideoWritercv2.namedWind
·
文章目录
0. 前言
- 包含API
cv2.imreadcv2.imwritecv2.resizecv2.cvtColorcv2.VideoCapturecv2.VideoWritercv2.namedWindowcv2.imshowcv2.waitKeycv2.destroyWindowcv2.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)的图像。
- 例如,原始图像为RGB,输入模式选择
- 具体选项可以查看官方文档

- 得到的是
- 写:
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])
- params 指的是
1.2. 常用操作
- 获取像素点:
- cv2中图像通过
numpy.ndarray表示,shape为(height, width[, channel])。 - 可以直接通过指定下标来获取对应的像素点取值。
- cv2中图像通过
- 设置图像尺寸:
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命令中就有显示,例如
- Windows下,字体文件名称可通过
- 在Linux中安装中文字体
- 第一步:在
/usr/share/fonts下随便建立一个新的文件夹,例如/usr/share/Msyh - 第二步:将Windows下的字体文件导入上面的文件夹中。
- 第三步:在
/usr/share/fonts目录下运行fc-cache -vf,刷新字体缓存。 - 第四步:通过
fc-list :lang=zh验证安装结果。
- 第一步:在
- 在Windows下,字体在
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_QUALITYcv2.VIDEOWRITER_PROP_FRAMEBYTEScv2.VIDEOWRITER_PROP_NSTRIPEScv2.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。
- 以查询
cv2.VideoCapture相关API为例- 首先,通过关键字查询对应的类,然后选择。

- 然后,查询相关的API,如果有
Python关键字,说明就有对应的cv2 API。
- 首先,通过关键字查询对应的类,然后选择。
更多推荐




所有评论(0)