我是一名圖像處理程序員,我正在使用opencv C++。作爲我寫的一個程序的一部分,我有三個嵌套。第一個是用於不同的圖像,第二個用於圖像的行,第三個用於圖像的列。三者之間沒有任何依賴關係,他們可以並行執行(我的意思是,所有圖像的所有像素都可以並行處理)。我並不熟悉並行編程,GPU編程,線程,tbb,並行循環和...。我發現互聯網上的不同鏈接提出了這樣的建議。我想知道什麼是我的問題最快的解決方案? 我的操作系統是Windows和我使用的Visual Studio 2015年執行三個嵌套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]);
}
嘗試提供一個MCVE - 一個小但完整的樣本。你已經忽略了關於類型('Mat,''Vec3b')的幾個變量(像名稱以'prj'開始的變量)和'CV_8UC3'(不管那是什麼)的關鍵信息。這些信息是至關重要的,因爲爲了優化你的代碼,有人需要了解這些東西是什麼。 – Peter
你有簡介嗎?你的約束是什麼?多少圖片?什麼尺寸?內循環中的哪些處理?如果不知道這一點,開始「優化」是沒有意義的。 – Miki
圖像的最大數量是20.每個墊子大小約爲2000 * 3000(行*列)。 – Shahab