【发布时间】:2017-06-28 12:20:45
【问题描述】:
我是一名图像处理程序员,我正在使用 opencv C++。作为我编写的程序的一部分,我嵌套了三个 for。第一个用于不同的图像,第二个用于图像行,第三个用于图像列。三个 for 之间没有任何依赖关系,它们可以并行执行(我的意思是,所有图像的所有像素都可以并行处理)。我不熟悉并行编程、GPU 编程、线程、tbb、并行 for 循环和……。我在互联网上找到了建议此类事情的不同链接。我想知道解决我的问题的最快方法是什么? 我的操作系统是 windows,我使用的是 Visual Studio 2015。
我的代码如下:
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(不管是什么)的关键信息。这些信息至关重要,因为要优化您的代码,需要有人了解这些内容是什么。 -
你分析过它吗?你的限制是什么?几张图?什么尺寸?内循环中的哪个处理?不知道这一点就开始“优化”是没有意义的。
-
图片最多20张,每个Mat大小约为2000*3000(rows*columns)。
-
对于 20 张图片,第一个“for”不是问题。无需自定义优化即可非常快速地处理该大小的图像。这完全取决于您对图像所做的操作。您编写的内部循环几乎与它们一样快。分析他们,展示一些处理时间,然后我们会看到可以做什么
标签: c++ opencv image-processing parallel-processing gpu