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&lt;5; ++i) cap &gt;&gt; srcCap;?还是空的? 我没有尝试过,我认为问题可能与相机上的 CMOS 传感器对光的敏感性不如 CCD 传感器有关。但是将其嵌套在 for 循环中以拍摄多张照片可能会解决问题。我去看看! 所以它解决了这个问题,我没有通过在函数中创建一个布尔值并使用一个while循环来设置有限数量的尝试,在每次捕获后检查 srcCap.empty() 并且如果它比切换布尔值成功,应该也应该添加一个上限,这样它就不会陷入无限循环。 【参考方案1】:

我认为您当前的程序仅读取第一帧。大多数情况下,在读取相机帧时,第一帧可能不包含任何数据。

我建议您在 main() 中使用循环并阅读后面的帧。

【讨论】:

我也多次注意到这种行为。您对背后发生的事情有任何见解吗? 我认为这可能只是硬件启动或初始化和消息传递等的一部分。我尝试过的 Kinect 和许多网络摄像头在第一帧中给出了相同的空白帧。

以上是关于OpenCV C++ 相机图像未保存到矩阵的主要内容,如果未能解决你的问题,请参考以下文章

从 IplImage 中提取并保存图像

在 openCV 中快速将图像保存到磁盘

从我的相机应用程序拍照后,图片未保存到图库

OpenCV FFMPEG RTSP 相机馈送错误

opencv中16位的矩阵保存成图像,最大灰度值只有32768

在opencv c ++(移动相机)上检测运动