我是一名图像处理程序员,我正在使用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