教你如何用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多线程和队列操作实例
Jun 21 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
python 中的int()函数怎么用
Oct 17 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
Python交互环境下实现输入代码
Jun 22 Python
python保存网页图片到本地的方法
Jul 24 Python
解决Pycharm出现的部分快捷键无效问题
Oct 22 Python
python采集微信公众号文章
Dec 20 Python
python取余运算符知识点详解
Jun 27 Python
Python使用字典实现的简单记事本功能示例
Aug 15 Python
实现Python3数组旋转的3种算法实例
Sep 16 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
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
JavaScript在IE中“意外地调用了方法或属性访问”
2008/11/19 Javascript
javascript 得到变量类型的函数
2010/05/19 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
BootStrap3学习笔记(一)之网格系统
2016/05/20 Javascript
livereload工具实现前端可视化开发【推荐】
2016/12/23 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
关于vue-cli3打包代码后白屏的解决方案
2020/09/02 Javascript
python检测服务器是否正常
2014/02/16 Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
在Linux系统上安装Python的Scrapy框架的教程
2015/06/11 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
实例讲解python中的序列化知识点
2018/10/08 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
浅谈PySpark SQL 相关知识介绍
2019/06/14 Python
对Django外键关系的描述
2019/07/26 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
广州一家公司的.NET面试题
2016/06/11 面试题
大学辅导员事迹材料
2014/02/05 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
辞职申请书范本
2019/05/20 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Spring Data JPA框架的核心概念和Repository接口
2022/04/28 Java/Android
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS