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

实验介绍

此次实验帮助大家利用 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()

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

视频编解码格式

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

codec = cv2.VideoWriter_fourcc(*'MJPG')

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

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

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

在指定视频的编解码格式为 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 ,结果展示如下:

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

通过视频的帧数间隔截取视频的每一帧,自己设置帧间隔为 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()

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

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

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

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

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

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

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

实验总结

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

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

时间: 2020-10-12

python3将视频流保存为本地视频文件

使用python3+opencv3.3.1环境将视频流保存为本地视频文件,具体内容如下 1.利用opencv中的VideoCapture类获取视频流的链接,通过cv2的方法得到该视频流的帧数和每帧大小. 2.使用VideoWriter类进行视频编码 3.通过VideoCapture的read()方法进行视频流解码成每一帧 4.获取到每一帧frame,我们就可以对该帧做图像算法(例如识别.图像加强.灰度变换等) import cv2 from matplotlib import pyplot as

python实现实时视频流播放代码实例

这篇文章主要介绍了python实现实时视频流播放代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 @action(methods=['GET'], detail=True) def video(self, request, pk=None): """ 获取设备实时视频流 :param request: :param pk: :return: """ device_obj = self.ge

python读取视频流提取视频帧的两种方法

本文实例为大家分享了python读取视频流提取视频帧的具体代码,供大家参考,具体内容如下 方法一:通过imageio库和skimage库 1. 安装环境: pip install imageio pip install skimage 这时候会报错Please install the `scikit-image` package (instead of `skimage`) 所以按照提示操作即可: pip install scikit-image 环境安装成功. 2.通过python安装ffmp

python处理RSTP视频流过程解析

这篇文章主要介绍了python处理RSTP视频流过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python链接海康摄像头,并以弹出框的方式播放实时视频流, 这种方式是以弹出框的形式播放.本地测试可以,实际业务场景不建议使用.可以采用rtsp转rtmp的方式 @shared_task def parse_video(rtsp_address=None): winname = 'Video' if not rtsp_address: ra

python操作摄像头截图实现远程监控的例子

最近用python写了一个远程监控的程序,主要功能有:1.用邮件控制所以功能2.可以对屏幕截图,屏幕截图发送到邮箱3.可以用摄像头获取图片,这些图片上传到七牛4.开机自启动 复制代码 代码如下: ##coding by loster#import win32apiimport win32conimport platformimport socketimport timeimport osimport smtplibimport poplibfrom VideoCapture import Dev

python 实现视频流下载保存MP4的方法

如下所示: # -*- coding:utf-8 -*- import sys import os from glob import glob import requests reload(sys) sys.setdefaultencoding("utf-8") file_path=os.getcwd() #获取需要转换的路径 def get_user_path(argv_dir): if os.path.isdir(argv_dir): return argv_dir elif os

python 3.3 下载固定链接文件并保存的方法

python 3.3 下载固定链接文件并保存. import urllib.request print ("downloading with urllib") url = 'http://www.wzsky.net/img2013/uploadimg/20130906/1216294.jpg' f = urllib.request.urlopen(url) data = f.read() with open("d:/color/1216294.jpg", "

python实现批量下载新浪博客的方法

本文实例讲述了python实现批量下载新浪博客的方法.分享给大家供大家参考.具体实现方法如下: # coding=utf-8 import urllib2 import sys, os import re import string from BeautifulSoup import BeautifulSoup def encode(s): return s.decode('utf-8').encode(sys.stdout.encoding, 'ignore') def getHTML(url

python动态视频下载器的实现方法

这里向大家分享一下python爬虫的一些应用,主要是用爬虫配合简单的GUI界面实现视频,音乐和小说的下载器.今天就先介绍如何实现一个动态视频下载器. 爬取电影天堂视频 首先介绍的是python爬取电影天堂网站的视频(包括电影,电视剧,综艺等),主要是用selenium动态网页技术加上简单的爬虫技术. (1)电影网站首页面地址:https://www.dytt8.net/ (2)用到的技术:selenium模拟浏览器运行. (3)首先要安装配置selenium库和不同浏览器和该库配合的插件.这里安

python实现去除下载电影和电视剧文件名中的多余字符的方法

本文实例讲述了python实现去除下载电影和电视剧文件名中的多余字符的方法,是一个非常实用的技巧,分享给大家供大家参考.具体如下: 有时候我们讨厌下载电影和电视剧文件名中的多余字符(如网址和广告字样),搞得文件名好长!不便于查看,这时候就可以使用下面的Python代码,自行修改即可. 具体实现代码如下: #!\usr\bin\env python # -*- coding: utf-8 -*- # Author: 吴徐平 # FileName: RefineFileName.py # Funct

Python实现批量下载图片的方法

本文实例讲述了Python实现批量下载图片的方法.分享给大家供大家参考.具体实现方法如下: #!/usr/bin/env python #-*-coding:utf-8-*-' #Filename:download_file.py import os,sys import re import urllib import urllib2 base_url = 'xxx' array_url = list() pic_url = list() inner_url = list() def get_a

php获取远程图片并下载保存到本地的方法分析

本文实例讲述了php获取远程图片并下载保存到本地的方法.分享给大家供大家参考,具体如下: 远程图片指的是远端服务器上的数据我们可以通过php的许多函数来读取下载了,这里整理了两个可以自动下载远程图片并下载保存到本地的例子. 例1,可以自动识别图片类型然后进行对应的保存 /* *功能:php完美实现下载远程图片保存到本地 *参数:文件url,保存文件目录,保存文件名称,使用的下载方式 *当保存文件名称为空时则使用远程文件原来的名称 */ function getImage($url,$save_d

Python多线程结合队列下载百度音乐的方法

本文实例讲述了Python多线程结合队列下载百度音乐的方法.分享给大家供大家参考.具体如下: 一直想做个下载音乐的脚本,后来决定就拿百度音乐开刀,经过多次分析,终于制作了一个下载百度音乐的脚本,目前只默认下载第一页,童鞋们可以自由拓展. 适用Windows和Linux平台.依赖BeautifulSoup这个库,主要对HTML进行解析 #!/usr/bin/python # -*- coding: utf-8 -*- ''' 百度中批量下载某歌手的歌(目前只下载第一页,可以自行拓展) @autho

Python爬取APP下载链接的实现方法

首先是准备工作 Python 2.7.11:下载python Pycharm:下载Pycharm 其中python2和python3目前同步发行,我这里使用的是python2作为环境.Pycharm是一款比较高效的Python IDE,但是需要付费. 实现的基本思路 首先我们的目标网站:安卓市场 点击[应用],进入我们的关键页面: 跳转到应用界面后我们需要关注三个地方,下图红色方框标出: 首先关注地址栏的URL,再关注免费下载按钮,然后关注底端的翻页选项.点击"免费下载"按钮就会立即下