您的位置:

videowriter:在OpenCV中创建和保存视频文件

一、videowriter简介

在OpenCV(开源计算机视觉库)中,我们可以使用videowriter实现创建和保存视频文件。videowriter提供了一个简单的API,可以将视频数据写入指定的文件格式中。因此,可以通过它将处理过的视频数据保存到硬盘中,以便以后使用。

二、创建videowriter对象

在使用videowriter之前,我们需要创建一个videowriter对象。创建videowriter对象的方法如下:


cv::VideoWriter outputVideo;

这里,我们使用了OpenCV的命名空间cv,并创建了一个名为outputVideo的videowriter对象。

三、设置视频属性

在创建videowriter对象后,我们需要设置输出视频的属性。这些属性包括视频文件的名称、帧率、分辨率、颜色空间等。可以通过下面的代码设置视频属性:


cv::VideoWriter outputVideo;
outputVideo.open("output.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, cv::Size(640, 480), true);

上面的代码中,我们设置了输出视频的名称为“output.avi”,帧率为30帧/秒,分辨率为640x480,颜色空间为彩色。在此示例中,我们使用了MJPG编解码器,设置图像质量(参数true)。

四、写入帧到视频

一旦设置了videowriter对象的属性,我们可以开始将帧写入视频。将帧写入视频的方法如下:


cv::VideoWriter outputVideo;
outputVideo.open("output.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, cv::Size(640, 480), true);

cv::Mat frame;
// 在此读取帧
outputVideo.write(frame);

在上面的示例中,我们首先创建了一个名为frame的Mat对象。该对象中存储了一帧图像的像素值。接下来,我们调用outputVideo.write(frame)方法将该帧写入到视频中。

五、释放资源

写入视频流后,我们需要释放所有与videowriter对象相关的资源以确保所有数据都写入文件中。释放资源的方法如下:


cv::VideoWriter outputVideo;
outputVideo.open("output.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 30, cv::Size(640, 480), true);

while (视频流不为空) {
    cv::Mat frame;
    // 在此读取帧
    outputVideo.write(frame);
}

outputVideo.release();

在上述示例中,我们使用while循环将多帧图像写入视频中。在最后一帧写入后,我们调用outputVideo.release()方法释放资源。

六、代码示例

下面是一个完整的示例,其中包括创建videowriter对象、设置视频属性、将帧写入视频和释放资源的所有步骤:


#include 
   
#include 
    

using namespace cv;
using namespace std;

int main()
{
    VideoCapture cap(0);
    if (!cap.isOpened())
    {
        cout << "无法打开视频流!" << endl;
        return -1;
    }

    double fps = cap.get(CAP_PROP_FPS);
    Size size((int)cap.get(CAP_PROP_FRAME_WIDTH), (int)cap.get(CAP_PROP_FRAME_HEIGHT));
    string outputVideoName = "output.avi";
    VideoWriter outputVideo;
    outputVideo.open(outputVideoName, VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, size, true);

    if (!outputVideo.isOpened())
    {
        cout << "无法创建输出视频文件!" << endl;
        return -1;
    }

    Mat frame;
    while (cap.read(frame))
    {
        imshow("视频流", frame);
        outputVideo.write(frame);

        if (waitKey(1) == 27) 
        {
            // 退出按键ESC
            break; 
        }
    }

    cap.release();
    outputVideo.release();

    return 0;
}

    
   

七、小结

我们已经详细了解了OpenCV中的videowriter,包括如何创建videowriter对象、设置视频属性、将帧写入视频和释放资源等。通过使用videowriter,我们可以将图像处理的结果保存到硬盘中以供以后再次使用。