计算OpenGL纹理相似度/距离的最快方法?

时间:2011-12-30 02:24:05

标签: opengl image-processing graphics computer-vision

这就是我所拥有的:

  1. 我从磁盘加载一个纹理,比如256x256,说一张penguin的图片
  2. 我创建了另一个具有相同尺寸的纹理,并在其上绘制了一些东西
  3. 我想找到两个openGL纹理之间的距离尽可能快(距离函数的准确性是最不重要的)。

    实际上,它们最初可能不是纹理。 我不妨将帧缓冲区域与加载的纹理进行比较,或者做一些其他的“魔术”。

    如何做到超级快?

2 个答案:

答案 0 :(得分:5)

事实上,这与OpenGL几乎没有关系。 OpenGL只是一个3D光栅化“驱动程序”。

主要思想是获得距离/相似度算法,这是一项棘手的任务。首先,您可以执行Root Mean Square Deviation算法。它会给你一些像素值的距离。

当您在CPU上实施它时,您可以根据需要对其进行基准测试,并可能转换为OpenCL。我不认为将“企鹅”加载到GPU只是为了将它与你准备的其他形状进行比较,它本身就是一个超快的过程。

尝试更加具体地说明你的下一个问题,并避免采用“我有一个非常好的显微镜,我怎么用超快速打钉子?”的态度。

答案 1 :(得分:2)

您可以使用Pearson-Product匹配不同的图像。你可以在answer找到它。您可以直接关联两个图像,而不是将模板与原始图像匹配得更少。

很快,您会得到每个textel与平均值的偏差,从而为您提供相关因子。

但是使用着色器改进该算法可能有点困难。首先,你必须计算textel平均值:也许一些OpenGL扩展(如直方图)可以帮助你完成这项任务。

然后,您可以使用片段着色器执行单分量计算(每个textel与之前计算的平均值之间的差异。平均textel必须以均匀的方式传递,结果应存储在浮点纹理中(您可以在帧缓冲对象上渲染它。)

然后,你应该总结得到的纹理的所有textel,以获得两个源纹理之间的相关性。

在图像非常大的情况下,这可能是值得的。否则我认为最好在CPU上执行算法,使用SIMD指令集(如MMX,SSE,AVX)。