OpenCV 調用攝像頭錄製指定分辨率視頻----(解決保存的視頻僅有6Kb的問題)

1.環境信息

win10 系統,VS2012,openCV 2.4.9,支持UVC協議的免驅動720p攝像頭

2.問題描述

攝像頭最大支持1280x960分辨率,但OpenCV調用的時候默認的分辨率是640x480。
需要調用攝像頭錄製1280x720的視頻。沒有報錯信息,卻發現生成的視頻始終只有6Kb,無法播放。
程序如下

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;
void main()
{
VideoCapture capture(0);

int framecount=0;
int dWidth=1280;
int dHeight=720;
Size frameSize(static_cast<int>(dWidth),static_cast<int>(dHeight));
VideoWriter writer("VideoTest.avi",CV_FOURCC('P','I','M','1'),20,frameSize,true);      //CV_FOURCC('I','Y','U','V')
if (!capture.isOpened())
        std::cout<< "Video open failed" << endl;
Mat frame;
while(framecount<=50)
{
    capture.read(frame);
    writer << frame;
    waitKey(30);
    framecount=framecount+1;
    cout<<"成功寫入視頻中,當前已寫入幀數爲: "<<framecount<<endl;

}
    capture.release();  
    writer.release();  
    return ;   
}

3.問題分析

視頻只有6KB,是因爲只生成了avi文件的頭文件,沒有真正地寫入圖像信息。
自然的懷疑是Videowriter()中設置的編碼FOURCC的問題
修改不同的編碼格式,始終只有6KB。
經過仔細分析,發現問題在於視頻尺寸上。
Videowriter的尺寸設置爲了1280*720,而capture讀取的圖像尺寸仍然是默認尺寸,沒有修改,所以視頻不能正常保存
添加兩句修改capture尺寸的即可。

capture.set(CV_CAP_PROP_FRAME_WIDTH,1280);
capture.set(CV_CAP_PROP_FRAME_HEIGHT,720);

修改後部分如下

Mat frame;
capture.set(CV_CAP_PROP_FRAME_WIDTH,1280);
capture.set(CV_CAP_PROP_FRAME_HEIGHT,720);
while(framecount<=50)
{
    capture.read(frame);
    writer << frame;
    waitKey(30);
    framecount=framecount+1;
    cout<<"成功寫入視頻中,當前已寫入幀數爲: "<<framecount<<endl;

}
    capture.release();  
    writer.release();  
    cvDestroyAllWindows();   
    return ;   
}

4.問題總結

openCV 調用攝像頭錄製視頻很簡單,但是生成視頻只有6Kb這種失誤情況,網上講的不是很多。
所以剛開始以爲問題出在視頻解碼上,花了一些無用功。
雖然是小問題,但記錄一下,希望遇到同樣情況的朋友可以參考一下,少花些功夫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章