2014-02-10 21 views
0

在OpenCV中 - 当使用USB网络摄像头初始化一个VideoCapture对象时,每2或3次运行一次,相机将无法初始化。我有这个令人难以置信的丑陋的代码来解决这个问题,但也许有人知道可能导致相机初始化失败的原因以及如何防止它?OpenCV中的摄像机初始化失败

// Initialize video capture 
camera_ = cv::VideoCapture(1); 
camera_.set(CV_CAP_PROP_CONVERT_RGB , false); 

camera_ >> frame_full_; 
while (frame_full_.empty()){ // Could be !cap.isOpened 
    cerr << "Camera failure." << endl; 
    camera_.release(); 
    camera_ = cv::VideoCapture(1); 
    camera_.set(CV_CAP_PROP_CONVERT_RGB , false); 
    camera_ >> frame_full_; 
} 

/// Do something with the camera feed. 

当我关闭程序时,我得到在控制台Cleaned up camera.,所以我想它被释放正确。

新增信息:在其中利用相机无法初始化,调用>>/.read()的运行需要很长的恢复。

编辑:没有使用>>运营商和.read(),如@ 4nonymou5建议之间没有什么区别。

回答

0

如果您的意思是,您需要使用摄像头进行视频输入,并且希望对各个帧进行一些处理,以下代码可能对您有所帮助。

#include "opencv2/highgui/highgui.hpp" 
#include <iostream> 

using namespace cv; 
using namespace std 
int main(int argc, char *argv[]) 
{ 
    VideoCapture cap(1); 
if (!cap.isOpened()) // if not success, exit program 
{ 
    cout << "Cannot access camera" << endl; 
    return -1; 
} 
namedWindow("cam",1); 
while(true) 
     { 
     Mat frame; 
     bool check = cap.read(frame); // read a new frame from video 

     if (!check) //if not success, break loop 
     { 
        cout << "Cannot read the frame from video file" << endl; 
        break; 
     } 

// do what ever processing you want to do on frame 

     imShow("cam", frame); 
     waitKey(33); 
    } 
return 0; 
} 

并为您的代码来响应, 只是while循环,它会工作前加

camera_.read(frame_full_); 

+0

感谢您的回答。我没有问题得到相机饲料和使用它;这只是偶尔,相机无法初始化,因为没有明显的原因,即你的线'cap.isOpened()'会失败;这就是为什么我有丑陋的while循环。我想知道为什么相机会间歇性地失效。 – noio

+0

是的,我有一个类似的问题,当我改变opencv的版本的时候回来,但是,它不是摄像头的初始化,但是,在访问帧。 “camera_ >> frame_full_;” 这是为我返回一个空框架,所以我补充说,“camera_.read(frame_full_);” 到线,它的工作。 因此,只要检查问题是否相同,即使我想听到其他人的正确答案。 – 4nonymou5