OpenCV无法释放相机资源

4

我正在尝试在OpenCV中释放相机并重新初始化,但问题是我无法正确释放相机。询问OpenCV中的cv :: VideoCapture,相机是否打开,它说已关闭,但小LED仍然发光,并且我无法在同一相机周围创建另一个VideoCapture对象。

这是我使用的包含:

  #include <opencv2/opencv.hpp>

这是一个展示问题的简短代码示例:
cv::VideoCapture cap(0);

for(int i = 0; i < 20; i++) {
    cv::Mat frame;
    cap >> frame;

    cv::imshow("Test", frame);
    if (cv::waitKey(30) >= 0) { break; }
}

cap.release();
std::cout << "Camera is closed is : " << !cap.isOpened() << std::endl;

while(true) {
    if (cv::waitKey(30) >= 0) { break; }
}

如前所述,输出显示相机已关闭,但LED灯仍在闪烁。当我尝试在相机周围创建一个新的VideoCapture时,它失败了,并显示相机正忙。

有什么想法吗?


2.4.8,抱歉忘了提到 - VoodooCode
1个回答

1
这可能是OpenCV 2.4.8与某些设备存在的一个bug,您应该检查他们的bug跟踪器并在那里发布此问题。解决此问题的方法可能是将变量“cap”放在另一个作用域中:
{
    cv::VideoCapture cap(0);

    for(int i = 0; i < 20; i++) {
        cv::Mat frame;
        cap >> frame;

        cv::imshow("Test", frame);
        if (cv::waitKey(30) >= 0) 
            break;
    }
} 

/* At this point, cap was destroyed and your camera should be operational again */     

{
    cv::VideoCapture cap(0);

    for(int i = 0; i < 20; i++) {
        cv::Mat frame;
        cap >> frame;

        cv::imshow("AnotherTest", frame);
        if (cv::waitKey(30) >= 0) 
            break;
    }
}

文档中说,相机将在VideoCapture析构函数中自动取消初始化。

这段代码应该足以解决问题。但是正如您所注意到的那样,问题仍然存在,可能有以下两种情况之一:

  • 这实际上是OpenCV内部的问题;
  • 相机驱动程序存在错误,因此更新它可能会解决问题。

刚刚测试了你的代码,但是它失败了,显示如下信息:HIGHGUI 错误:V4L/V4L2: VIDIOC_CROPCAP HIGHGUI 错误:V4L/V4L2: VIDIOC_CROPCAP VIDIOC_REQBUFS:设备或资源忙 VIDIOC_QBUF:坏文件描述符前两个错误并不重要,它们在目前任何版本的OpenCV中都会出现。 - VoodooCode
好的,在作用域结束之前调用cap.release()。无论如何,文档中说相机将在VideoCapture析构函数自动取消初始化,因此我的代码应该足以解决问题。但正如您所注意到的,问题仍然存在,所以很可能这是OpenCV的问题。 - karlphillip
也不起作用。奇怪的是,在调用release()之后,当我询问cap是否关闭时,它说它已经关闭了... - VoodooCode
1
刚刚检查了一下,我想我会听从你的建议,等待OpenCV的更新。感谢你的帮助。 - VoodooCode

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