首页 文章

使用OpenGL比较两个图像

提问于
浏览
2

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

  • 在GPU上渲染多边形

  • 将输入(光栅)图像发送到GPU

  • 使用简单的"pixel after pixel"比较GPU上的图像:(r1-r2)^ 2(g1-g2)^ 2(b1-b2)^ 2

  • 将比较结果(一个数字)发送到CPU

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

1 回答

  • 5

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

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

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

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

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

    • 创建另一个片段着色器以计算部分总和:
    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 ) .

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

相关问题