3

这可能很容易理解,但我没有在 Brad Larson 的 GPUImage 中使用 normalizeColor 函数。例如,您可以在 Threshold.fsh 下的 colorObjectTracking 示例中找到它:

vec3 normalizeColor(vec3 color)
{
   return color / max(dot(color, vec3(1.0/3.0)), 0.3);
}

这是我得到的:您将传入的颜色“颜色”除以 0.3 或除以颜色矢量的点积,如果是点积的结果,则为 (1/3,1/3,1/3)大于 0.3。

所以两个问题:

  1. 为什么有必要将“颜色”标准化为其元素的平均值?
  2. 为什么最小限制为 0.3?(据我了解 max() 函数)

非常感谢!阿尔蒂

4

1 回答 1

2

提出这个问题的更合适的地方可能是项目站点本身,但我会咬一口。

片段着色器的重点是识别图像中具有特定颜色的像素。该函数对颜色的亮度进行粗略的归一化,以便在匹配对象上的颜色时可以考虑不同的照明条件。那里的max()操作只是一个上限,以防止在某些颜色值下事情变得非常古怪。

这个特定的片段着色器完全基于 Apple 的 Core Image 工程师在他们的 GPU Gems 文章“Object Detection by Color: Using the GPU for Real-Time Video Image Processing”中提供的示例,并且他们更详细地介绍了它那里。

更好的方法是通过去除亮度分量并检查像素的色度来接近给定颜色。如果你有 YUV 源,你可以很容易地从 Cr 和 Cb 组件中做到这一点。我的 GPUImageChromaKeyFilter 说明了从 RGB 输入中提取 YUV 数据,然后在色度周围应用阈值。这也是从 Apple 的一个示例中得出的(我相信这是来自他们的 ChromaKey WWDC 示例)。

于 2012-11-05T19:11:05.567 回答