2015-04-02 102 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