VoodooCode
VoodooCode

Reputation: 287

OpenCV does not free camera

I'm trying to release the camera in OpenCV and reinitialize it another time, but the problem is, I cannot properly release the camera. Asking OpenCV, the cv::VideoCapture, whether the camer is open or not, it says closed, but the little LED is still glowing and I cannot create another VideoCapture object around the same camera.

This is the include I use:

  #include <opencv2/opencv.hpp>

This is a little sample of code showing the problem:

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; }
}

As already mentioned, the output says the camera is closed, but the LED is glowing. When I try to create a new VideoCapture around the camera it fails and says the camera is busy.

Any ideas?

Upvotes: 4

Views: 1917

Answers (1)

karlphillip
karlphillip

Reputation: 93410

This might be a bug of OpenCV 2.4.8 with some devices, you should check their bug tracker and post this issue there.

A fix for this problem might could be accomplished by putting the variable cap inside another scope:

{
    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;
    }
}

The documentation says that the camera will be deinitialized automatically in VideoCapture destructor.

The code should be enough to fix the problem. But as you noticed, the problem remains, so could be 1 of 2 things:

  • This is really an issue inside OpenCV;
  • There's a bug in driver of the camera, so updating it might solve the problem.

Upvotes: 1

Related Questions