opencv 视频处理(python)

简介: opencv 视频处理(python)

视频处理

视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。

获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1秒内所出现的帧数,对应的英文是FPS(Frames Per Second)。

如果从视频中提取出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。

OpenCV提供了cv2.VideoCapture类和cv2.VideoWriter类来支持各种类型的视频文件。

在不同的操作系统中,它们支持的文件类型可能有所不同,但是在各种操作系统中均支持AVI格式的视频文件。

VideoCapture类

cv2.VideoCapture类处理视频的方式非常简单、快捷,而且它既能处理视频文件又能处理摄像头信息。

类函数介绍

cv2.VideoCapture类的常用函数包括初始化、打开、帧捕获、释放、属性设置等

  1. 初始化OpenCV为cv2.VideoCapture类提供了构造函数cv2.VideoCapture(),用于打开摄像头并完成摄像头的初始化工作。该函数的语法格式为:
捕获对象=cv2.VideoCapture("摄像头ID号")
  • “摄像头ID号”就是摄像头的ID号码。需要注意的是,这个参数是摄像设备(摄像头)的ID编号,而不是文件名。其默认值为-1,表示随机选取一个摄像头;如果有多个摄像头,则用数字“0”表示第1个摄像头,用数字“1”表示第2个摄像头,以此类推。
    如果只有一个摄像头,既可以使用“0”,也可以使用“-1”作为摄像头ID号。

在某些平台上,如果该参数值为“-1”, OpenCV会弹出一个窗口,让用户手动选择希望使用的摄像头。

  • “捕获对象”为返回值,是cv2.VideoCapture类的对象。
  1. 要初始化当前的摄像头,可以使用语句:
cap = cv2.VideoCapture(0)
  1. 特别强调:视频处理完以后,要记得释放摄像头对象。
    该(构造)函数也能够用于初始化视频文件,初始化视频文件时,参数为文件名。
    此时函数的形式为:
捕获对象=cv2.VideoCapture("文件名")
  1. 例如,打开当前目录下文件名为“vtest.avi”的视频文件,可以使用语句:
cap = cv2.VideoCapture('vtest.avi')
  1. cv2.VideoCapture.open()函数和cv2.VideoCapture.isOpened()函数一般情况下,使用cv2.VideoCapture()函数即可完成摄像头的初始化。有时,为了防止初始化发生错误,可以使用函数cv2.VideoCapture.isOpened()来检查初始化是否成功。该函数的语法格式为:
retval = cv2.VideoCapture.isOpened()
  1. 该函数会判断当前的摄像头是否初始化成功
  • 如果成功,则返回值retval为True
  • 如果不成功,则返回值retval为False
  1. 如果摄像头初始化失败,可以使用函数cv2.VideoCapture.open()打开摄像头。
    该函数的语法格式为:
retval = cv2.VideoCapture.open( index )
  • index为摄像头ID号。
  • retval为返回值,当摄像头(或者视频文件)被成功打开时,返回值为True
  1. 同样,函数cv2.VideoCapture.isOpened()和函数cv2.VideoCapture.open()也能用于处理视频文件。在处理视频文件时,函数cv2.VideoCapture.open()的参数为文件名, 其语法格式为:
retval = cv2.VideoCapture.open( filename )
  1. 捕获帧摄像头初始化成功后,就可以从摄像头中捕获帧信息了。捕获帧所使用的是函数cv2.VideoCapture.read()。该函数的语法是:
retval, image=cv2.VideoCapture.read()
  • image是返回的捕获到的帧,如果没有帧被捕获,则该值为空。
  • retval表示捕获是否成功,如果成功则该值为True,不成功则为False
  1. 释放
    在不需要摄像头时,要关闭摄像头。关闭摄像头使用的是函数cv2.VideoCapture.release()。
    该函数的语法是:
None=cv2.VideoCapture.release()
  1. 例如,当前有一个VideoCapture类的对象cap,要将其释放,可以使用语句:
cap.release()
  1. 属性设置需要获取cv2.VideoCapture类对象的属性,或是更改该类对象的属性。函数cv2.VideoCapture.get()用于获取cv2.VideoCapture类对象的属性,该函数的语法格式是:
retval = cv2.VideoCapture.get( propId )
  1. 式中,参数propId对应着cv2.VideoCapture类对象的属性例如,有一个cv2.VideoCapture类对象cvc,则:
  • 通过cvc.get(cv2.CAP_PROP_FRAME_WIDTH),就能获取当前帧对象的宽度。
  • 通过cvc.get(cv2.CAP_PROP_FRAME_HEIGHT),就能获取当前帧对象的高度。
  1. 函数cv2.VideoCapture.set()用来设置cv2.VideoCapture类对象的属性。
    该函数的语法是:
retval = cv2.VideoCapture.set( propId, value )
  1. 式中,propId对应cv2.VideoCapture类对象的属性,value对应属性propid的值。
    例如,有一个cv2.VideoCapture类对象cvc,则:
  • 语句ret=cvc.set(cv2.CAP_PROP_FRAME_WIDTH, 640)将当前帧对象的宽度设置为640像素。
  • 语句ret=cvc.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)将当前帧对象的高度设置为480像素。
  1. 属性值及含义


  2. cv2.VideoCapture.grab()函数和cv2.VideoCapture.retrieve()函数

同步多个摄像头

  1. 如果需要读取一个摄像头的视频数据,最简便的方法就是使用函数cv2.VideoCapture.read()。但是,如果需要同步一组或一个多头(multihead)摄像头(例如立体摄像头或Kinect)的视频数据时,该函数就无法胜任了。可以把函数cv2.VideoCapture.read()理解为是由函数cv2.VideoCapture.grab()和函数cv2.VideoCapture.retrieve()组成的。函数cv2.VideoCapture.grab()用来指向下一帧,函数cv2.VideoCapture.retrieve()用来解码并返回一帧。因此,可以使用函数cv2.VideoCapture.grab()和函数cv2.VideoCapture.retrieve()获取多个摄像头的数据。函数cv2.VideoCapture.grab()用来指向下一帧,其语法格式是:
retval= cv2.VideoCapture.grab( )
  1. 如果该函数成功指向下一帧,则返回值retval为True。函数cv2.VideoCapture.retrieve()用来解码,并返回函数v2.VideoCapture.grab()捕获的视频帧。该函数的语法格式为:
retval, image = cv2.VideoCapture.retrieve( )
  • image为返回的视频帧,如果未成功,则返回一个空图像。
  • retval为布尔型值,若未成功,返回False;否则,返回True。
  1. 对于一组摄像头,可以使用如下代码捕获不同摄像头的视频帧:
success0 = cameraCapture0.grab() 
success1 = cameraCapture1.grab() 
if success0 and success1: 
  frame0 = cameraCapture0.retrieve() 
  frame1 = cameraCapture1.retrieve()
  1. 与VideoCapture类内的其他函数一样,cv2.VideoCapture.grab()和cv2.VideoCapture.retrieve()也能用来读取视频文件。
捕获摄像头视频

使用cv2.VideoCapture类捕获摄像头视频。

根据题目要求,编写代码如下:

import numpy as np 
import cv2 
cap = cv2.VideoCapture(0) 
while(cap.isOpened()): 
  ret, frame = cap.read() 
  cv2.imshow('frame', frame) 
  c = cv2.waitKey(1) 
  if c==27:   #ESC键 
    break 
cap.release() 
cv2.destroyAllWindows()
播放视频文件

播放视频文件时,需要将函数cv2.VideoCapture()的参数值设置为视频文件的名称。在播放视频时,可以通过设置函数cv2.waitKey()中的参数值,来设置播放视频时每一帧的持续(停留)时间。

如果函数cv2.waitKey()中的参数值:

  • 较小,则说明每一帧停留的时间较短,视频播放速度会较快。
  • 较大,则说明每一帧停留的时间较长,视频播放速度会较慢。

该参数的单位是ms,通常情况下,将这个参数的值设置为25即可。( 1000 / 25 = 40)

**例子:**使用cv2.VideoCapture类播放视频文件

import numpy as np 
import cv2 
cap = cv2.VideoCapture('viptrain.avi') 
while(cap.isOpened()): 
  ret, frame = cap.read() 
  cv2.imshow('frame', frame) 
  c = cv2.waitKey(25) 
  if c==27:   #ESC键 
    break 
cap.release() 
cv2.destroyAllWindows()
VideoWriter类

OpenCV中的cv2.VideoWriter类可以将图片序列保存成视频文件,也可以修改视频的各种属性,还可以完成对视频类型的转换。

类函数介绍

cv2.VideoWriter类常用的成员函数包括:构造函数、write函数等。

  1. 构造函数OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的语法格式是:
<VideoWriter object> = cv2.VideoWriter( filename, fourcc, fps, frameSize[,isColor] )
  • filename指定输出目标视频的存放路径和文件名。如果指定的文件名已经存在,则会覆盖这个文件。
  • fourcc表示视频编/解码类型(格式)。在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式。cv2.VideoWriter_fourcc()有4个字符参数。这4个字符参数构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。几个常用的标记:
  • cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’)表示未压缩的YUV颜色编码格式,色度子采样为4:2:0。该编码格式具有较好的兼容性,但产生的文件较大,文件扩展名为.avi。
  • cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’)表示MPEG-1编码类型,生成的文件的扩展名为.avi。
  • cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’)表示MPEG-4编码类型。如果希望得到的视频大小为平均值,可以选用这个参数组合。该组合生成的文件的扩展名为.avi。
  • cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’)表示Ogg Vorbis编码类型,文件的扩展名为.ogv。
  • cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘I’)表示Flash视频,生成的文件的扩展名为.flv。

更多的字符参数组合:http://www.fourcc.org

  • 若参数fourcc为“-1”,则程序运行时会弹出一个对话框, 在该对话框中,用户可以根据自己的需要选择合适的压缩程序和压缩质量。
  • fps为帧速率。
  • frameSize为每一帧的长和宽。
  • isColor表示是否为彩色图像。
  1. **例子: **下面的语句完成了cv2.VideoWriter类的初始化工作
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20, (1024,768))
  1. 如果希望通过对话框设置编/解码格式,可以使用语句:
fourcc = -1
out = cv2.VideoWriter('output.avi', fourcc, 20, (1024,768))
  1. write函数cv2.VideoWriter类中的函数cv2.VideoWriter.write()用于写入下一帧视频。该函数的语法格式为:
None=cv2.VideoWriter.write(image)
  • image是要写入的视频帧。
  1. 通常情况下,要求彩色图像的格式为BGR模式。
    在调用该函数时,直接将要写入的视频帧传入该函数即可。
    例如,有一个视频帧为frame,要将其写入上面的示例中名为out的cv2.VideoWriter类对象内,则使用语句:
out.write(frame)
  1. 上述语句会把frame传入名为output.avi的out对象内。
  2. 释放
    在不需要cv2.VideoWriter类对象时,需要将其释放。
    释放该类对象时所使用的是函数cv2.VideoWriter.release()。
    该函数的语法格式是:
None = cv2.VideoWriter.release( )
  1. 当前有一个cv2.VideoWriter类的对象out,可以用以下语句将其释放:
out.release()
保存视频

保存视频包括创建对象、写入视频、释放对象等多个步骤

  1. 创建对象在创建对象前,首先需要设置好参数。
  • 设置好要保存的具体文件名,例如:filename=‘‘out.avi’’。
  • 使用cv2.VideoWriter_fourcc()确定编/解码的类型,例如:fourcc =cv2.VideoWriter_fourcc(*‘XVID’)。
  • 确定视频的帧速率,例如:fps=20。
  • 确定视频的长度和宽度,例如:size=(640,480)。
  1. 然后利用上述参数,创建对象。例如:
out = cv2.VideoWriter( filename , fourcc , fps , size )
  1. 当然,也可以直接在构造函数内用需要的参数值创建对象。例如:
out = cv2.VideoWriter('out.avi', fourcc, 20, (640,480))
  1. 写入视频
    用函数cv2.VideoWriter.write()在创建的对象out内写入读取到的视频帧frame。使用的代码为:
out.write(frame)
  1. 释放对象
    在完成写入后,释放对象out。代码为:
out.release()
  1. **例子:**使用cv2.VideoWriter类保存摄像头视频文件。
import numpy as np 
import cv2 
cap = cv2.VideoCapture(0) 
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0') 
out = cv2.VideoWriter('output.avi', fourcc, 20, (640,480)) 
while(cap.isOpened()): 
  ret, frame = cap.read() 
  if ret==True: 
    out.write(frame) 
    cv2.imshow('frame', frame) 
    if cv2.waitKey(1) == 27: 
      break 
  else: 
    break 
cap.release() 
out.release() 
cv2.destroyAllWindows()
  1. 运行上述程序,就会捕获当前摄像头的视频内容,并将其保存在当前目录下名为“output.avi”的视频文件中。
视频操作基础

视频是由视频帧构成的,将视频帧从视频中提取出,对其使用图像处理的方法进行处理,就可以达到处理视频的目的。

例子:提取视频的Canny边缘检测结果。

import numpy as np 
import cv2 
cap = cv2.VideoCapture('viptrain.avi') 
while(cap.isOpened()): 
  ret, frame = cap.read() 
  frame=cv2.Canny(frame,100,200) 
  cv2.imshow('frame', frame) 
  c = cv2.waitKey(1)   # 0 是一直等待
  if c==27:   #ESC键 
    break 
cap.release() 
cv2.destroyAllWindows()
相关文章
|
4月前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
391 1
|
5月前
|
机器学习/深度学习 人工智能 算法
Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。
【7月更文挑战第5天】Python在计算机视觉(CV)中扮演重要角色,得益于其丰富的库如OpenCV、Pillow和Scikit-image。CV涉及图像处理、模式识别和机器学习,用于图像理解和生成。Python的跨平台特性和活跃社区使其成为CV的理想工具。基本流程包括图像获取、预处理、特征提取、分类识别及图像生成。例如,面部识别通过预处理图像,使用如`cv2.CascadeClassifier`进行检测;物体检测类似,但需适应不同目标;图像生成则利用GAN创造新图像。
71 4
|
2月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
131 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
2月前
|
机器学习/深度学习 算法 计算机视觉
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
【Python篇】Python + OpenCV 全面实战:解锁图像处理与视觉智能的核心技能
80 2
|
3月前
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
4月前
|
存储 编解码 API
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
python多种方法压缩图片,opencv、PIL、tinypng、pngquant压缩图片
307 1
|
4月前
|
算法 定位技术 vr&ar
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
634 0
一文了解PnP算法,python opencv中的cv2.solvePnP()的使用,以及使用cv2.sovlePnP()方法标定相机和2D激光雷达
|
4月前
|
机器学习/深度学习 人工智能 监控
利用Python和OpenCV实现实时人脸识别系统
【8月更文挑战第31天】本文将引导您了解如何使用Python结合OpenCV库构建一个简易的实时人脸识别系统。通过分步讲解和示例代码,我们将探索如何从摄像头捕获视频流、进行人脸检测以及识别特定个体。本教程旨在为初学者提供一条明晰的学习路径,帮助他们快速入门并实践人脸识别技术。
|
5月前
|
机器学习/深度学习 数据可视化 算法框架/工具
使用Python实现深度学习模型:视频处理与动作识别
【7月更文挑战第16天】 使用Python实现深度学习模型:视频处理与动作识别
291 17