【问题标题】:Detect skin color from live camera preview android从实时相机预览android中检测肤色
【发布时间】:2023-03-18 11:55:01
【问题描述】:

我正在尝试构建一个应用程序,该应用程序可以检测皮肤不同部位(手、前额、脸颊)的肤色,而不受光照条件的影响。我可以使用这个project 来做到这一点,但它不考虑照明条件。这是Iphone app 中的一个

【问题讨论】:

    标签: android opencv image-processing camera color-detection


    【解决方案1】:

    如果您想自己进行一些图像处理,我建议您为图像的每个面部区域创建一个直方图。只要opencv能够检测到人脸,你就应该能够对该区域的直方图进行归一化,并取归一化版本的颜色值。

    也许您想分别归一化所有通道(R、G、B)以减少彩色光的影响。

    阅读此处了解有关直方图的更多信息:https://en.wikipedia.org/wiki/Histogram

    当您按照这种方式进行操作时,我强烈建议您将一张脸作为一个整体区域来创建直方图。

    [编辑]

    既然我知道你想做什么,我认为你可以采取以下方法:

    如您所见,用户需要前后点击摄像头。由于图像由手机背面引导,直方图确实正是该应用程序的创建者正在创建的。但是,不是来自不同的像素,而是来自使用不同光照级别的同一像素的不同样本。

    当您非常靠近皮肤时,相机会显示近乎白色的图像,即,如果您愿意,可以显示直方图计算的“固定点”。

    虽然我不打算展示直接代码,但我会尝试解释数学模型:

    • 在图像中定义一个“焦点”区域。该区域是您在计算直方图时考虑的区域。边缘的所有其他区域都将被忽略。
    • 采集一些样本(例如 3 秒,每秒 10 个样本 = 30 个样本)
    • 创建每个样本的直方图并将它们相加:
      • 对于每个亮度值(最多 256 个)计算与该值匹配的像素数,将所有样本加在一起
      • 找出至少有一个threshold 值的最高和最低值(如果你喜欢,你的“工作”范围)并将它们称为histLowhistHigh
      • 重新计算每个像素,使pixel = (pixel-histLow) / (histHigh-histLow) * 255
      • 将像素值限制在 0 - 255 范围内
      • 取较窄范围内的像素的平均颜色值(例如,只取最高数量的样本)

    如果您不知道如何在 RGB 中相乘或相加,那么您应该从另一个问题开始。

    【讨论】:

    • 你能告诉我一些示例代码吗?查看此应用程序检测颜色的视频youtube.com/watch?v=dz5hLvjt9J8
    • 也许您应该将此视频链接添加到您的问题中,以提供有关您正在尝试做什么的信息。现在我得到了你试图达到的目标,这使得我的回答大多不准确。我将相应地改变我的答案。
    • 当然。等待您的答复。
    • 感谢您的明确解释,我将尝试通过采集不同的样本来创建直方图,并会回复您。此外,他们使用 5 张白纸来校准手机照明条件。在应用上述逻辑时我是否必须考虑这一点?
    • 这是需要你自己研究的东西。您应该尝试一下您可以做什么以及您的代码在处理偏差方面的能力。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2011-05-24
    • 1970-01-01
    • 2012-07-04
    相关资源
    最近更新 更多