2013-04-18 19 views
19

我試圖從我的Logitech C920在OpenCV中捕獲視頻流。藉助Labview,我可以以30fps 1080p的速度訪問MJPG流。在opencv中,我僅限於5fps或640x480。以30fps捕捉1080p與羅技c920與openCV 2.4.3

下面是相關的相機設置代碼:

this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 

這些都返回1,但我得到1080的5fps的流對應於YUY2流。
如果我添加以下行:

this->camRef.set(CV_CAP_PROP_FPS, 30); 

這回0 我在640×480弄30 fps的流。對我來說,看起來MJPG設置不被接受,但我不知道該怎麼做或如何解決這個問題。

編輯:下面的程序崩潰。

this->camRef.read(this->image); 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, config.width)   << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, config.height)  << std::endl; 
std::cout<< this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')) << std::endl; 
std::cout<< this->camRef.get(CV_CAP_PROP_FOURCC)       << std::endl; 

然後在我運行代碼,我有以下幾點:

void camera::run() 
{ 
    while(true) 
    { 
     if(this->camRef.read(this->image) == 0) 
     { 
      if(this->capture) 
      { 
       cv::imwrite(fileName,this->image); 
       this->count++; 
      } 
     } 
     msleep(15); 
    } 
} 

EDIT2:解決方法是設置攝像頭的高度和寬度之前設置的四字符碼編解碼器。

+0

,如果你想設置的FPS(必須由攝像機支持),您必須經過編解碼器的設置做到這一點,但寬度前/高度設置 – MartinM

+1

聽起來像你的EDIT2給你1080p在30fps。應該變成答案,然後接受,使問題得到解決。 –

回答

1

嘗試從拍攝第一幀設置任何事情之前:

VideoCapture cap(0); 
if(!cap.isOpened()) 
return -1; 

Mat frame; 
cap >> frame; 
double fps; 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080.0); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920.0); 
//add the loop here 

,並檢查它是否沒有設置MJPG工作。如果它能工作,試試MJPG。

對我來說,在設置任何東西之前你必須先獲得第一幀,這對我來說是唯一的方式(Windows 7 32位)。



//編輯:
喲可以嘗試使用不同的API - 在這裏看到我的答案的第二部分:https://stackoverflow.com/a/14188280/1598485 OpenCV的嘗試使用默認的最佳API,但也許在你的一些其他的API會更好地工作。

+0

謝謝你的回覆。我嘗試了你所說的,現在我的代碼在顯示圖像之前崩潰了。 cap.read返回1,然後當它試圖從相機再次讀取時崩潰。 –

+0

在哪一行?請用此線標出您的代碼。 – cyriel

+0

我已更新原始問題以顯示您請求的代碼。 –

6

由於該文章的作者已經找到了解決方案,但沒有添加它作爲答案,我會把解決方案放在這裏。

您必須設置想要的分辨率之前設置的編解碼器:

this->camRef.set(CV_CAP_PROP_FOURCC,CV_FOURCC('M','J','P','G')); 
this->camRef.set(CV_CAP_PROP_FRAME_WIDTH, 1920); 
this->camRef.set(CV_CAP_PROP_FRAME_HEIGHT, 1080); 
+0

謝謝!它的工作如上所述!另一方面,我想提到的是,雖然這將允許fullHD @ 30分辨率,但圖像質量可能很差(爲了符合USB 2.0的帶寬限制,壓縮率必須很高) – cbuchart