opencv从入门到精通 哦吼10

目录

视频处理

读取并显示摄像头视频

VideoCapture 类

播放视频文件

保存视频文件

小结


视频处理

OpenCV 不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像以固定的时间间隔从视频中获取。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到处理视频的目的。要处理视频,需要先对视频进行读取、显示和保存等相关操作。为此,OpenCV 提供了 VideoCapture 类和 VideoWriter 类的相关方法。

读取并显示摄像头视频

摄像头视频指的是从摄像头

为了读取并显示摄像头视频,OpenCV 提供了 VideoCapture 类的相关方法,这些方法包括摄像头的初始化方法、检验摄像头初始化是否成功的方法、从摄像头中读取帧的方法和关闭摄像头的方法等。下面依次对这些方法进行讲解。

说明

视频是由大量的图像构成的,把这些图像称作帧。

VideoCapture 类

VideoCapture 类提供了构造方法 VideoCapture(),用于完成摄像头的初始化工作。VideoCapture()的语法格式如下:

capture = cv2.VideoCapture(index)

注意

摄像头的数量及其设备索引的先后顺序由操作系统决定,因为 OpenCV 没有提供查询摄像头的数量及其设备索引的任何方法。

当 index 的值为 0 时,表示要打开的是第 1 个摄像头;对于 64 位的 Windows 10 笔记本,当 index 的值为 0 时,表示要打开的是笔记本内置摄像头

当 index 的值为 1 时,表示要打开的是第 2 个摄像头;对于 64 位的 Windows 10 笔记本,当 index 的值为 1 时,表示要打开的是一个连接笔记本的外置摄像头

为了检验摄像头初始化是否成功,VideoCapture 类提供了 isOpened()方法。isOpened()方法的语法格式如下:

  retval = cv2.VideoCapture.isOpened()

 retval:isOpened()方法的返回值。如果摄像头初始化成功,retval 的值为 True;否则,retval 的值为 False。

说明

在 VideoCapture()的语法格式基础上,isOpened()方法的语法格式可以简写为

     retval = capture.isOpened()

摄像头初始化后,可以从摄像头中读取帧,为此 VideoCapture 类提供了 read()方法。read()方法的语法格式如下:

 retval, image = cv2.VideoCapture.read() # 可以简写为 retval, image = capture.read()

retval:是否读取到帧。如果读取到帧,retval 的值为 True;否则,retval 的值为 False。

 image:读取到的帧。因为帧指的是构成视频的图像,所以可以把「读取到的帧」理解为「读取到的图像」。

OpenCV 官网特别强调,在不需要摄像头时,要关闭摄像头。为此,VideoCapture 类提供了 release()方法。release()方法的语法格式如下:

cv2.VideoCapture.release() # 可以简写为 capture.release()

import cv2

capture=cv2.VideoCapture(0)
while(capture.isOpened()):
    retal,image=capture.read()
    cv2.imshow('video',image)
    key=cv2.waitKey(1)
    if key==65:
        break
capture.release()
cv2.destroyAllWindows()

 别看我,看我的手

将摄像头视频由彩色视频转换为灰度视频

import cv2
capture=cv2.VideoCapture(0)
while(capture.isOpened()):
    retval,image=capture.read()
    image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    cv2.imshow('video',image)
    cv2.imshow('video',image_gray)
    key=cv2.waitKey(1)
    if key==32:
        break
capture.release()
cv2.destroyAllWindows()

还是看菜狗吧

 

显示并保存摄像头视频某一时刻的图像

播放视频文件

VideoCapture 类及其方法除了能够读取并显示摄像头视频外,还能够读取并显示视频文件。当窗口根据视频文件的时长显示视频文件时,便实现了播放视频文件的效果。

读取并显示视频文件
VideoCapture 类的构造方法 VideoCapture()不仅能够完成摄像头的初始化工作,还能够完成视频文件的初始化工作。当 VideoCapture()用于初始化视频文件时,其语法格式如下:

注意

OpenCV 中的 VideoCapture 类虽然支持各种格式的视频文件,但是这个类在不同的操作系统中,支持的视频文件格式不同。尽管如此,VideoCapture 类能够在不同的操作系统中支持后缀名为.avi 的视频文件。

说明

调整 waitKey()方法中的参数值可以控制视频文件的播放速度。例如,当代码为 cv2.waitKey(1)时,等待用户按下键盘的时间为 1ms,视频文件的播放速度非常快;当代码为 cv2.waitKey(50)时,等待用户按下键盘的时间为 50ms,能够减缓视频文件的播放速度。

视频的暂停播放和继续播放

import cv2
video=cv2.VideoCapture('video/video.mp4')
while(video.isOpened()):
    retral,image=video.read()
    cv2.namedWindow('vide01',0)

    if retral==True:
        cv2.imshow('video1',image)
    else:break
    key=cv2.waitKey(50)
    if key==32:
        cv2.waitKey(0)
        continue
    if key==27:
        break
video.release()
cv2.destroyAllWindows()

获取视频文件的属性

在实际开发中,有时需要获取视频文件的属性。为此,VideoCapture 类提供了 get()方法。get()方法的语法格式如下:

 retval = cv2.VideoCapture.get(propId)

说明

(1)视频是由大量的、连续的图像构成的,把其中的每一幅图像称作一帧。

(2)帧数指的是视频文件中含有的图像总数,帧数越多,视频播放时越流畅。

(3)在播放视频的过程中,把每秒显示图像的数量称作帧速率(FPS,单位:帧/s)。

(4)帧宽度指的是图像在水平方向上含有的像素总数。

(5)帧高度指的是图像在垂直方向上含有的像素总数

保存视频文件

在实际开发过程中,很多时候希望保存一段视频。为此,OpenCV 提供了 VideoWriter 类。下面先来熟悉一下 VideoWriter 类中的常用方法。

VideoWriter 类

VideoWriter 类中的常用方法包括 VideoWriter 类的构造方法、write()方法和 release()方法。其中,VideoWriter 类的构造方法用于创建 VideoWriter 类对象,其语法格式如下:

 <VideoWriter object> = cv2.VideoWriter(filename, fourcc, fps, frameSize)

在 OpenCV 中,使用 cv2.VideoWriter_fourcc()来确定视频编码格式

 例如,在 Windows 操作系统下,fourcc 的值为 cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),帧速率为 20,帧大小为 640×480。如果想把一段视频保存为当前项目路径下的 output.avi,那么就要创建一个 VideoWriter 类对象 output,关键代码如下:

  fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
     output = cv2.VideoWriter("output.avi", fourcc, 20, (640, 480))

为了保存一段视频,除需要使用 VideoWriter 类的构造方法外,还需要使用 VideoWriter 类提供的 write()方法。write()方法的作用是在创建好的 VideoWriter 类对象中写入读取到的帧,其语法格式如下:

  cv2.VideoWriter.write(frame)

注意

使用 write()方法时,需要由 VideoWriter 类对象进行调用。例如,在创建好的 VideoWriter 类对象 output 中写入读取到的帧 frame,关键代码如下:

     output.write(frame)

当不需要使用 VideoWriter 类对象时,需要将其释放掉。为此,VideoWriter 类提供了 release()方法,其语法格式如下:

 cv2.VideoWriter.release()

例如,完成保存一段视频后,需要释放 VideoWriter 类对象 output。关键代码如下:

  output.release()

如何使用 VideoWriter 类

使用 VideoWriter 类保存一段视频需要经过以下几个步骤:创建 VideoWriter 类对象、写入读取到的帧、释放 VideoWriter 类对象等。而且,这段视频既可以是摄像头视频,也可以是视频文件。本节将使用 VideoWriter 类以实例的方式分别对保存摄像头视频和保存视频文件进行讲解。

说明

在 Windows 操作系统下,fourcc 的值为 cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),帧速率为 20,帧大小为 640×480。

小结

视频是由一系列连续的图像构成的,这一系列连续的图像被称作帧,帧是以固定的时间间隔从视频中获取的。因为视频播放的速度就是获取帧的速度,所以把视频播放的速度称作帧速率,其单位是帧/s(即 1s 内出现的图像数)。所谓视频处理,处理的对象就是从视频中获取的帧,而后使用图像处理的方法对获取的帧进行处理。OpenCV 提供了 VideoCapture 类和 VideoWriter 类处理视频,虽然这 2 个类在不同的操作系统中支持的视频文件的格式不同,但是这 2 个类在不同的操作系统中都支持 AVI 格式的视频文件。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值