教你如何用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调用C/C++动态链接库的方法详解
Jul 22 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
Python 读取某个目录下所有的文件实例
Jun 23 Python
详解Django中间件执行顺序
Jul 16 Python
利用Python将数值型特征进行离散化操作的方法
Nov 06 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
Python可变对象与不可变对象原理解析
Feb 25 Python
Python定时器线程池原理详解
Feb 26 Python
django 取消csrf限制的实例
Mar 13 Python
python代码区分大小写吗
Jun 17 Python
python爬取音频下载的示例代码
Oct 19 Python
pytorch 一行代码查看网络参数总量的实现
May 12 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
编译问题
2006/10/09 PHP
php 上传功能实例代码
2010/04/13 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
PHP 计算两个时间段之间交集的天数示例
2019/10/24 PHP
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
基于jQuery+Cookie实现的防止刷新的在线考试倒计时
2015/06/19 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
javascript自执行函数
2017/02/10 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
[49:56]VG vs Optic 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:03:33]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python实现udp数据报传输的方法
2014/09/26 Python
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
python数据分析:关键字提取方式
2020/02/24 Python
Python并发concurrent.futures和asyncio实例
2020/05/04 Python
django 解决自定义序列化返回处理数据为null的问题
2020/05/20 Python
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
瑞典的玛丽小姐:Miss Mary of Sweden
2019/02/13 全球购物
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
英语专业学生个人求职信
2014/01/28 职场文书
人力资源部经理的岗位职责
2014/03/04 职场文书
爱心活动计划书
2014/04/26 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
2014年城管工作总结
2014/11/20 职场文书
个性与发展自我评价
2015/03/06 职场文书
体育委员竞选稿
2015/11/21 职场文书
创业计划书之旅游网站
2019/09/06 职场文书