2017-09-03 10 views
2

Hey!だから私はOpenCVを使ったマルチスレッドに関する課題に取り組んでいます。私の質問は次のとおりです。すべてのスレッドが同じ画像(Matに保存されている)で動作するようにするにはどうすればよいですか?私はコピーを作ることが遅くなることを知っているので、マルチスレッドは意味をなさないでしょう。また、私は使用するスレッドの数を制御したいと思います。そして、ラムダC++ 11が導入されたのを見ても、スレッドの数を制御する方法はわかりません。Matsを使用したOpenCVマルチスレッド

シリアルで実行している私のコードは次のようになりますので、私は現在、画像に置くべきすべてのピクセルを計算する関数があります。

for(int i=0;r<MyMat.cols;i++){ 
    for (int j=0;j<MyMat.rows;j++){ 
     uchar value = (uchar) MyFunction(i,j); 
     MyMat.ptr<uchar>(i)[j] = value; 
    } 
} 

私は説明しなかった場合、英語は、私の母国語ではありません私は適切に説明を求めてください。どんな助けが良い助けです!

+0

'Mat'を修正すると、元の' Mat'のハードコピーが必要な場合があります。 'Mat'を変更しないスレッドの場合、グローバル変数を使って' Mat'を割り当てることができます。 –

+0

opencv Matについてはそれほど特別なことはありません。 1つのすてきな機能は、各行の最後にパディングを追加することができます。これにより、素敵なメモリアクセス動作を得るのに役立つかもしれません。イメージを "変更"する必要がある場合は、実際の修正ではなく別のマットに結果を保存することができます。 – Micka

答えて

3

イメージを水平バンドに分割すると、各スレッドは独自のバンドで個別に作業できます。各スレッドがバンドを越えてイメージデータを変更しない場合、それは機能するはずです。

実際、OpenCVはこれを既にサポートしています。 parallel_for_とその使い方を見てください。

+0

ありがとう!私はparallel_forを見てきましたが、私が作成するスレッドの数を制御したいのですが、これまでparallel_forを使ってどのように行うのか分かりません。実際にはマニュアルのMandelbrotの例を読んでください。 –

+0

'setNumThreads()'を使うことができます –

+0

ありがとう!私はそれを見てください –

関連する問題