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();
}

したがって、フレームを取得する別のスレッドを使用する 2 番目のバージョンでは、VideoCapture::read(img) への呼び出しは戻り値 true ですぐに戻り、img は現在のフレームに設定されます。つまり、多くの重複フレームが返されます。

ここで言及されています:

OSX で Boost スレッドを使用しているときにカメラにアクセスする際の問題

それ:

「Mac の OpenCV カメラ機能には、objective-c NSRunLoop へのアクセスが必要ですが、新しいスレッドからアクセスする方法がわかりません。」

main() スレッド以外のスレッドからブロッキング フレーム グラブを実行する解決策を知っている人はいますか? または、重複したフレームを破棄する良い方法はありますか?

ありがとう

4

1 に答える 1

1

OpenCV はマルチスレッドをサポートしていません。

メイン スレッドにフレームをキャプチャさせ、2 番目のスレッドで必要なことをすべて実行させます。

于 2013-05-22T03:51:44.657 に答える