cv.VideoCapture(),cv.VideoWriter()视频文件处理

从相机捕获视频


使用笔记本电脑上的摄像头进行捕获实时流

创建一个VideoCapture对象,它的参数可以是设备索引或视频文件的名称。
有时候cap可能尚未初始化捕获,通过 cap.isOpened() 方法检查它是否已初始化。如果是True,那么确定。否则使用cap.open()打开它
cap.read() 返回布尔值(True/ False)。如果正确读取该帧,它将为True。

import numpy as np
import cv2 as cv


def test1():
    # 从电脑摄像头读取视频
    cap = cv.VideoCapture(0)  # 使用笔记本摄像头
    if not cap.isOpened():  # 判断摄像头是否打开
        print("Cannot open camera")
        exit()
    while True:
        # 逐帧捕获,frame储存帧
        ret, frame = cap.read()
        # 如果正确读取帧,ret为True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        # 我们在框架上的操作到这里
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        # 显示结果帧e
        cv.imshow('frame', gray)
        if cv.waitKey(1) == ord('q'):
            break
    # 完成所有操作后,释放捕获器
    cap.release()
    cv.destroyAllWindows()

播放视频文件
对视频文件读取时,本人并没有遇到网上 ffmpeg文件 带来的困惑,但是 Reader Mode 使我的视频无法读取 ,不知道怎么删除这一模式,将所有代码放到新的python file后没有了Reader Mode,代码也运行成功。
def test2():
    # 播放视频文件
    cap = cv.VideoCapture('2.avi')  # 视频文件最好是avi后缀
    while cap.isOpened():  # 捕获成功进行后续操作
        ret, frame = cap.read()  # 读帧
        # if frame is read correctly ret is True
        if not ret:
            print("Can't receive frame (stream end?). Exiting ...")
            break
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        cv.imshow('frame', gray)
        if cv.waitKey(1) == ord('q'):
            break
    cap.release()
    cv.destroyAllWindows()

保存视频文件

只需使用 cv.imwrite(),但还需要一些准备工作

创建一个 VideoWriter 对象。我们应该指定输出文件名(例如: output.avi)。然后我们应该指定 FourCC 代码。然后传递帧率的数量和帧大小。最后一个是颜色标志。如果为 True,编码器期望颜色帧,否则它与灰度帧一起工作。

FOURCC是“Four character code”的缩写,也称为4CC。该编码用于指示一个视频的编码压缩格式等信息。一个字符通常占用一个字节也就是8位的存储空间,那么四字码通常占用32位的大小。四个字符通常都是用ASCII字符编码,以方便交流。
AVI是最早被广泛使用的视频格式,其他的4CC编码包括DIVX,XVID,H264,DX50等等。但是这些只是数百个被使用的4CC编码中的很小一部分。

查看视频文件的fourcc编码

fourcc = video.get(cv2.CAP_PROP_FOURCC)
print(fourcc)

# 此时输出的是一个数字,显然不便于我们理解。我们知道opencv提供了cv2.VideoWriter_fourcc()函数来将字符形式的4CC码改为数字型的编码。
def decode_fourcc(cc):
    return "".join([chr((int(cc) >> 8 * i) & 0xFF) for i in range(4)]

现在编码用到了CV_FOURCC获取编码格式:
CV_FOURCC(‘P’, ‘I’, ‘M’, ‘1’) = MPEG-1 codec
CV_FOURCC(‘M’, ‘J’, ‘P’, ‘G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec

你可能感兴趣的:(Python,opencv)