【问题标题】:Camera Initialization Failure in OpenCVOpenCV中的相机初始化失败
【发布时间】:2014-03-07 18:31:22
【问题描述】:

在 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.,所以我认为它已正确发布。

添加信息:在相机无法初始化的运行中,对&gt;&gt;/.read() 的调用需要很长时间才能返回。

编辑:正如@4nonymou5 所建议的那样,使用&gt;&gt; 运算符和.read() 之间没有区别。

【问题讨论】:

    标签: c++ opencv camera


    【解决方案1】:

    如果您的意思是,您需要从相机输出视频并希望对各个帧进行一些处理,那么以下代码可能会对您有所帮助。

    #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循环之前,它会起作用。

    【讨论】:

    • 感谢您的回答。我可以毫无问题地获取和使用相机信息;只是每隔一段时间,相机就会无缘无故地初始化失败,即你的线cap.isOpened()会失败;这就是为什么我有丑陋的while循环。我想知道为什么相机会断断续续地出现故障。
    • 是的,我在前段时间更改 opencv 的版本时遇到了类似的问题,但是,这不是相机的初始化,而是在访问帧时。 “ camera_ >> frame_full_; ”这为我返回了一个空帧,所以我在该行中添加了“camera_.read(frame_full_); ”,然后它就起作用了。所以,只要检查问题是否相同,即使我想听听别人的正确答案。
    猜你喜欢
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2012-11-17
    • 2017-12-10
    • 2018-09-17
    • 1970-01-01
    相关资源
    最近更新 更多