我正在尝试编写一个程序来同时(或几乎同时)从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
我无法想象我是唯一一个已经或将要遇到这种情况的人,所以如果我找到任何东西,我一定会发布它。与此同时,我将永远感激一些帮助。
由于