安装
Windows 系统使用 pip install opencv-contrib-python 直接安装(在此之前需要安装 Numpy>=1.11.3)
- 视频的文件的读写操作:Opencv提供了VideoCapture类和VideoWriter类来支持各种格式的视频文件。支持的格式类型会因系统的不同而变化,但应该都支持AVI格式,下例为读取和存储视频。
import cv2
videoCapture = cv2.VideoCapture('MyInputVid.avi')
fps = videoCapture.get(cv2.CAP_PROP_FPS) # 读取帧数
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('MyOutWriter.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame = videoCapture.read()
while sucess:
videoWriter.write(frame)
success, frame = videoCapture.read()
编解码器:
1. cv2.VideoWriter_fource('I', '4', '2', '0'): 该选项是一个未压缩的 YUV 颜色编码,是4:2:0色度子采样。这种编码有很好的兼容性,但会产生较大文件,文件扩展名为 .avi。
2. cv2.VideoWriter_fource('P', 'I', 'M', '1'): 该选项是 MPEG-1 编码类型, 文件扩展名为 .avi。
3. cv2.VideoWriter_fource('X', 'V', 'I', 'D'): 该选项是 MPEG-4 编码类型, 如果希望得到的视频时平 均大小为平均值,推荐使用此选项,文件扩展名为 .avi。
4. cv2.VideoWriter_fource('T', 'H', 'E', 'O'): 该选项时Ogg Vorbis, 文件扩展名为 .ogv。
5. cv2.VideoWriter_fource('F', 'L', 'V', '1'): 该选项是一个Flash视频, 文件扩展名时 .flv。
- 捕获摄像头的帧
下面介绍如何通过摄像头捕获视频并存储
import cv2
cameraCapture = cv2.VideoCapture(0) # 0是默认笔记本摄像头 ,如果是外接摄像头 从1编号开始
fps = 30 # an assumption
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('MyOutWriter.avi', cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
success, frame = cameraCapture.read()
numFramesRemaining = 10 * fps -1
while success and numFramesRemaining > 0:
videoWriter.write(frame)
success, frame = cameraCapture.read()
numFramesRemaining -=1
cameraCapture.release()
注意:
VideoCapture 类的get() 方法不能返回摄像头帧速率的准确值, 它总是返回 0 。
用 VideoCapture.isOpened 方法做一个判断,是否摄像头打开。
当需要同步一组摄像头时,read方法不再合适, 可用grab() 和 retrive() 方法代替它
success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
frame0 = cameraCapture0.retrieve()
frame1 = cameraCapture1.retrieve()
Opencv 窗口函数
Opencv 的 namedWindow() imshow() 和DestroyWindow()函数允许指定窗口名来创建,显示和销毁(destroy)窗口。此外,任意窗口下都可以通过waitKey()函数来获取键盘出入,通过 setMouseCallback() 函数来获取鼠标输入。以下代码可以实时显示摄像头帧。
import cv2
clicked = False
def onMouse(event, x, y, flags, param):
global clicked
if event == cv2.EVENT_LBUTTONUP:
clicked = True
cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse)
print('Showing camera feed. Click window or press any key to stop')
success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
cv2.imshow('MyWindow', frame)
success, frame = cameraCapture.read()
cv2.destroyWindow('MyWindow')
cameraCapture.release()
waitKey()的参数为等待键盘触发的时间,单位为毫秒,其返回值是-1,(表示没有键被按下)或 ASCII 码,如27表示Esc键。ASCII码列表可以在这里找到。另外,Python提供了一个标准函数ord(), 该函数可以将字符转换为ASCII码。例如, 输入 ord('a')会返回97。
在一些系统中, waitKey()的返回值可能比ASCII码的值更大(在Linux 系统中, 如果Opencv使用GTK作为后端的GUI库,就会出现一个众所周知的bug)。在所有的系统中,可以通过读取返回值的最后一个字节来保证只提取ASCII码,具体代码如下:
keycode = cv2.waitKey(1)
if keycode != -1:
keycode &= 0xFF
Opencv 的窗口函数和waitKey()函数相互依赖。Opencv的窗口只有在调用waitKey()函数时才会更新,waitKey()函数只有在Opencv窗口成为活动窗口时,才能捕获输入信息。
鼠标回调函数setMouseCallback()有五个参数,如前面的示例代码所示。param为可选参数,他是 setMouseCallback()函数的第三个参数,默认情况下,该参数是0。回调函数可以取如下的值,他们分别对应不同的鼠标事件。
- cv2.EVENT_MOUSEMOVE: 该事件对应鼠标移动
- cv2.EVENT_LBUTTONDOWN: 该事件对应鼠标左键按下
- cv2.EVENT_RBUTTONDOWN: 该事件对应鼠标右键按下
- cv2.EVENT_MBUTTONDOWN: 该事件对应鼠标中间键按下
- cv2.EVENT_LBUTTONUP: 该事件对应鼠标左键松开
- cv2.EVENT_RBUTTONUP: 该事件对应鼠标右键松开
- cv2.EVENT_MBUTTONUP: 该事件对应鼠标中间键松开
- cv2.EVENT_LBUTTONDBLCLK: 该事件对应双击鼠标左键
- cv2.EVENT_RBUTTONDBLCLK: 该事件对应双击鼠标右键
- cv2.EVENT_MBUTTONDBLCLK: 该事件对应双击鼠标中间键
鼠标回调的标志参数可能是以下事件的按位组合
- cv2.EVENT_FLAG_LBUTTON: 该事件对应按下鼠标左键
- cv2.EVENT_FLAG_RBUTTON: 该事件对应按下鼠标右键
- cv2.EVENT_FLAG_MBUTTON: 该事件对应按下鼠标中间键
- cv2.EVENT_FLAG_CTRLKEY: 该事件对应按下鼠标Ctrl键
- cv2.EVENT_FLAG_SHIFTKEY: 该事件对应按下鼠标Shift键
- cv2.EVENT_FLAG_ALTKEY: 该事件对应按下鼠标Alt键
IT小白 ,望与大家共同学习