OpenCV 录取/播放/保存视频操作

优质
小牛编辑
137浏览
2023-12-01

OpenCV视频操作学习目标

  • 学习阅读视频,显示视频和保存视频。
  • 学习从摄像头捕捉并显示它。
  • 您将学习这些功能:cv2.VideoCapture()cv2.VideoWriter()

1、用摄像头捕获视频

通常,我们必须用摄像头捕捉实时流。OpenCV提供了一个非常简单的接口。让我们从摄像头中捕捉视频(我正在使用笔记本电脑的内置摄像头),将其转换为灰度视频并显示。只是一个简单的任务开始。

要捕捉视频,您需要创建一个VideoCapture对象。它的参数可以是设备索引或视频文件的名称。设备索引只是指定哪个摄像头的号码。通常一个相机将被连接(就像我的情况)。所以我只是通过0(或-1)。您可以通过传递1等来选择第二台相机。之后,您可以逐帧捕捉。但最后,不要忘记释放捕获。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Display the resulting frame
    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

cap.read()返回一个布尔True/False。如果帧被正确读取,则为True。所以你可以通过检查这个返回值来检查视频的结束。

有时候,cap可能没有初始化捕获。在这种情况下,这段代码显示错误。你可以通过cap.isOpened()方法检查它是否被初始化。如果它是True,好的。否则使用cap.open()打开它。

您还可以使用cap.get(propId)方法访问此视频的某些功能,其中propId是一个从0到18的数字。每个数字表示视频的一个属性(如果该视频适用于该视频),详细信息可以在这里可以看到:属性标识符。其中一些值可以使用cap.set(propId,value)进行修改。 值是你想要的新值。

例如,其中一些值可以使用cap.set(propId,value)来修改,例如cap.get(3)cap.get(4)来查看每一帧的宽和高,默认是640x480。我们可以使用ret=cap.set(3,320)ret = cap.set(4,240)来把宽和高改成320x240

2、从文件中播放视频

把设备索引号改成文件名即可。在播放每一帧时,使用cv2.waitKey()适当持续时间,如果它太少,视频会非常快,如果它太高,视频会很慢(那么,这是如何以慢动作显示视频)。正常情况下,25ms即可。

import numpy as np
import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

3、保存视频

所以我们拍摄一个视频,逐帧处理,我们要保存视频。对于图像来说,这非常简单,只是使用cv2.imwrite()。 但是视频需要更多的工作。

创建一个VideoWrite的对象,确定输出文件名,指定FourCC编码,播放频率和帧的大小,最后是isColor标签True为彩色。 FourCC是一个4字节码,用来确定视频的编码格式。

  • 1、In Fedora : DIVX , XVID , MJPG , X264 , WMV1 , WMV2 XVID是最好的,MJPG是高尺寸视频,X264得到小尺寸视频
  • 2、In Windows : DIVX
  • 3、In OSX :不知道用什么好

设置FourCC格式时,原文里采用了·cv2.VideoWriter_fourcc()·这个函数,若运行程序的时候显示这个函数不存在,可以改用了·cv2.cv.CV_FOURCC·这个函数。

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
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)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()