Opencv处理视频序列

一、什么是FOURCC

FOURCC是“four character code”的缩写,也称为4CC。用于媒体文件中的视频编解码器、压缩格式、颜色或像素格式的标识符。一个字符编码占用一个字节也就是8位的存储空间,因此一个FOURCC占用4字节。FOURCC中的四个字符通常都是用ASCII字符编码,以方便交流。

AVI文件是最广泛使用的,或者说是第一种广泛使用的媒体文件格式,它使用FOURCC标识符作为编解码器用于压缩文件中的各种视频/音频流。其他比较著名的FOURCC包括DIVX、XVID、H264、DX50。但这些只是数百个在使用的FOURCC的一小部分。

视频的大小直接影响视频分析的实时性,而视频文件的大小影响因素有时长、格式、帧率(FPS)以及分辨率等,因此需要选择合适的格式,或者做一些压缩处理。部分CV_FOURCC测试如下:
Opencv处理视频序列

二、视频压缩

ffmpeg是格式转化和压缩的工具,使用命令行进行转化。参考文档 http://wiki.webmproject.org/ffmpeg。
测试如下:

ffmpeg -i test_mjpg.avi -threads 4 -vcodec libvpx-vp9 -cpu-used -8 -crf 10 -qmax 60 -deadline realtime test.webm

实测:19M压缩为1.6M

三、图片序列转视频

VideoWriter(const string& filename, int fourcc, double fps,
			Size frameSize, bool isColor=true);

各参数含义如下:

  • filename: 输出视频文件的名称
  • fourcc:four character code,四个字符用来表示压缩帧的编解码
  • fps:帧率
  • frameSize:每帧图片的大小
  • isColor: 默认非零,编码器将得到彩色帧并进行编码

第二个参数OpenCV提供的格式是未经过压缩的,目前支持的格式如下

  • 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
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(){
    Mat src=imread("/home/xxx/cam0/0.png",1);
    char image_name[100];
    int isColor = 1;
    int fps = 10;
    int frameWidth = src.cols;
    int frameHeight = src.rows;

    VideoWriter writer("test.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, Size(frameWidth, frameHeight), 0);
    
    cout << "info:" << endl
         << "test.avi" << endl
         << "Size:" << frameWidth << "*" << frameHeight << endl
         << "fps:" << fps << endl;
    
    for (int i = 0; i < 1000; i++)
    {
        sprintf(image_name, "/home/xxx/cam0/%d.png",i);
        cout<<image_name<<endl;
        src = imread(image_name, 1);

        if (src.empty())
        {
            cout<<"全部图像加载完成!"<<endl;
            break;
        }
        writer<<src;
		if (cvWaitKey(5) > 0)                  
			break;
    }

    writer.release();
    destroyAllWindows();

    return 0;
}

参考其他博客:
https://www.fourcc.org/fourcc.php
https://brucedone.com/archives/1194
https://blog.csdn.net/cow_boy001/article/details/8294403?locationNum=1&fps=1

上一篇:Python+opencv调用摄像头获取视频保存到本地并应用到YOLO中保存视频检测后的结果


下一篇:python将图片拼接为视频