这可能很容易理解,但我没有在 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。

所以两个问题:
  • 为什么有必要将“颜色”归一化为其元素的平均值?
  • 为什么有 0.3 的最小限制? (据我了解 max() 函数)

  • 非常感谢!
    阿尔蒂

    最佳答案

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

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

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

    更好的方法是通过去除亮度分量并检查像素的色度来接近给定颜色。如果您有 YUV 源,则可以通过 Cr 和 Cb 组件轻松完成此操作。我的 GPUImageChromaKeyFilter 说明了从 RGB 输入中提取 YUV 数据,然后在色度周围应用阈值。这也是从 Apple 的一个例子中得出的(我相信这是来自他们的 ChromaKey WWDC 样本)。

    关于gpuimage - 布拉德·拉森阈值过滤器中的 normalizeColor,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13231919/

    10-13 07:48