比较两个图像使用OpenGL
Comparing two images using OpenGL
我正在写一个程序,画一些应该模仿输入(光栅)图像的多边形。在绘制形状之后,我需要将我的渲染图像与输入图像进行比较,然后决定我是否达到了我的目标。目前我正在使用CIMG库绘制。整个程序运行在CPU上。我尝试使用SFML,它使用OpenGL进行绘图-渲染非常快,但将图像从GPU复制到CPU(与输入图像进行比较)需要很长时间。我想:
- 在GPU上渲染多边形
- 发送输入(光栅)图像到GPU
- 使用简单的"逐像素"比较GPU上的图像:(r1-r2) ^ 2 + (g1-g2) ^ 2 + (b1 b2) ^ 2
- 发送比较结果(一个数字)CPU
不幸的是,我不知道它(比较两张图像)是否可以用OpenGL实现。如果可能的话,我将学习OpenGL或任何其他库,它可以非常快地完成我的任务。
下面是一种可能的方法的概要。
-
将图像渲染为纹理(我称之为
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(它要小得多)并在那里求和,要么创建一个单片段四边形并运行修改的求和着色器以到达一个数字,然后再读取。
相关文章:
- 我在 OpenGL 中显示图像时遇到问题
- 如何显示具有 opengl 纹理的灰度图像
- opengl SOIL 库仅加载未压缩的 dds 图像
- 使用 OpenGL 加载图像时0x69ABF340 STBI_Image引发异常
- OpenGL如何知道将哪个图像单元附加到制服上?
- OpenGL (ES) 图像处理C++
- 如何将硬编码图像加载到 OpenGL 纹理中
- 如何将图像转换为灰度 opengl c++
- OpenGL - SOIL 不会加载 JPG 或 PNG 图像
- QT QML 中的 OpenGL,无法更新屏幕上的图像
- 使用 qt 和 opengl、定时精度和垂直同步问题、c++ 显示图像
- OpenGL纹理格式,为OpenGL创建图像/纹理数据
- stb_image在加载 opengl 纹理的图像时不会垂直翻转
- OpenGL?中用于渲染的平面图像的高效传输
- 使用C++和OpenGL显示图像的正确方法
- 当我添加OpenGL转换时,我的图像不断消失
- OpenGL图像加载64位深度
- 格式转换在OpenGL图像中
- Openframeworks-通过OpenGL调用从图像中心旋转图像
- 如何在OpenGL中将两个不同的图像渲染为两个不同图元?2D纹理阵列