教你如何用python操作摄像头以及对视频流的处理


Posted in Python onOctober 12, 2020

实验介绍

此次实验帮助大家利用 OpenCV 去读取摄像头的视频流,你可以直接使用笔记本本身的摄像头,也可以用 USB 连接直接的摄像头。如果你在操作过程中,摄像头读取失败, 实验中还为你提供了几个问题排查步骤。当然,对视频进行操作时还需要讲解视频相关的编解码格式以及特定帧的读取。在实验的最后,还提供了 OpenCV 的项目实战:视频录制与视频读取。

知识点

  • 视频录制
  • 视频编解码格式
  • 视频读取以及特定帧的读取

视频录制

使用 OpenCV 录制视频,主要涉及 OpenCV 的 VideoWrite 对象。录制视频的第一步要实例化一个 VideoCapture 对象,用于从摄像头读入图片。创建一个 VideoCapture 对象的代码如下:

cap = cv2.VideoCapture(0)

类 VideoCapture 的两个常见构造函数:

<VideoCaputrue object> = cv2.VideoCapture(filename)

功能:打开视频文件;

参数filename:视频文件名。

<VideoCaputrue object> = cv2.VideoCapture(index)

功能:打开相机设备;

参数index:相机设备ID,当只有一个相机时,给0即可。

OpenCV 中视频录制需要借助 VideoWriter 对象, 将从 VideoCapture 中读入图片,不断地写入到 VideoWrite 的数据流中。创建 VideoWriter对象的代码如下:

out = cv2.VideoWriter('video_record.avi', codec, fps, frameSize)

此次实验选择笔记本电脑内置的摄像头,从中捕获视频并显示视频流。首先实现捕获一张图片。基本思路是首先打开相机,再判断相机是否打开,相机打开成功后,捕获一帧图像,然后 imshow 显示,最后关闭相机。具体代码如下:

import cv2
cap = cv2.VideoCapture(0)
if cap.isOpened():
 ret,frame = cap.read()
 cv2.imshow('frame',frame)
 cv2.waitKey(3000)
cap.release()
cv2.destroyAllWindows()

相机捕获的一帧图像如图所示:

教你如何用python操作摄像头以及对视频流的处理

视频编解码格式

在写入视频的时候, 我们必须指定视频的编解码格式,这里我们指定为 MJPG 格式。指定视频编解码方式为 MJPG 的代码如下:

codec = cv2.VideoWriter_fourcc(*'MJPG')

在讲解视频的编解码格式之前,我们先来学习一下 FourCC

FourCC 全称 Four-Character Codes ,代表四字符代码 (four character code), 它是一个 32 位的标示符,其实就是 typedef unsigned int FOURCC 。FourCC 是一种独立标示视频数据流格式的四字符代码。

FourCC 支持的所有视频编解码的格式都可以在 FourCC 官网上查阅。

教你如何用python操作摄像头以及对视频流的处理

在指定视频的编解码格式为 MJPG 格式之后,我们还需要指定视频的帧率跟窗口大小。指定写入帧率为 30 以及窗口大小的代码如下:

fps = 30.0
frameSize = (640, 480)

初始化 VideoWriter 的时候,将这些参数传入到其中。并指定输出视频文件的名称。我们将输出视频文件的名称命名为 video.avi ,具体代码如下:

out = cv2.VideoWriter('video.avi', codec, fps, frameSize)

视频录制演示完整代码

接下来,就是要不断的从 VideoCapture 中读入图片,然后写入到VideoWrite 的数据流中。不断的向视频输出流写入帧图像的代码如下:

out.write(frame)

在视频录制结束后,为了节省资源,我们需要释放已经占用的资源,具体代码实现如下:

cap.release()
out.release()

视频录制演示完整代码如下:

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
codec = cv2.VideoWriter_fourcc(*'MJPG')
fps = 20.0
frameSize = (640, 480)
out = cv2.VideoWriter('video.avi', codec, fps, frameSize)
print("按键Q-结束视频录制")
while(cap.isOpened()):
 ret, frame = cap.read()
 if ret==True:
  out.write(frame)
  cv2.imshow('frame',frame)
  if cv2.waitKey(1) == ord('q'):
   break
 else:
  break
cap.release()
out.release()
cv2.destroyAllWindows()

视频读取以及特定帧的读取

视频读取函数介绍及实现

读入视频的时候,我们仍然需要使用 VideoCapture 对象,只不过传入的不再是摄像头的 ID 了,需要改成视频文件的路径。读取视频流的时候可以逐帧读取捕获实现的图像。此时读入视频流的代码如下:

cap = cv2.VideoCapture('video.avi')

OpenCV 提供了接口 VideoWriter 用于视频的保存,具体函数表示如下:

cap = cv2.VideoCapture('video.avi')

函数参数:

  • filename:给要保存的视频起个名字;
  • fourcc:指定视频编解码器的4字节代码;
    • 【(‘P',‘I',‘M',‘1')是MPEG-1编解码器】

    • 【(‘M',‘J',‘P','G ')是一个运动jpeg编解码器】

  • fps:帧率;
  • frameSize:帧大小。

从视频文件中播放视频,更改相机索引与视频文件名。 在显示帧时,选择适当的 cv2.waitKey()时间,如果该值太小,视频会非常快,如果它太大,视频会很慢(这可以用来慢动作显示视频)。 正常情况下,25 毫秒即可。具体视频读取的源代码如下:

import numpy as np
import cv2
cap = cv2.VideoCapture('video.avi')
while(True):
 ret, frame = cap.read()
 if ret:
  cv2.imshow('frame',frame)
 else:
  print("视频读取完毕或者视频路径异常")
  break
 if cv2.waitKey(25) & 0xFF == ord('q'):
  break
cap.release()
cv2.destroyAllWindows()

视频写入完成,命名为 video.avi ,结果展示如下:

教你如何用python操作摄像头以及对视频流的处理

教你如何用python操作摄像头以及对视频流的处理

视频特定帧的读取(通过帧数间隔截取视频帧)

通过视频的帧数间隔截取视频的每一帧,自己设置帧间隔为 20 ,即每隔 20 帧截取一帧图像,并将我们截取的每一帧保存到我们自定义的文件夹中,这里保存的文件夹为代码存在的路径下 capture_image 文件夹里。具体实现的代码如下:

import cv2
cap = cv2.VideoCapture("video.avi")
c = 1
frameRate = 20
while(True):
	ret, frame = cap.read()
	if ret:
		if(c % frameRate == 0):
			print("开始截取视频第:" + str(c) + " 帧")
			cv2.imwrite("./capture_image/" + str(c) + '.jpg', frame)
		c += 1
		cv2.waitKey(0)
	else:
		print("所有帧都已经保存完成")
		break
cap.release()

运行结果如下,将展示我们截取的视频帧数间隔:

教你如何用python操作摄像头以及对视频流的处理

如图为视频截取的最后一帧图像:

教你如何用python操作摄像头以及对视频流的处理

注意:读入视频文件和保存图片的路径,都要使用“\\”,使用“/”或者“\”会出现打开文件报错。

摄像头读取失败-问题排查

如果你运行上文的源代码的时候,出现报错。

你可以按照下面提供的思路自行检查一下。

  • 驱动问题 有的摄像头可能存在驱动问题,需要安装相关驱动,或者查看摄像头是否具有UAC免驱协议。
  • USB接口兼容性问题 USB2.0接口接了一个USB3.0的摄像头,也是不支持的(这只针对用 USB 连接摄像头的,用笔记本自带的摄像头可忽略)。
  • 设备挂载问题 摄像头没有被挂载,如果是虚拟机需要手动勾选设备。
  • 硬件问题 在就是检查一下USB线跟电脑USB接口。
  • 视频压缩格式的问题 部分视频压缩格式在OpenCV中不支持。

实验总结

初学者可能对 OpenCV 处理会很头晕,因为它涉及到的函数有很多,每一个函数会有不同的用法,如果要通过 OpenCV 去调用摄像头完成任务,就需要去学习这些内容。此次实验从视频录取、视频读取再到视频特定帧的读取一步一步带你实现,里面对相关函数也讲解的非常透彻,相关参数也进行了说明,涉及到实践的地方已经帮你把相关的源代码给出,学习不会有障碍。当然,实验最后也给出了摄像头读取失败问题的排查步骤,让你在学习的过程中能够得到满足。

到此这篇关于教你如何用python操作摄像头以及对视频流的处理的文章就介绍到这了,更多相关python操作摄像头及视频流内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中使用lambda高效操作列表的教程
Apr 24 Python
python获取本地计算机名字的方法
Apr 29 Python
详解Python文本操作相关模块
Jun 22 Python
利用python将json数据转换为csv格式的方法
Mar 22 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
Python 字符串与数字输出方法
Jul 16 Python
Selenium定时刷新网页的实现代码
Oct 31 Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 Python
python 解决flask 图片在线浏览或者直接下载的问题
Jan 09 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
Python自定义聚合函数merge与transform区别详解
May 26 Python
python能做哪些生活有趣的事情
Sep 09 Python
Django限制API访问频率常用方法解析
Oct 12 #Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 #Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 #Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
Oct 12 #Python
使用Python将xmind脑图转成excel用例的实现代码(一)
Oct 12 #Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 #Python
Python Sqlalchemy如何实现select for update
Oct 12 #Python
You might like
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP实现获取图片颜色值的方法
2014/07/11 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
php+html5+ajax实现上传图片的方法
2016/05/14 PHP
JQuery 图片延迟加载并等比缩放插件
2009/11/09 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
Google 地图事件实例讲解
2016/08/06 Javascript
基于Phantomjs生成PDF的实现方法
2016/11/07 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
Bootstrap基本组件学习笔记之分页(12)
2016/12/08 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
vue中使用props传值的方法
2019/05/08 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
python 排列组合之itertools
2013/03/20 Python
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
解决DataFrame排序sort的问题
2018/06/07 Python
用Python实现最速下降法求极值的方法
2019/07/10 Python
canvas 阴影和图形变换的示例代码
2018/01/02 HTML / CSS
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
单身旅行者的单身假期:Just You
2018/04/08 全球购物
软件生产职位结构化面试主要考察要素及面试题库
2015/06/12 面试题
大学毕业生最详细的自我评价分享
2013/11/18 职场文书
文明礼貌演讲稿
2014/05/12 职场文书
做一个有道德的人活动方案
2014/08/25 职场文书
五好家庭申报材料
2014/12/20 职场文书
2015年度团总支工作总结
2015/04/23 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
写给消防战士们的一封慰问信
2019/10/07 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
nginx 配置缓存
2022/05/11 Servers
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL