OpenCV的image.empty()函数无法正常工作

5
以下代码在USB相机运行时正常工作,但是当移除USB相机时出现问题。断开USB相机后,我看到一个空白图像,但程序应该停止,因为和都应该为真。然而由于某种原因两者都为假!这是什么原因呢?
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
似乎是一个错误。你尝试过使用 grabretrieve 的组合,而不是 >> 运算符吗? - sgarizvi
它是否会无限制地继续执行?还是在停止之前执行了一定数量的循环?即尚未更新。 - TheLethalCoder
此外,清晰地格式化您的代码,并在整个过程中以类似的风格编写将提高其可读性,从而使调试变得更加容易。 - TheLethalCoder
@sgarizvi,我尝试了grab&retrieve,read(),但我没有看到任何区别。事实上,当摄像头被移除时,imshow窗口变得很卡顿。 - Prakash M
@TheLethalCoder,它一直持续下去!我等了很长时间。 - Prakash M
isOpened的文档中可以看到:如果之前调用了VideoCapture构造函数或VideoCapture::open并成功,该方法将返回true。因此,在检查isOpened之前,您可能需要更改方法以调用open。如果这解决了第二个问题,请告诉我。 - TheLethalCoder
1个回答

1
文档(我强调)中得知:
如果之前的VideoCapture构造函数或VideoCapture::open调用成功,则该方法返回true。
看起来你需要在检查cap_cam1是否打开之前调用open。所以像下面这样:
cap_cam1.open(1);
if (img_cam1.empty() || !cap_cam1.isOpened())

虽然我自己不知道确切的语法,无法展示解决问题所需的精确代码。

关于img_cam1.empty()的问题,我无法提供帮助,但是empty()文档引用如下:

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

因此,也许img_cam1中仍然有数据,尽管没有调试,我不会知道。


似乎是Opencv本身的一个bug!无法使用cap_cam1.open(1);因为它会在while循环内不断重新打开摄像头..所以图像会闪烁。 - Prakash M
@PrakashM 我理解,但我对OpenCV了解不够,无法想到其他的“变通方法”。 - TheLethalCoder
@PrakashM 你也检查过当相机未插入时 img_cam1 是否有空数据吗? - TheLethalCoder
没问题,谢谢你的回复。img_cam1 不为空,因为 img_cam1.empty() 不为真。 - Prakash M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接