OpenCV 在 VideoCapture grab() 上挂起

OpenCV hangs on VideoCapture grab()

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

我运行在 OS X 中使用两个外部网络摄像头通过 USB 集线器、OpenCV 版本 10.4.11_1 和 C++。我不认为 USB 集线器会导致问题。坦率地说,判断何时冻结和不冻结的速度太慢,很难排除故障。我会摆脱 USB 集线器,但我最终需要它,而且我知道带宽不是问题。我可以 运行 多个(我试过 4 次)不同的 OpenCV 测试程序的实例,该程序从单个相机捕​​获,所有相机都通过 USB 集线器连接。

我想知道 VideoCapture class 中是否有一个内部缓冲区正在填满,或者其他一些内部问题,因为我似乎找不到关于 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 post 的计时器 class:

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

我无法想象我是唯一一个已经或将 运行 参与其中的人,所以如果我发现任何东西,我一定会 post 它。同时,我将永远感激您的帮助。

谢谢

我有一个部分解决方案,以防其他人遇到这个问题。我能够通过使用不同的网络摄像头来阻止我的程序冻结。最初我使用了两个名为 "Creative Live! Cam Chat HD, 5.7MP" 的网络摄像头,它们在其他方面似乎工作得很好,但是在用两个 Logitech c920 替换它们之后我能够让它工作。 (或者看起来是这样。我现在已经使用它们大约 1.5 个月了,有一次我看到它像以前一样冻结是在我添加代码以根据多线程程序中的 CLI 输入调整视频大小时。我也是出现段错误,所以这不是有力的证据。)

如果我发现为什么 Logitech 摄像头工作而其他摄像头不工作,我会 post 回复,但我的建议是如果有人遇到类似问题,请尝试使用不同的网络摄像头。