繁体   English   中英

OpenCV挂在VideoCapture handle()上

[英]OpenCV hangs on VideoCapture grab()

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

我在OS X中运行此程序,并通过USB集线器(OpenCV版本10.4.11_1)和C ++在两个外部摄像头中运行。 我不认为USB集线器引起了问题。 坦率地说,很难确定何时会冻结,并且很难冻结。 我会摆脱USB集线器,但最终还是需要它,我知道带宽不是问题。 我可以运行一个不同的OpenCV测试程序的多个(我已经尝试过4个)实例,这些实例从单个摄像机捕获,并且所有摄像机都通过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

我只是无法想象自己是唯一拥有或将要遇到这个问题的人,因此,如果发现任何问题,我一定会发布。 同时,我将永远感谢您的帮助。

谢谢

我有部分解决方案,以防其他人遇到此问题。 通过使用其他网络摄像头,我得以停止冻结程序。 最初,我使用了两个名为“ Creative Live!Cam Chat HD,5.7MP”的网络摄像头,这些摄像头似乎可以正常工作,但是用两台Logitech c920代替它们后,我就可以使用它。 (或者看起来。我现在已经使用它们约1.5个月了,有一次我看到它像以前一样冻结了,当时我正在添加代码以根据多线程程序中的CLI输入来调整视频的大小。出现断层故障,因此并不是完全有力的证据。)

如果我找出了Logitech摄像机为什么在其他摄像机无法正常工作的情况下仍能正常工作的原因,我会发表回复,但是我的建议是,如果有人遇到类似问题,请尝试使用其他网络摄像头。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM