简短版本:在 OS X 上,如果我从 main() 线程以外的线程调用 VideoCapture::read(),则调用会立即返回,而不是阻塞直到新帧。
这个按预期工作:
void main()
{
VideoCapture vc(0);
Mat img;
While(1) {
vc.read( img ); // blocks till new frame arrives
}
}
这个不阻止:
void run( VideoCapture& vc )
{
Mat img;
While(1) {
vc.read( img ); // returns immediately and always returns true
}
}
void main()
{
VideoCapture vc(0);
boost::thread capThread( boost::bind( &run, vc ) );
capThread.join();
}
所以在第二个版本中,使用单独的线程来抓取帧,对 VideoCapture::read(img) 的调用立即返回,返回值为 true,并且 img 设置为当前帧,这意味着它将返回许多重复的帧。
这里提到:
那:
“Mac 上的 OpenCV 相机功能需要访问一个 Objective-c NSRunLoop;不过不知道如何从一个新线程中获得一个。”
任何人都知道从 main() 线程以外的线程进行阻塞帧抓取的解决方案?或者,有没有丢弃重复帧的好方法?
谢谢