Opencv入门系列十一
主要内容:摄像头(视频)处理
OpenCV提供了cv2.VideoCapture类和cv2.VideoWriter类来支持各种类型的视频文件。常用函数包括初始化、打开、帧捕获、释放、属性设置等,下面对这些函数进行简单的介绍。
1.VideoCapture类
1.1 构造函数
OpenCV为cv2.VideoCapture类提供了构造函数cv2.VideoCapture(),用于打开摄像头并完成摄像头(或者视频)的初始化工作。其语法格式为:
● “摄像头ID号”:摄像头的ID号码。其默认值为-1,表示随机选取一个摄像头。或者是处理视频的路径。
● “捕获对象”:返回值,是cv2.VideoCapture类的对象。
1.2 检测初始化
检测摄像头(视频)是否打开成功的函数cv2.VideoCapture.isOpened()来检查初始化是否成功。其语法格式如下:
● 如果成功,则返回值retval为True。
● 如果不成功,则返回值retval为False。
1.3 打开
打开摄像头(视频)的函数cv2.VideoCapture.open()打开摄像头,其语法格式如下:
● index:摄像头ID号。
● retval:返回值,当摄像头(或者视频文件)被成功打开时,返回值为True。
1.4 获取帧
获取摄像头帧的函数cv2.VideoCapture.read(),其语法格式如下:
● image;返回的捕获到的帧,如果没有帧被捕获,则该值为空。
● retval:如果成功则该值为True,不成功则为False。
1.5 释放
释放摄像头对象的函数cv2.VideoCapture.release(),其语法格式如下:
例如:cap.release()。 cap是一个cv2.VideoCapture对象。
1.6 属性
获取摄像头对象属性的函数cv2.VideoCapture.get(),其语法格式如下:
例如,有一个cv2.VideoCapture类对象cap,
则:
● 通过cap.get(cv2.CAP_PROP_FRAME_WIDTH),就能获取当前帧对象的宽度。
● 通过cap.get(cv2.CAP_PROP_FRAME_HEIGHT),就能获取当前帧对象的高度。
设置摄像头对象属性的函数cv2.VedeoCapture.set(),其语法格式如下:
有一个cv2.VideoCapture类对象cap,
则:
● 语句cap=cvc.set(cv2.CAP_PROP_FRAME_WIDTH, 640)将当前帧对象的宽度设置为640像素。
● 语句cap=cvc.set(cv2.CAP_PROP_FRAME_HEIGHT,480)将当前帧对象的高度设置为480像素。
可操作属性如下:
1.7 获取打码帧和解码
函数cv2.VideoCapture.grab()用来指向下一帧,其语法格式是:
成功指向下一帧,则返回值retval为True。
函数cv2.VideoCapture.retrieve()用来解码,并返回函数v2.VideoCapture.grab()捕获的视频帧。其语法格式是:
● image:返回的视频帧,如果未成功,则返回一个空图像。
● retval:布尔型值,若未成功,返回False;否则,返回True。
cv2.VideoCapture.read()函数只能读取一个视频对象,它包括了grab和retrieve两个操作。
cv2.VideoCapture.grab()和cv2VideoCapture.retrieve()函数可以用于同步一组或一个多头(multihead)摄像头读取多个视频对象。
import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened():
flag , img = cap.read()
if flag:
cv2.imshow("img", img)
c = cv2.waitKey(25)
if c == 27: #按下ESC关闭
break
上面是一个简单使用电脑自带摄像头的一个案例。
2.VideoWriter类
2.1 构造函数
cv2.VideoWriter()是创建cv2.VideoWriter对象的构造函数,其语法如下:
● filename:输出目标视频的存放路径和文件名。如果指定的文件名已经存在,则会覆盖这个文件。
● fourcc:视频编/解码类型(格式)。在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式。cv2.VideoWriter_fourcc()有4个字符参数。这4个字符参数构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。下面列出几个常用的标记。当参数fourcc为“-1”,则程序运行时会弹出一个对话框,用户可以自行选择。
● cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’)表示未压缩的YUV颜色编码格式,文件扩展名为.avi。
● cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’)表示MPEG-1编码类型,扩展名为.avi。
● cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’)表示MPEG-4编码类型。扩展名为.avi。
● cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’)表示OggVorbis编码类型,扩展名为.ogv。
● cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘I’)表示Flash视频,扩展名为.flv。
另外还有很多类型,见http://www.fourcc.org
● fps:帧速率。
● frameSize:每一帧的长和宽。
● isColor:是否为彩色图像。
2.2 写入
cv2.VideoWriter类中的函数cv2.VideoWriter.write()用于写入下一帧视频。其语法格式为:
● image:cv2.VideoWriter对象要写入的视频帧
假如有一个cv2.VideoWriter()构造函数创建的对象vw和一个视频帧img:
那么就可以使用,vw.writer(img) 安装vw对象的配置写入对应的文件中。
2.3 释放
cv2.VideoWriter类对象时,需要将其释放。释放该类对象时所使用的是函数cv2.VideoWriter.release()。其语法格式是:
假如有一个cv2.VideoWriter()构造函数创建的对象vw:
那么就可以使用,vw.release()释放vw对象。
3 对视频进行边缘检测
import cv2
cap = cv2.VideoCapture(0)
fource1 = cv2.VideoWriter_fourcc('F', 'L', 'V', 'I')
writer = cv2.VideoWriter("vi.flv",fource1,10,(640,480),True)
while cap.isOpened():
flag , img = cap.read()
if flag:
img2 = cv2.Canny(img,50,200)
cv2.imshow("img2", img2)
if writer.isOpened():
writer.write(img2)
c = cv2.waitKey(25)
if c == 27: #按下ESC关闭
break