2015-04-02 54 views
0

我在windows 7,32位操作系統上的visual studio 2012 express上使用openCV 2.4.10。OpenCV C++攝像頭圖像未保存到矩陣

我創建了一個函數,用於初始化攝像頭,拍攝圖像並將其存儲在矩陣中,然後返回圖像矩陣。

Mat frameCapture() 
{ 
Mat srcCap; 
//initializes structure type of cap 
VideoCapture cap(0); 
if(!cap.isOpened()) 
{ 
    //check for camera 
    cout << "No camera detected" << endl; 
    waitKey(10); 
} 
//stores next frame into matrix 
cap >> srcCap; 
//check to see the camera took a picture 
if(srcCap.empty()) 
{ 
    cout << "no data in image\n"; 
} 
//return the image matrix 
cap.release(); 
return srcCap; 
} 

int main() 
{ 
Mat src; 
src = frameCapture(); 
imshow (window1, src); 
waitKey(0); 
} 

所以運行程序時,它會說「圖像無數據」意味着srcCap.empty()返回true,然後它會拋出斷言錯誤的imshow功能。但是,程序有時會運行併成功返回圖像。此外,當我將函數併入圖像處理的循環中時,它有時會拍攝幾張照片,然後隨機吐出「圖像中沒有數據」並拋出相同的斷言錯誤,或者根本不會拍攝第一張照片並吐出「圖像中沒有數據」,並拋出相同的斷言錯誤。每次檢測到照相機並打開蓋子;代碼從來沒有說「沒有相機檢測」

我的問題是什麼導致帽>> srcCap無法正常工作,這是硬件問題?我使用的相機是一個USB 2.0可插拔顯微鏡。

+0

如果您捕獲多個幀(例如, 'for(int i = 0; i <5; ++ i)cap >> srcCap;'?仍然是空的? – nils 2015-04-02 20:46:15

+0

我還沒有嘗試過,我認爲這個問題可能與相機上的CMOS傳感器對光線不如CCD傳感器敏感有關。但將其嵌套在for循環中以拍攝多張照片可能會解決問題。我會看看! – jschnitz1 2015-04-02 21:57:22

+0

所以它解決了這個問題,我做到了,而不必通過在函數中創建布爾值並使用while循環來設置有限的嘗試次數,在每次捕獲之後檢查srcCap.empty(),並且如果它是成功的,而不是切換布爾值值,也許應該增加一個上限,所以它不會卡在無限循環中。 – jschnitz1 2015-04-02 22:59:28

回答

0

我認爲你目前的程序只是讀取第一幀。大多數情況下,當讀取相機框時,第一幀可能不包含任何數據。

我建議你在main()中使用循環並讀取後面的幀。

+0

我也注意到這種行爲。你有沒有對後面發生的事情有所瞭解? – nils 2015-04-03 06:49:55

+0

我想也許它只是硬件啓動或初始化和消息傳遞措施等的一部分。Kinect和我試過的許多攝像頭在第一幀中給出了相同的空白幀。 – 2015-04-04 13:33:11