老猿在CSDN的《opencv-python图形图像处理入门基础知识》介绍了一个利用电脑摄像头获取输入视频生成到文件的案例,这个案例当时基于windows的。在《统信UOS Linux下安装opencv-python过程详解》介绍的在统信UOS Linux操作系统下安装opencv-python的步骤,在安装opencv-python完成后想复用该案例作为测试,但测试过程并不一帆风顺。
首次修改是在《opencv-python图形图像处理入门基础知识》基础上将windows路径改为了linux路径,直接执行报错摄像头打开失败:
经仔细走读代码,发现是如下语句传参存在问题:
cap = cv2.VideoCapture(0,cv2.CAP_DSHOW)
这个代码多传了一个参数,原来windows下可能有容错性,但Linux下不行,将后一个参数去除即可。
在修改上面的代码之后,再执行python ./captureVideo.py
程序,摄像窗口正常显示,退出后文件正常生成,但无法进行播放。
多次测试之后,发现视频帧大小必须设置为打开窗口大小完全一致才能播放保存的视频文件,用如下代码对视频的帧宽度和高度赋值才行(用与视频窗口大小相同的固定值也可以):
WIDTH = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
HEIGHT = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
这样保存的文件就能正常播放了,可见opencv-python的windows版本和Linux版本的处理上还是有所不同的,Linux下对参数要求更严格。
最后完整的代码如下:
import cv2
def captureVideoFromCamera():
cap = cv2.VideoCapture(0)
WIDTH = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
HEIGHT = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"视频分辨率:({WIDTH},{HEIGHT})")
FILENAME = r'/data/home/administrator/temp/test.avi'
FPS = 24
cap.set(cv2.CAP_PROP_FPS, FPS)
# 建议使用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()
本文介绍了在统信UOS Linux下用opencv-python捕获摄像头输入保存到视频文件的实现代码与windows的差别,opencv-python的windows版本和Linux版本的处理上还是有所不同的,windows下的容错性高一些,Linux下对参数要求更严格,因此相同的代码Linux下要更注意细节。
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
更多关于统信操作系统及opencv的介绍的内容请参考专栏《国产信创之光》的其他文章。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。