1

简短版本:在 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 设置为当前帧,这意味着它将返回许多重复的帧。

这里提到:

在 OSX 上使用 Boost 线程时访问相机时出现问题

那:

“Mac 上的 OpenCV 相机功能需要访问一个 Objective-c NSRunLoop;不过不知道如何从一个新线程中获得一个。”

任何人都知道从 main() 线程以外的线程进行阻塞帧抓取的解决方案?或者,有没有丢弃重复帧的好方法?

谢谢

4

1 回答 1

1

OpenCV 不支持多线程。

让主线程捕获帧并在第二个线程中执行您需要执行的任何操作。

于 2013-05-22T03:51:44.657 回答