OpenCV挂在VideoCapture抓()

时间:2016-02-07 05:23:17

标签: c++ opencv usb video-capture freeze

我正在尝试编写一个程序来同时(或几乎同时)从2个网络摄像头捕获图像,但有时当我运行我的程序时它会开始挂起。我的意思是它会使FPS降得如此之低,以至于每次捕获图像之间会有5到10秒的好时间。我决定制作一个更稀疏的程序,使用我认为可能导致问题的代码,以便我可以隔离源代码。果然,我的小程序引起了问题,但我对它们的原因感到难过。大多数情况下它会毫无错误地运行,但有时它会表现出相同的症状,即在运行代码的10秒到1分钟之间。没有错误,但从我的程序输出中我相信VideoCapture的grab()是减速线。

我在OS X中运行它,通过USB集线器,OpenCV版本10.4.11_1和C ++中有两个外部网络摄像头。我认为USB集线器不会导致问题。坦率地说,它告诉它什么时候会很慢并且不会冻结它很难排除故障。我会摆脱USB集线器,但我最终需要它,我知道带宽不是问题。我可以运行多个(我已经尝试了4个)不同OpenCV测试程序的实例,这些测试程序从单个摄像头捕获,所有摄像头都通过USB集线器连接。

我想知道VideoCapture类中是否有内部缓冲区正在填满,或者其他一些内部问题,因为我似乎找不到关于VideoCapture grab()函数的大量文档并找出它实际上是什么花了这么长时间才做。

感谢您阅读我冗长的描述。这是我的代码:

int main(){

VideoCapture vc1(1);
VideoCapture vc2(2);
Timer tmr;
Mat img1;
Mat img2;
namedWindow("WINDOW1", CV_WINDOW_NORMAL);
namedWindow("WINDOW2", CV_WINDOW_NORMAL);
waitKey(1);

int count = 0;

while (true){

    tmr.reset();
    vc1.grab();
    vc2.grab();
    cout << "Double grab time(" << ++count << "): " << tmr.elapsed() << endl;
    tmr.reset();
    vc1.retrieve(img1);
    vc2.retrieve(img2);
    cout << "Double retrieve time: " << tmr.elapsed() << endl;

    imshow("WINDOW1", img1);
    imshow("WINDOW2", img2);

    if (waitKey(25) == 27){
        cout << "Quit" << endl;
        break;
    }

}


return 0;
}

使用SO帖子中的这个计时器类:

class Timer
{
public:
    Timer() : beg_(clock_::now()) {}
    void reset() { beg_ = clock_::now(); }
    double elapsed() const {
    return std::chrono::duration_cast<second_>
    (clock_::now() - beg_).count(); }

private:
    typedef std::chrono::high_resolution_clock clock_;
    typedef std::chrono::duration<double, std::ratio<1> > second_;
    std::chrono::time_point<clock_> beg_;
};

并编译:

clang++ `pkg-config --libs --cflags opencv` -o test test.cpp

我无法想象我是唯一一个已经或将要遇到这种情况的人,所以如果我找到任何东西,我一定会发布它。与此同时,我将永远感激一些帮助。

由于

0 个答案:

没有答案