简单的视频操作
一. 学习目标
- 学会读取视频,播放视频以及保存视频
- 学会读取摄像头并进行显示
- 学习函数:cv.VideoCapture(), cv.VideoWriter()
二. 读取摄像头图像
- 想要从摄像头获取图像,我们首先需要创建一个 VideoCapture 对象,它的参数可以是设备索引或视频文件的路径。设备索引是指定那个摄像机的编号。相机捕获完成之后,我们需要使用 release() 释放设备。
- 下面是一个简单的从摄像头读取图像的代码:
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) # 创建 VideoCapture 对象,设置从摄像头获取图像 if not cap.isOpened(): # 相机打开失败 print("相机打开失败") exit() # 退出程序 while True: # 一帧一帧的捕获,如果正确读取帧,ret 返回 True ret, frame = cap.read() if not ret: # 读取帧出错 print("不能接收帧,退出中 ...") break # 显示图像,循环显示,相当于播放视频 cv.imshow("frame", frame) if cv.waitKey(1) == ord('q'): # 按下 Q 键退出 break cap.release() # 在结尾的时候,一定要释放设备 cv.destroyAllWindows() # 摧毁所有创建的窗口
- cap.isOpened() 判断相机是否初始化成功。如果初始化成功,返回 True 。
- cap.read() 用来获取是否从摄像头获取图像。如果成功获取,返回布尔值 True ,以及读取的图像。
三. 播放视频文件
- 它的步骤与从摄像头读取大体相同,只是将摄像机索引更换为视频路径。
- 在播放视频的时候,应选取适当的 cv.waitKey() 参数。如果参数过小,视频播放速度将会变得很快;参数过大,视频播放速度会变慢。正常情况下,我们一般设置为 25 。
- 下面是一个简单播放视频文件的代码:
import numpy as np import cv2 as cv # 创建 VideoCapture 类 cap = cv.VideoCapture("./test_video/vtest.avi") while cap.isOpened(): # 视频播放完毕,退出循环 ret, frame = cap.read() # 读取视频数据 if not ret: # 读取数据出错 print("视频解析失败,退出中 ...") break cv.imshow("frame", frame) # 显示图片 if cv.waitKey(25) == ord('q'): # 控制播放速度,按 Q 键退出 break cap.release() # 关闭视频 cv.destroyAllWindows() # 摧毁所有创建的窗口
- 注意
确保安装了正确版本的 ffmpeg 或 gstreamer 。有时,使用 Video Capture 失败,主要是由于 ffmpeg / gstreamer 安装错误。
四. 保存视频
- 如果我们想要保存图片,非常简单,仅仅使用 cv.imread() 就可以了。但想要保存视频,就不是那么一件容易的事了。
- 在保存视频的时候,我们需要创建一个 VideoWriter 对象。在创建 VideoWriter 对象时,我们需要传递的参数有:输出文件名,指定的 FourCC 编码,fps(frams per seconde 每秒的帧数),帧大小以及 isColor flag 。如果 isColor 为 Ture ,编码器使用彩色框。
- FourCC 是一个 4 字节的代码,用于指定视频编解码器。在 http://fourcc.org 网站上,你可以找到可用的代码列表。它取决于平台。在保存视频的时候,遵循编解码器,将会起到很好的效果很好。
- 在 Fedora 上:DIVX, XVID, MJPG, X264, WMV1, WMV2
- 在 Windows 上:DIVX
- 在 OSX 上:MJPG (.mp4), DIVX (.avi), X264 (.mkv)
- 对于 MJPG ,FourCC 代码以 cv.VideoWriter_fourcc(‘M’,‘J’,‘P’,‘G’) 或 cv.VideoWriter_fourcc(*‘MJPG’) 的形式传递。
- 接下来,我们就是用一段简单的代码,来演示如何保存视频文件
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) # 打开相机 fourcc = cv.VideoWriter_fourcc(*'DIVX') # 定义编码对象 # 创建 VideoWriter 对象 out = cv.VideoWriter("output.avi", fourcc, 20.0 ,(640, 480)) while cap.isOpened(): ret, frame = cap.read() # 读取帧 if not ret: # 帧的读取结果有误 print("不能接受数据帧。退出中 ...") exit out.write(frame) # 写入帧 cv.imshow("frame", frame) # 显示图像 if cv.waitKey(1) == ord('q'): # 按 Q 退出 break # 工作完成后,释放所有内容 cap.release() out.release() cv.destroyAllWindows() # 摧毁窗口
五. 结语
- 如果其中有不对的地方或是需要改进的地方,请指正。
- 联系方式 email:lwl595ll@163.com 。
- 本文到这就结束了,谢谢大家观看。