短いバージョン: 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();
}
したがって、フレームを取得する別のスレッドを使用する 2 番目のバージョンでは、VideoCapture::read(img) への呼び出しは戻り値 true ですぐに戻り、img は現在のフレームに設定されます。つまり、多くの重複フレームが返されます。
ここで言及されています:
OSX で Boost スレッドを使用しているときにカメラにアクセスする際の問題
それ:
「Mac の OpenCV カメラ機能には、objective-c NSRunLoop へのアクセスが必要ですが、新しいスレッドからアクセスする方法がわかりません。」
main() スレッド以外のスレッドからブロッキング フレーム グラブを実行する解決策を知っている人はいますか? または、重複したフレームを破棄する良い方法はありますか?
ありがとう