OpenCV中的相机初始化失败

时间:2014-02-10 12:16:18

标签: c++ opencv camera

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

// 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()的调用需要很长时间才能返回。

修改:按照@ 4nonymou5的建议,使用>>运算符和.read()之间没有区别。

1 个答案:

答案 0 :(得分: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;
}

并为您的代码做出回应, 添加

camera_.read(frame_full_);

就在while循环之前,它会起作用。