![](https://i-blog.csdnimg.cn/blog_migrate/71d9f5e131a4586f37d9721c0d9291fd.png)
☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython
一、引言
老猿在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的介绍的内容请参考专栏《国产信创之光》的其他文章。
关于老猿的付费专栏
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_9607725.html 使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,对应文章目录为《 https://blog.csdn.net/LaoYuanPython/article/details/107580932 使用PyQt开发图形界面Python应用专栏目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10232926.html moviepy音视频开发专栏 )详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/107574583 moviepy音视频开发专栏文章目录》;
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10581071.html OpenCV-Python初学者疑难问题集》为《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的伴生专栏,是笔者对OpenCV-Python图形图像处理学习中遇到的一些问题个人感悟的整合,相关资料基本上都是老猿反复研究的成果,有助于OpenCV-Python初学者比较深入地理解OpenCV,对应文章目录为《https://blog.csdn.net/LaoYuanPython/article/details/109713407 OpenCV-Python初学者疑难问题集专栏目录 》
- 付费专栏《https://blog.csdn.net/laoyuanpython/category_10762553.html Python爬虫入门 》站在一个互联网前端开发小白的角度介绍爬虫开发应知应会内容,包括爬虫入门的基础知识,以及爬取CSDN文章信息、博主信息、给文章点赞、评论等实战内容。
前两个专栏都适合有一定Python基础但无相关知识的小白读者学习,第三个专栏请大家结合《https://blog.csdn.net/laoyuanpython/category_9979286.html OpenCV-Python图形图像处理 》的学习使用。
对于缺乏Python基础的同仁,可以通过老猿的免费专栏《https://blog.csdn.net/laoyuanpython/category_9831699.html 专栏:Python基础教程目录)从零开始学习Python。
如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。