教你如何用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 时间处理datetime实例
Sep 06 Python
Python实现把回车符\r\n转换成\n
Apr 23 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
Python实现通过继承覆盖方法示例
Jul 02 Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
pytorch获取vgg16-feature层输出的例子
Aug 20 Python
使用 Python 合并多个格式一致的 Excel 文件(推荐)
Dec 09 Python
python如何安装下载后的模块
Jul 03 Python
python/golang实现循环链表的示例代码
Sep 14 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模板原理讲解
2013/11/13 PHP
php多维数组去掉重复值示例分享
2014/03/02 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
php提交post数组参数实例分析
2015/12/17 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
2017/11/17 PHP
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
node.js中的path.extname方法使用说明
2014/12/09 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
2015/09/26 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
布同自制Python函数帮助查询小工具
2011/03/13 Python
python实现爬虫下载漫画示例
2014/02/16 Python
python进阶教程之异常处理
2014/08/30 Python
python中的五种异常处理机制介绍
2014/09/02 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
使用Nginx+uWsgi实现Python的Django框架站点动静分离
2016/03/21 Python
python字符串,数值计算
2016/10/05 Python
Python 备份程序代码实现
2017/03/06 Python
Python单元和文档测试实例详解
2019/04/11 Python
Tensorflow进行多维矩阵的拆分与拼接实例
2020/02/07 Python
python scatter函数用法实例详解
2020/02/11 Python
python 函数中的参数类型
2020/02/11 Python
Python实现自动签到脚本的示例代码
2020/08/19 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
韩都衣舍天猫官方旗舰店:天猫女装销售总冠军
2017/10/10 全球购物
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
PHP面试题附答案
2015/11/28 面试题
会计专业毕业生推荐信
2013/11/05 职场文书
淘宝客服专员岗位职责
2014/04/11 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
详解CSS3浏览器兼容
2022/12/24 HTML / CSS