OpenCV VideoWriter使用方法

在opencv中提供很好用的录制视频的句柄,也可称之为类videowriter。

一、VideoWriter接口介绍

1、打开视频输出
cv::VideoWriter有两个构造函数,一个是默认构造函数,仅仅创建一个未初始化的VideoWriter对象用于之后的打开操作;另一个是拥有所需要的参数,并初始化VideoWriter对象,如下:

cv::VideoWriter::VideoWriter(
    const string& filename,  // input filename
    int fourcc,  // codec, use CV_FOURCC() macro
    double fps,  // frame rate (stored in output file)
    cv::Size  frame_size,  // Size of individual images
    bool is_color = true  // if false, you can pass gray frames
);


写视频时需要设置一系列参数,包括:文件名、编解码器、帧率、宽度和高度等,还可以志峰图像是否彩色,isColor设置为false,可以传入灰度图。编解码器使用四个字符表示,可以是CV_FOURCC('M','J','P','G')、CV_FOURCC('X,'V','I','D')、CV_FOURCC('D','I','V','X')。
使用默认构造函数创建对象后,可以使用cv::VideoWriter::open()方法进行配置,参数与构造函数相同。

2、写入一帧图像
写入图像时可以使用VideoWriter::write()函数,也可以使用重载符<<。
需要注意的是待写入的图像尺寸必须是与创建视频时指定的尺寸一致。

3、关闭视频输出
release

详细方法:

class VideoWriter
{
public:
    //构造
    VideoWriter();
    /*filename:输出视频文件的文件名  
      fourcc:用于压缩帧的编解码器的4个字符代码。
      fps:帧率
      frameSize:帧宽高大小;
      isColor:非0,编码器将期望并编码彩色帧;否则,灰度帧;
    */
    VideoWriter(const String& filename, int fourcc, double fps,
                Size frameSize, bool isColor = true);
    //apiPreference参数: cv::CAP_FFMPEG or cv::CAP_GSTREAMER等
     VideoWriter(const String& filename, int apiPreference, int fourcc, double fps,
                Size frameSize, bool isColor = true);
 
    //析构
    virtual ~VideoWriter();
 
    //打开文件
    virtual bool open(const String& filename, int fourcc, double fps,
                      Size frameSize, bool isColor = true);
    bool open(const String& filename, int apiPreference, int fourcc, double fps,
                      Size frameSize, bool isColor = true);
 
    //若视频输出已经被成功初始化(打开),返回true;
    virtual bool isOpened() const;
    
    //关闭视频输出
    virtual void release();
    
    //写下一帧
    virtual void write(const Mat& image);
 
    virtual bool set(int propId, double value);
    virtual double get(int propId) const;
 
    //将4个字符连接到一个fourcc代码
    static int fourcc(char c1, char c2, char c3, char c4);
 
protected:
    Ptr<CvVideoWriter> writer;
    Ptr<IVideoWriter> iwriter;
 
    static Ptr<IVideoWriter> create(const String& filename, int fourcc, double fps,
                                    Size frameSize, bool isColor = true);
};


二、实例

1、保存avi视频文件

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
 
void main(){
    VideoCapture cap;
    cap.open("d:\\input.avi");
    Size sizeReturn = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH),cap.get(CV_CAP_PROP_FRAME_HEIGHT));
    VideoWriter writer("d:\\output.avi",cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),cap.get(CV_CAP_PROP_FPS),sizeReturn,false);
 
    if(!cap.isOpened())
        return;
 
    Mat frame;
    while(true)
    {
        cap>>frame;
        if(frame.empty())
            break;
        writer<<frame;//等同于writer.write(frame);
        imshow("video", frame);
        if(waitKey(20)>0)
            break;
    }
    cout<<"write end!";
    cap.release();
    destroyAllWindows();
}

2、多张图片合并成mp4视频

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
    //读取第一帧图像,获取长宽
    Mat src = imread("1.bmp");
    int width = src.cols;
    int height = src.rows;
    //配置视频参数
    VideoWriter writer;
    writer.open("d:\\out.mp4", VideoWriter::fourcc('m', 'p', '4', 'v'), 15, Size(width, height), 1);
    char savefile[200];
    Mat srcc;
    for (int i = 0; i < 500; i++) {
        for (int j = 1; j <= 6; j++)
        {
            sprintf(savefile, "d:\\input\\%d.bmp", j);
            srcc = imread(savefile, 1);
            if (srcc.empty())
            {
                cout << "图片读取结束" << endl;
                break;
            }

            imshow("Output Video", srcc);
            waitKey(1000 / 15);
            writer.write(srcc);
        }
    }
}

三、注意事项

1、opencv2.x版本只支持avi格式,opencv3.x支持mp4。
2、保存mp4文件时,出现VideoWriter writer.open()打开失败会返回false,同时writer.isOpened()也会返回false。
解决方法:运行环境缺少opencv_ffmpeg***_64.dll和opencv_ffmpeg***.dll底层调用库,将它们拷贝过来就行。
3、目前VideoWriter 这个类生成的视频文件不能大于2GB,而且不能添加音频。建议使用ffmpeg库或者gpac库来存储视频文件。

猜你喜欢

转载自blog.csdn.net/byxdaz/article/details/130168775