opencv基礎知識-videowriter


一、前言-簡介

在試驗中需要常常將實驗結果進行保存,在opencv中提供很好用的錄制視頻的句柄,也可稱之為類-videowriter。

videowriter應用那是相當的簡單,總之分為三步:

//聲明
VideoWriter writer;
//打開
writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
        rate, //不進行跟蹤,定位,只顯示、錄制時的幀率
        Size(inFrame.cols,inFrame.rows),
        true);
    if (!writer.isOpened())
    {
        return;
    }
//輸入
writer<<inFrame;
//釋放
writer.release();

 

open ( const char* filename, int fourcc, double fps, CvSize frame_size, int is_color=1 );

  •   filename 輸出視頻文件名。
  •     fourcc為 四個字符用來表示壓縮幀的codec 例如:
    • 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
    • 若編碼器代號為 -1,則運行時會彈出一個編碼器選擇框.
  • fps 被創建視頻流的幀率。
  • frame_size 視頻流的大小。
    • is_color 如果非零,編 碼器將希望得到彩色幀並進行編碼;否則,是灰度幀(只有在Windows下支持這個標志)。

二、應用難點

應用中出現的問題歸結為:

  • 1、打不開
  • 2、保存文件為空
  • 3、保存的文件打不開

1、打不開

a、輸入路徑名稱不對

在程序中經常遇到打不開的問題,最常見的問題是路徑輸入不對比如:

strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi

上述代碼中賦值操作,因為轉義符的原因讀入內存中,路徑就會出現問題,結果為:

C:UserslenovoDocumentsisual studio 2010TestMyClassTestopencv.avi

當然打不開了,所以在程序中一定注意轉義符的問題。

正確的路徑命名方式為:

strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi";
strvideoFile = "C:\\Users\\lenovo\\Documents\\visual studio 2010\\TestMyClass\\Testopencv\\3.avi";

b、編碼格式不對

在open函數中第二個參數是編碼格式,一定按照提供的編碼格式進行填寫,在應用中最好的解決方法是為-1。當為-1時,程序對彈出如下對話框供你選擇

cvCreateVideoWriter寫出AVI文件為空的問題

這樣就沒有問題啦,很容易解決編碼問題。

2、保存文件為空

這種問題往往是后綴名不對,自己試過.Mp4沒有成功,后來改為.avi就成功了

3、保存文件打不開

其實注意上面兩個問題,就可以進行錄制視頻了,在錄制視頻無法打開打開問題,這個就不好排查了。

但可以講一下自己遇到的問題:

最常見的問題是幀率設置不對,已經幀大小不對。

三、實例代碼

string strimgfile,strvideoFile ;
    /*strimgfile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\12.png";
    strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";*/
    strimgfile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/12.png";
    //strvideoFile = "C:/Users/lenovo/Documents/visual studio 2010/TestMyClass/Testopencv/3.avi";
    //strvideoFile = "C:\\Users\\lenovo\\Documents\\visual studio 2010\\TestMyClass\\Testopencv\\3.avi";
    //strimgfile = "12.png";
    //strvideoFile = "3.avi";
    strvideoFile = "C:\Users\lenovo\Documents\visual studio 2010\TestMyClass\Testopencv\3.avi";
    Mat frame = imread(strimgfile);
    namedWindow("圖像");
    imshow("圖像",frame);
    namedWindow("視頻");
    VideoCapture capture;
    VideoWriter writer;
    capture.open(strvideoFile);
    Mat inFrame;
    
    if (!capture.isOpened())
    {
        return;
    }
    int rate = capture.get(CV_CAP_PROP_FPS);
    int delay = 1000/rate;
    capture>>inFrame;
    writer.open("C:\\Users\\lenovo\\Documents\\04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
        rate, //不進行跟蹤,定位,只顯示、錄制時的幀率
        Size(inFrame.cols,inFrame.rows),
        true);
    if (!writer.isOpened())
    {
        return;
    }
    while(true)
    {
        capture>>inFrame;
        writer<<inFrame;
        imshow("視頻",inFrame);
        waitKey(delay);
        if (!capture.grab())
        {
            break;
        }
    }
    writer.release();
    system("pause");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM