2017-12-13 20 views
0

私はRGBの画像を処理しており、各チャンネル(R + G + B)で同じことをしているので、コードを改善して実行するのに役立つ並列関数を探していました。 *?) もっと早く。今、イムので、同じようforEach機能を使用して:OpenCV forEach関数の並列アクセス

unsigned char lut[256]; 
for (int i = 0; i < 256; i++) 
    lut[i] = cv::saturate_cast<uchar>(pow((float)(i/255.0), fGamma) * 255.0f); //pow: power exponent 

dst.forEach<cv::Vec3b> //dst is an RGB image 
(
    [&lut](cv::Vec3b &pixel, const int* po) -> void 
    { 
     pixel[0] = lut[(pixel[0])]; 
     pixel[1] = lut[(pixel[1])]; 
     pixel[2] = lut[(pixel[2])]; 
    } 
); 

しかし、私は実行中のスレッドの数を確認するためにhtopを使用する場合、私は..

htop

上の1つのまたは2つのスレッドを見つける私がやっています何か間違っているかforEachmulti-threadingで実行されませんか? multi-threadingの計算に手伝ってくれるリソースがありますか?

私はこれでUbuntuの上で私のコードを実行している:

g++ -std=c++1z -Wall -Ofast -march=native test3.cpp -o test3 `pkg-config --cflags --libs opencv` 
+0

プラットフォーム固有のようです。 OpenCVのどのバージョン? v3.1.0のWindowsでは、すべてのコアを完全に使用します。 –

+1

@DanMašek私はLinuxでOpenCV 3.3を使用しています –

答えて

2

はすでにTBBで外観を撮影したことがありますか?あなたはTBBは、次の手順に従い採用することを決定した場合http://www.jayrambhia.com/blog/opencv-with-tbb

:スレッディング・ビルディング・ブロックは、あなたが

ON =フラグ-D WITH_TBBとOpenCVのコンパイルだけで使用することができ、並列コンピューティングのためのlibにはparallel_forは、この例を参照してくださいにライセンスはApacheです:

1 - TBBをサポートするOpenCVを再構築します。あなたがLinuxマシンに実行している場合だけ実行します。

cmakeの-D CMAKE_BUILD_TYPE = RELEASE -D CMAKE_INSTALL_PREFIX BUILD_TBB = ON ON =は/ usr/local -D WITH_TBB = ..

2 - 使用するようにプログラムを書き換えをTBB

ここでの回答を参照してください:Simplest TBB example最新のものに注目してください。

+0

私はTBBをアクティブ化していないことを理解しましたので、今すぐ実行します。私はちょうどフラグとopencvをインストールし、私のプログラムを再コンパイルするか、私はTBBのlibから関数を実装する必要がありますか? –

+0

私は自分の答えを更新しました。 – Doleron