我正在尝试使用GPU加速(DirectX / C ++)在2D图像上绘制多边形。
绘制完成后,我要遍历所有像素并对其进行评估,以获取最终/生成图像的“得分”(与目标图像比较)。最终分数应从GPU返回。
我知道从GPU读取会有很大的开销,但是我想要GPU而不是CPU(GDI +或openCV)的渲染速度。
我正在做类似EvoLisa的事情。
实现此目标的最佳方法是什么?
目前对分数的评估如下:
// Render image
cv::Mat generatedImage = EvoRenderer::render(individual, heigth, width, dimension, corners, parameters);
// Evaluate generated image
double* colors = new double[generatedImage.channels()];
for (int i = 0; i < generatedImage.channels(); ++i) {
colors[i] = double(0.0);
}
for (int j = 0; j < this->heigth; ++j)
for (int i = 0; i < this->width; ++i)
{
RGB& targetRGB = targetImage.ptr<RGB>(j)[i];
RGB& generatedRGB = generatedImage.ptr<RGB>(j)[i];
colors[0] += fabs(targetRGB.blue - generatedRGB.blue);
colors[1] += fabs(targetRGB.green - generatedRGB.green);
colors[2] += fabs(targetRGB.red - generatedRGB.red);
}
long double error = 0;
const double divider = 255.0 * this->width * this->heigth;
for (int i = 0; i < generatedImage.channels(); i++)
error += colors[i] / divider;
error *= double(100.0);
// Set fitnes to current individual
individual.setEval(error);
// Delete pointers
delete[] colors;