教程视频OpenCVPython(视频视频文件代码摄像头对象)「python opencv 视频处理」

目标:学习读取视频,显示视频和保存视频
学习从相机捕捉并显示它
你将学习以下功能:cv.VideoCapture(),cv.VideoWriter().(1)从相机中读取视频通常情况下,我们必须用摄像机捕捉实时画面
提供了一个非常简单的界面
让我们从摄像头捕捉一段视频,将其显示出来
要捕获视频,你需要创建一个VideoCapture对象
它的参数可以是设备索引或视频文件的名称
设备索引就是指定哪个摄像头的数字
正常情况下,一个摄像头会被连接,所以简单地传0(或-1)
你可以通过传递1来选择第二个相机,以此类推
在此之后,你可以逐帧捕获
但是在最后,不要忘记释放VideoCapture对象,并销毁播放窗口
读取摄像头,并播放视频的代码如下:#读取和播放摄像头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对象
教程视频OpenCVPython(视频视频文件代码摄像头对象)
(图片来源网络,侵删)

联系我们

在线咨询:点击这里给我发消息