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幀/秒,分辨率為640×480,顏色空間為彩色。在此示例中,我們使用了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,我們可以將圖像處理的結果保存到硬盤中以供以後再次使用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/155482.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-17 02:40
下一篇 2024-11-17 02:40

相關推薦

發表回復

登錄後才能評論