【发布时间】:2013-05-16 22:26:55
【问题描述】:
短版:在 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 设置为当前帧,这意味着它将返回许多重复的帧帧。
这里提到过:
Problem accessing camera when using Boost thread on OSX
那个:
“Mac 上的 OpenCV 摄像头功能需要访问 Objective-c NSRunLoop;不过不知道如何从新线程中获取。”
有人知道从 main() 线程以外的线程进行阻塞帧抓取的解决方案吗? 或者,有没有丢弃重复帧的好方法?
谢谢
【问题讨论】:
标签: multithreading macos opencv camera capture