#读取和播放摄像头import cv2cap = cv2.VideoCapture(0) #生成VideoCapture对象实例,捕获摄像头if not cap.isOpened(): #未能正确捕获摄像头,退出 print("Cannot open camera") exit()while True: #无限循环,读取和播放摄像头 ret, frame = cap.read() #逐帧读取 # 如果正确读取帧,ret为True if not ret: #如果未能正确读取帧,退出 print("Can't receive frame (stream end?). Exiting ...") break # 此处是在帧frame上的操作 # 显示结果帧 cv2.imshow('myvideo', frame) if cv2.waitKey(1) & 0xFF== 27: #按ESC退出,&0xFF确保获得正确的8位ASCII码(低8位) breakcap.release() #完成所有操作后,释放VideoCapture对象cv2.destroyAllWindows() #销毁视频播放窗口
捕获的摄像头视频播放窗口如下:cap.read()返回布尔值(True/ False)如果正确读取了帧,它将为True因此,你可以通过检查此返回值来检查视频的结尾(播放完毕后将返回False)有时,cap可能尚未初始化捕获在这种情况下,此代码显示错误你可以通过cap.isOpened()方法检查它是否已初始化如果是True,那么摄像头或视频文件已打开否则,使用cap.open()打开它你还可以使用cap.get(propId)方法访问该视频的某些功能,其中propId是0到18之间的一个数字每个数字表示视频的属性(如果适用于该视频),并且可以显示完整的详细信息在这里看到:cv::VideoCapture::get()其中一些值可以使用cap.set(propId,value)进行修改value是你想要的新值例如,可以通过cap.get(cv.CAP_PROP_FRAME_WIDTH)和cap.get(cv.CAP_PROP_FRAME_HEIGHT)获取帧的宽度和高度如果想改变分辨率,如修改为320x240只需使用cap.set()方法即可例如:ret = cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)ret = cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240).(2)从文件播放视频它与从相机捕获相同,只是用视频文件名更改摄像机索引另外,在显示帧时,请使用适当的时间cv.waitKey(),以响应键盘事件,如退出、保存帧、保存视频片段等从文件播放视频的代码如下:#读取和播放视频文件import cv2cap = cv2.VideoCapture(r'D:\python_opencv\videos\my_video.mp4')n_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))#获取视频的帧数print('视频文件的帧数量为:',n_frames)fps = cap.get(cv2.CAP_PROP_FPS)print('视频文件的帧率为:',fps)frame_width=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))print(f'视频文件帧的尺寸为:宽度 {frame_width},高度 {frame_height}')while cap.isOpened(): ret, frame = cap.read() # 如果正确读取帧,ret为True if not ret: #如果未能正确读取帧,警告提示,退出 print("Can't receive frame (stream end?). Exiting ...") break #原始视频文件分辨率太高,进行压缩后播放显示 frame = cv2.resize(frame, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)/3), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)/3))) cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == 27: #按ESC退出 breakcap.release()cv2.destroyAllWindows()
输出结果为:视频文件的帧数量为: 910视频文件的帧率为: 29.7378170263708视频文件帧的尺寸为:宽度 1080,高度 1920
播放的视频文件截图为:(3)保存视频帧使用VideoCapture对象捕捉一个视频,一帧一帧地处理要想保存帧为图像文件,非常简单,只需使用 cv2.imwrite()方法即可从视频文件提取一个帧并保存的代码如下:#读取视频文件,保存一帧图像import cv2cap = cv2.VideoCapture(r'D:\python_opencv\videos\my_video.mp4')while cap.isOpened(): ret, frame = cap.read() # 如果正确读取帧,ret为True if not ret: #如果未能正确读取帧,警告提示,退出 print("Can't receive frame (stream end?). Exiting ...") break #原始视频文件分辨率太高,进行压缩后播放显示 frame = cv2.resize(frame, (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)/3), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)/3))) cv2.imshow('frame', frame) if cv2.waitKey(25) & 0xFF == ord('s'): #按s键保存一帧图像 cv2.imwrite('D:/python_opencv/images/captured_image.jpg',frame) if cv2.waitKey(25) & 0xFF == 27: #按ESC退出 breakcap.release()cv2.destroyAllWindows()
当然,可以设置不同的条件,保存多帧图像(4)保存视频想要保存视频,还需要做一些工作保存视频需要首先创建一个VideoWriter对象,指定输出文件名,然后指定 FourCC 代码(详见下一段),然后传递帧率的数量和帧大小最后一个是颜色标志如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作FourCC:http://en.wikipedia.org/wiki/FourCC 是用于指定视频编解码器的4字节代码FourCC全称Four-Character Codes,代表四字符代码 (four character code), 它是一个32位的标示符,是一种独立标示视频数据流格式的四字符代码可用代码列表可在fourcc.org中:http://www.fourcc.org/codecs.php找到它取决于平台保存视频需要遵循编解码器视频播放软件通过查询 FourCC 代码并且寻找与 FourCC 代码相关联的视频解码器来播放特定的视频流比如: XVID=XviD MPEG-4 codec在Fedora中:DIVX,XVID,MJPG,X264,WMV1,WMV2(最好使用XVID,MJPG会生成大尺寸的视频,X264会生成非常小的尺寸的视频)在Windows中:DIVX(尚待测试和添加)在OSX中:MJPG(.mp4),DIVX(.avi),X264(.mkv)FourCC代码作为MJPG的cv2.VideoWriter_fourcc('M','J','P','G')或cv2.VideoWriter_fourcc('MJPG')传递VideoWriter()方法的格式如下:VideoWriter(filename, fourcc, fps, frameSize[, isColor])filename:要保存的文件的全路径名称,包括后缀fourcc:指定编码器fps:要保存的视频的帧率frameSize:要保存的文件的画面尺寸(width, height)isColor:指示是黑白画面还是彩色的画面从摄像机捕获视频并保存的代码如下所示:#读取摄像头,保存一段视频import cv2cap = cv2.VideoCapture(0)# 定义编解码器并创建VideoWriter对象fourcc = cv2.VideoWriter_fourcc('XVID')out = cv2.VideoWriter(r'D:\python_opencv\videos\output_video.mp4', fourcc, 20.0, (640, 480))while cap.isOpened(): ret, frame = cap.read() if not ret: print("Can't receive frame (stream end?). Exiting ...") break #frame = cv2.flip(frame, 0) # 写翻转的框架 out.write(frame) cv2.imshow('frame', frame) if cv2.waitKey(1) & 0xFF == 27: #按ESC退出 break# 完成工作后释放VideoCapture对象,VideoWriter对象,销毁播放窗口cap.release()out.release()cv2.destroyAllWindows()
视频保存后在计算机文件资源管理器的截图为:视频保存完后记得释放VideoWriter对象(图片来源网络,侵删)
0 评论