OpenCV C++ 相机图像未保存到矩阵
Posted
技术标签:
【中文标题】OpenCV C++ 相机图像未保存到矩阵【英文标题】:OpenCV C++ camera image not being saved to matrix 【发布时间】:2015-04-02 20:03:34 【问题描述】:我在 Visual Studios 2012 Express 上使用 openCV 2.4.10 用于 Windows 7、32 位操作系统的桌面。
我创建了一个函数来初始化网络摄像头,获取图像并将其存储在矩阵中,然后返回图像矩阵。
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 函数抛出一个断言错误。但是,该程序有时会运行并成功返回图像。此外,当我将函数合并到一个循环中进行图像处理时,它有时会拍几张照片,然后随机吐出“图像中没有数据”并抛出相同的断言错误,或者根本不会拍第一张照片并吐出“图像中没有数据”,抛出相同的断言错误。每次都检测到摄像头,开盖;代码从不说“未检测到摄像头”
我的问题是什么导致 cap >> srcCap 不起作用,是硬件问题吗?我使用的相机是 USB 2.0 可插拔显微镜。
【问题讨论】:
如果您捕获多于一帧会发生什么,例如for (int i=0; i<5; ++i) cap >> srcCap;
?还是空的?
我没有尝试过,我认为问题可能与相机上的 CMOS 传感器对光的敏感性不如 CCD 传感器有关。但是将其嵌套在 for 循环中以拍摄多张照片可能会解决问题。我去看看!
所以它解决了这个问题,我没有通过在函数中创建一个布尔值并使用一个while循环来设置有限数量的尝试,在每次捕获后检查 srcCap.empty() 并且如果它比切换布尔值成功,应该也应该添加一个上限,这样它就不会陷入无限循环。
【参考方案1】:
我认为您当前的程序仅读取第一帧。大多数情况下,在读取相机帧时,第一帧可能不包含任何数据。
我建议您在 main() 中使用循环并阅读后面的帧。
【讨论】:
我也多次注意到这种行为。您对背后发生的事情有任何见解吗? 我认为这可能只是硬件启动或初始化和消息传递等的一部分。我尝试过的 Kinect 和许多网络摄像头在第一帧中给出了相同的空白帧。以上是关于OpenCV C++ 相机图像未保存到矩阵的主要内容,如果未能解决你的问题,请参考以下文章