Opencv的image.empty()函数不起作用

时间:2015-12-30 06:33:36

标签: c++ opencv image-processing video-capture opencv3.0

以下代码正常运行,直到程序运行时移除USB摄像头。断开USB摄像头后,我看到一个空白图像,但该程序应该停止,因为img_cam1.empty()!cap_cam1.isOpened()应该为真。但由于某些原因,两者都是假的!

造成这种情况的原因是什么?

VideoCapture cap_cam1(0);
Mat img_cam1;

while(true)
{

    cap_cam1 >> img_cam1;

    if (img_cam1.empty() || !cap_cam1.isOpened())
    {                               
        cap_cam1.release();  
         break;                 
    }

    else {        
        imshow("Live",img_cam1); 
        if (!img_cam1.isContinuous())
           break;
        img_cam1.empty();               
        img_cam1.release();

        if(waitKey(33)==27) break; 
    }
}

如何在取下USB相机时停止程序?

1 个答案:

答案 0 :(得分:0)

来自Documentation(强调我的):

  

如果之前对VideoCapture构造函数或VideoCapture :: open的调用成功,则该方法返回true。

在您检查cap_cam1是否已打开之前,您似乎需要致电open。如下所示:

cap_cam1.open(1);
if (img_cam1.empty() || !cap_cam1.isOpened())

虽然我不知道确切的语法本身能够显示解决问题所需的确切代码。

关于img_cam1.empty()的问题我没有帮助,但empty()引用了img_cam1

  

如果Mat :: total()为0或者Mat :: data为NULL,则该方法返回true。由于pop_back()和resize()方法,M.total()== 0并不意味着M.data == NULL。

所以也许数据仍在setjmp()内,尽管如果没有调试我就不知道。