1-2 有关视频的操作——OpenCV-Python教程翻译

目标

  • 掌握读取视频,显示视频和保存视频
  • 掌握使用摄像头捕获视频并显示视频
  • 掌握这些函数:cv2.VideoCapture()和cv2.VideoWriter()

使用摄像头捕捉视频

我们经常需要使用摄像头来捕捉一些实时场景。OpenCV则提供了一个非常简单的接口。下面将展示一个案例,实现使用摄像头捕捉视频,并转换为灰度图像显示。

需要创建一个VideoCapture对象来实现捕捉视频。它的参数可以是一个设备编号也可以是一个视频名字。设备编号就是一个指定相机的数字。通常会连接一个相机,因此简单的传递0(或者-1)即可。当传递1或者其他数值时可以获得其他的相机。在此之后,将一帧一帧的捕捉视频。需要注意的是,在程序最后要释放内存。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
while(True):
    # 一帧一帧捕获视频
    ret, frame = cap.read()
    # 对每一帧视频(也就是图片)进行操作
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 显示操作后的每一帧图片
    cv.imshow('frame',gray)
    # 键盘输入Q关闭窗口
    if cv.waitKey(1) & 0xFF == ord('q'):
        break
# 最后释放捕捉
cap.release()
cv.destroyAllWindows()

cap.read()返回一个布尔值(True/False),如果正确捕捉摄像头,将返回True。因此可以通过判断这个返回值来检查是否正确捕获图片。有时候,cap可能没有正确地初始摄像头设备,代码则会抛出异常。这个时候需要检查是否正确初始化,也可以使用方法cap.isOpened()来判断摄像头是否正常初始化。如果返回值是False,则可以使用cap.open()打开摄像头。

使用方法cap.get(propld)获得视频的一些特征,其中propld是0-18之间的任意整数。每一个整数代表一种视频属性。可以通过cap.set(propld,value)修改视频属性,value 就是你想要设置成的新值。

例如,我可以使用 cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。但是我可以使用 ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240。

显示视频文件

和从摄像头设备捕获视频一样,只需要将摄像头索引改成视频文件名称。当显示视频时,需要给cv2.waitKey()设置合适的时间,当时间过短时会导致视频太快,当时间太长时,会导致视频播放过慢(但是如果是要缓慢播放视频时,可以选择设置较长的时间),一般情况下,将时间设置为25毫秒比较合适。

import numpy as np
import cv2
cap = cv2.VideoCapture('vtest.avi')
while(cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv.COLOR_BGR2GRAY)
    cv2.imshow('frame',gray)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

注意:请确定安装正确版本的ffmpeg或者gstreamer。有些时候错位的版本会导致视频捕捉异常。

保存视频

我们可以捕捉视频,并一帧一帧的处理视频,那也可以保存视频。对于图片,简单的使用cv2.imwrite()即可,但是对于视频则复杂一些。保存视频需要创建一个VideoWriter对象,需要指定保存的文件名(比如:output.avi)。随后,需要声明FourCC编码(后面章节会介绍)。之后需要传递每秒帧数(fps)和每一帧大小。最后一个参数时isColor标志位,如果为Ture则输出彩色图像,否正输出绘制图像。

FourCC是一个4字节编码,用于指定视频编格式。可以在fourcc.org 中找到所有的编码格式。编码格式与平台是相关的,在 Windows 平台下主要的视频格式是 DIVX ,它支持 MPEG-4, H.264 和最新 H.265 标准的视频,分辨率可高达4K超高清。

对于 MJPG 格式的视频,我们可以像cv2.VideoWriter_fourcc('M','J','P','G') 或者 cv2.VideoWriter_fourcc(*'MJPG') 这样的方式来传递 FourCC 码。

下面的代码捕捉一个视频,将视频每一帧沿X轴方向翻转(镜像),然后保存。

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
# 定义编码格式并创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)
        # 保存翻转图像
        out.write(frame)
        cv.imshow('frame',frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 结束时释放所有
cap.release()
out.release()
cv.destroyAllWindows()

猜你喜欢

转载自blog.csdn.net/qq_22235957/article/details/81070590