使用OpenGL比较两个图像

时间:2013-06-15 15:25:04

标签: c++ performance opengl graphics

我正在编写一个程序来绘制一些应该模仿输入(光栅)图像的plygons。绘制形状后,我需要将我的渲染图像与输入图像进行比较,然后决定是否实现了目标。目前我正在使用CIMG库来绘制。整个程序在CPU上运行。我尝试使用使用OpenGL进行绘图的SFML - 渲染非常快,但是将图像从GPU复制到CPU(与输入图像进行比较)需要很长时间。 我想:

  • 在GPU上渲染多边形
  • 将输入(光栅)图像发送到GPU
  • 使用简单的“像素后像素”比较在GPU上比较图像: (r1-r2)^ 2 +(g1-g2)^ 2 +(b1-b2)^ 2
  • 发送比较结果(一个数字) 到CPU

不幸的是,我不知道是否可以通过OpenGL实现它(比较两个图像)。如果可能的话,我将学习OpenGL或任何其他能够快速完成任务的库。

1 个答案:

答案 0 :(得分:6)

以下是可能方法的概述。他们真的只是让你入门的秘诀。

  1. 将图像渲染为纹理(我将其称为Render)并将原始图像复制到另一个纹理中(我将其称为Orig)。禁用任何纹理过滤。

  2. 创建一个将计算差异的片段着色器。在伪代码中:

    vec3 render = texture2D(Render, fragmentPosition.xy);
    vec3 orig = texture2D(Orig, fragmentPosition.xy);
    gl_FragColor.r = (render - orig).dot(render - orig);
    

    在图像大小的四边形上运行此片段着色器,将输出发送到另一个纹理(我称之为Difference)。您可能需要启用矩形纹理。

  3. 创建另一个片段着色器以计算部分和:

    float sum = 0;
    for (row = 0; row < imageHeight; ++row) {
      sum += texture2D(Difference, vec2(fragmentPosition.x, row));
    }
    gl_FragColor.r = sum;
    

    在四边形image_width x 1上运行此片段着色器,将输出发送到另一个纹理(PartialSum)。

  4. 要么回读PartialSum到CPU(它要小得多)并在那里求和,要么创建单片段四元组并运行修改后的求和着色器以得到一个数字,而不是读回来