☞ ░ 老猿Python博文目录:https://blog.csdn.net/LaoYuanPython ░
用Python通过摄像头进行视频录制
一、引言
要实现摄像头录播摄像信息,通过Python有很多种实现方式,老猿在此介绍的是OpenCV-Python的实现方式。
很多人都知道OpenCV是个图像处理软件,但其实OpenCV也是可以处理视频的,因为视频是一帧帧图像构成的,OpenCV通过VideoCapture类可以实现视频文件或摄像头信息读取,通过VideoWriter可以写入视频。
二、VideoCapture读取视频
VideoCapture既支持从视频文件(.avi , .mpg格式)读取,也支持直接从摄像机(比如电脑自带摄像头)中读取。VideoCapture是一个类,要想获取视频需要先创建一个VideoCapture对象,VideoCapture对象的创建方式有以下三种:
- VideoCapture(deviceIndex,apiPreference = CAP_ANY):打开摄像头捕获视频。deviceIndex为摄像头序列号,打开缺省摄像头传0,apiPreference 为VideoCapture API后端标识符,老猿没有仔细研究,用缺省值即可
- VideoCapture(filename,apiPreference = CAP_ANY):打开filename指定的视频文件
- VideoCapture():创建一个对象,但没有确认捕获数据来源,需要通过VideoCapture其他方法来确认捕获数据来源
更多VideoCapture的内容请参考《opencv学习—VideoCapture 类基础知识》。
三、VideoWriter写入视频
VideoWriter是个视频写入类,用于将一帧帧图像写入视频文件中。VideoWriter共有五个构造方法,在本文重点推荐如下构造方法:
VideoWriter(filename, fourcc, fps, frameSize, bool isColor = True)
相关参数分别为视频文件名、视频编码格式、帧率、视频帧大小、是否彩色。
视频编码格式参数fourcc相关取值及含义主要有如下:
CV_FOURCC('I','4','2','0') :未压缩的YUV编码,4:2:0色度子采样。这种编码广泛兼容,但会产生大文件。文件扩展名应为.avi
CV_FOURCC('P','I','M','1') :MPEG-1编码。文件扩展名应为.avi。
CV_FOURCC('X','V','I','D') :相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。文件扩展名应为.avi。
CV_FOURCC('M','P','4','V') :另一个相对较旧的MPEG-4编码。如果要限制结果视频的大小,这是一个很好的选择。文件扩展名应为.mp4
CV_FOURCC('X','2','6','4'): 一种比较新的MPEG-4编码方式。如果你想限制结果视频的大小,这可能是最好的选择。文件扩展名应为.mp4
CV_FOURCC('F','L','V','1') :此选项为Flash视频。文件扩展名应为.flv
以上表达方式结合Python函数的参数分解功能,可以将4个字母用分配参数(调用函数传递实参时使用星号来传递多个参数,相关介绍请参考《python基础教程 https://blog.csdn.net/laoyuanpython/category_9831699.html》的《 第5.3节 详说Python风格的函数分配参数 https://blog.csdn.net/LaoYuanPython/article/details/90670154》)的形参方式表示,如:CV_FOURCC('X','V','I','D')
可以写成CV_FOURCC(*'XVID')
四、捕获摄像头输入写入视频文件的代码案例
下面的代码打开缺省摄像头捕获视频,并将捕获内容显示为窗口视频,并写入视频文件中保存,按q终止退出:
import cv2
def captureVideoFromCamera():
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
WIDTH = 1920
HEIGHT = 1920
FILENAME = r'f:\video\myvideo.avi'
FPS = 24
cap.set(cv2.CAP_PROP_FPS, 24)
# 建议使用XVID编码,图像质量和文件大小比较都兼顾的方案
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(FILENAME, fourcc=fourcc, fps=FPS,frameSize=(WIDTH,HEIGHT))
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.flip(frame, 1) # 水平翻转
ret = out.write(frame)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 显示结果帧e
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'): break
# 完成所有操作后,释放捕获器
out.release()
cap.release()
cv2.destroyAllWindows()
captureVideoFromCamera()
五、小结
本文介绍了使用OpenCV-Python操作视频的方案,介绍了视频读取和写入类的构造方法,并提供了一个读取摄像头视频写入视频文件的方法,有助于大家理解OpenCV-Python的视频操作相关方法。但需要强调的是,OpenCV是一个强大的计算机图像处理库,而不是视频流编码器或者解码器,它的长项不在于此,只是提供了这种能力而已,如果要针对多媒体文件做复杂的处理,推荐的还是 FFMEPG 或Moviepy库。
各位大神,你用程序实现过视频录播吗?有什么更简单的方法吗?另外说OpenCV这种方式生成的视频文件限制文件大小为2G,老猿没有验证过,不知是否有大神愿意指教。
写博不易,如果觉得本文还有点作用,大家能否帮忙集齐10个赞、10条评论?
更多图像处理的介绍请参考专栏《OpenCV-Python图形图像处理 https://blog.csdn.net/laoyuanpython/category_9979286.html》和《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》相关文章。
老猿Python, 跟老猿学Python!
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░
转载:https://blog.csdn.net/LaoYuanPython/article/details/115716366