比较两个图像使用OpenGL

Comparing two images using OpenGL

本文关键字:图像 OpenGL 两个 比较      更新时间:2023-10-16

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

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

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

下面是一种可能的方法的概要。

  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(它要小得多)并在那里求和,要么创建一个单片段四边形并运行修改的求和着色器以到达一个数字,然后再读取。