打开摄像头
要使用摄像头,需要使用cv2.VideoCapture(0)
创建VideoCapture对象,参数0指的是摄像头的编号,如果你电脑上有两个摄像头的话,访问第2个摄像头就可以传入1,依此类推。
capture.read 函数返回的第1个参数ret(return value缩写)是一个布尔值,表示当前这一帧是否获取正确
cv2.cvtColor 用来转换颜色,这里将彩色图转成灰度图
cap.get(propId) 、cap.set(propId,value) 通过cap.get(propId)
可以获取摄像头的一些属性,比如捕获的分辨率,亮度和对比度等。propId是从0~18的数字,代表不同的属性,完整的属性列表可以参考:VideoCaptureProperties 。也可以使用cap.set(propId,value)
来修改属性值
经验之谈:某些摄像头设定分辨率等参数时会无效,因为它有固定的分辨率大小支持,一般可在摄像头的资料页中找到。
播放本地视频
跟打开摄像头一样,如果把摄像头的编号换成视频的路径就可以播放本地视频了。回想一下cv2.waitKey()
,它的参数表示暂停时间,所以这个值越大,视频播放速度越慢,反之,播放速度越快,通常设置为25或30。
1 2 3 4 5 6 7 8 9 10 capture = cv2.VideoCapture('demo_video.mp4' ) while (capture.isOpened()): ret, frame = capture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) cv2.imshow('frame' , gray) if cv2.waitKey(30 ) == ord('q' ): break
录制视频
之前我们保存图片用的是cv2.imwrite()
,要保存视频,我们需要创建一个VideoWriter
的对象,需要给它传入四个参数:
输出的文件名,如’output.avi’
编码方式FourCC 码
帧率FPS
要保存的分辨率大小
FourCC是用来指定视频编码方式的四字节码,所有的编码可参考Video Codecs 。如MJPG编码可以这样写: cv2.VideoWriter_fourcc(*'MJPG')
或cv2.VideoWriter_fourcc('M','J','P','G')
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 capture = cv2.VideoCapture(0 ) fourcc = cv2.VideoWriter_fourcc(*'MJPG' ) outfile = cv2.VideoWriter('output.avi' , fourcc, 25. , (640 , 480 )) while (capture.isOpened()): ret, frame = capture.read() if ret: outfile.write(frame) cv2.imshow('frame' , frame) if cv2.waitKey(1 ) == ord('q' ): break else : break
OpenCV VideoCapture.get()参数中文详解,不太准确供参考
练习
实现一个可以拖动滑块播放视频的功能。(提示:需要用到 cv2.CAP_PROP_FRAME_COUNT
和cv2.CAP_PROP_POS_FRAMES
两个属性)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import cv2def changetime (x) : return capture.set(cv2.CAP_PROP_POS_FRAMES, x) capture = cv2.VideoCapture('demo_video.mp4' ) frame_count = capture.get(cv2.CAP_PROP_FRAME_COUNT) cv2.namedWindow('video' ) cv2.createTrackbar('video' , 'video' , 0 , int(frame_count), changetime) height = capture.get(cv2.CAP_PROP_FRAME_HEIGHT) width = capture.get(cv2.CAP_PROP_FRAME_WIDTH) print(capture.set(cv2.CAP_PROP_FRAME_HEIGHT, height * 2 )) print(capture.set(cv2.CAP_PROP_FRAME_WIDTH, width * 2 )) while (capture.isOpened()): ret, frame = capture.read() if ret == True : cv2.setTrackbarPos('video' ,'video' ,int(capture.get(cv2.CAP_PROP_POS_FRAMES))) cv2.imshow('video' , frame) if cv2.waitKey(30 ) == ord('q' ): break else : break