OpenCV を使用して組み込み Linux コンピューターで実行するために開発しているリアルタイム コンピューター ビジョン プログラムのキャプチャ パフォーマンスを改善しようとしています。複数のスレッドと共有メモリ バッファを使用して、(1) ビデオ フレームのキャプチャと (2) それらの処理 (「生産者/消費者の問題」と思われます) のタスクを分離したいと考えています。pthread、mutex 変数、および条件変数について調べましたが、それらを関数でどのように使用する必要があるかわかりませんselect()
。
現在、ビデオ フレームは、Video4Linux2 Video Capture Exampleを利用したコードを使用してキャプチャされselect()
ます。私が理解しているようにselect()
、ウェブカメラからデータが利用可能になるまでプログラムをブロックします。これは遅くなり、時間の大幅な無駄になる可能性があります。できれば、その無駄な CPU サイクルを画像処理に使用したいと考えています。(もちろん、これは常に 1 フレーム分「古くなった」画像に対して処理を行う必要があることを意味しますが、30 fps では実質的にリアルタイムになります)。
とを使用して共有データを保護するサンプル コードをいくつか見つけましたが、 . より具体的には、私の懸念を説明するための疑似コードを次に示します。(注:これらのスレッドが実際に正しく機能するには、上記のリンクされた例のようなループやその他のチェックを含める必要があることを認識しています。)pthread_mutex_lock()
pthread_mutex_control()
select()
void* capture()
{
pthread_mutex_lock(&mutex); // protect shared data
pthread_cond_wait(&space_avail,&mutex); // make sure the buffer has room
/// capture code... ///
select(fd+1, &fds, NULL, NULL, &tv); // waiting for data...
// Want to be processing frames
// during select, but won't the
// processing thread be blocked
// by the mutex lock?
// store image to the frame buffer
/// more capture code... ///
pthread_cond_signal(&data_avail);
pthread_mutex_unlock(&mutex);
}
void* process()
pthread_mutex_lock(&mutex);
pthread_cond_wait(&data_avail);
// access the most recently stored frame from the buffer
/// Do image processing ///
pthread_mutex_signal(&space_avail);
pthread_mutex_unlock(&mutex);
}