以下代码正常运行,直到程序运行时移除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相机时停止程序?
答案 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()
内,尽管如果没有调试我就不知道。