私は画像処理プログラマーです。私はopencv C++を使用しています。私が書いたプログラムの一部として、私は3つの入れ子になっています。最初の画像は異なる画像用、2つ目は画像の行用、3つ目は画像の列用です。 3つの間の依存関係はありませんし、それらは並列にエスケープすることができます(つまり、すべての画像のすべてのピクセルを並行して処理できます)。私は、並列プログラミング、GPUプログラミング、スレッド、tbb、並列のためのループに精通していません。そのようなことを示唆したインターネット上のさまざまなリンクを見つけました。私は私の問題のために最速の解決策が何かを知りたいですか? 私のOSは、Windowsで、私は、Visual Studioを使用しています2015年私のコードが入っている3つのネストされたforループを実行する最速の方法は何ですか?
次
int prjResCol[MAX_NUMBER_OF_PROJECTOR];
int prjResRow[MAX_NUMBER_OF_PROJECTOR];
Mat prjCamCor[MAX_NUMBER_OF_PROJECTOR][2]
Mat prjImgColored[MAX_NUMBER_OF_PROJECTOR];
for (int i = 0; i < numOfProjector; i++)
{
Mat tmp(prjResRow[i], prjResCol[i], CV_8UC3, Scalar(0, 0, 0));
prjImgColored[i] = tmp;
for (int ii = 0; ii < prjResRow[i]; ii++)
{
double* ptrPrjCamIAnd0 = prjCamCor[i][0].ptr<double>(ii);
double* ptrPrjCamIAnd1 = prjCamCor[i][1].ptr<double>(ii);
Vec3b* ptrPrjImgColoredI = prjImgColored[i].ptr<Vec3b>(ii);
for (int jj = 0; jj < prjResCol[i]; jj++)
{
if ((ptrPrjCamIAnd0[jj] != NAN_VALUE) && (ptrPrjCamIAnd1[jj] != NAN_VALUE))
{
ptrPrjImgColoredI[jj] = secondImgColored.at<Vec3b>(ptrPrjCamIAnd1[jj], ptrPrjCamIAnd0[jj]);
}
}
}
imwrite(mainAdr + "\\img" + to_string(i) + ".bmp", prjImgColored[i]);
}
小型で完全なサンプルを提供してください。タイプ( 'Mat、' 'Vec3b')に関するいくつかの変数(名前が' prj'で始まるもののようなもの)と 'CV_8UC3'(それが何であれ)の重要な情報を除外しました。その情報は重要です。コードを最適化するためには、誰かがそのことを理解する必要があるからです。 – Peter
プロファイルしましたか?あなたの制約は何ですか?画像は何枚ですか?大きさは?内部ループのどの処理ですか?これを知らずに「最適化」を開始するのは理にかなっていません。 – Miki
イメージの最大数は20です。各マットサイズは約2000 * 3000(行*列)です。 – Shahab