从实时相机预览android

时间:2017-03-03 09:33:05

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

我正在尝试构建一个应用程序,可以检测皮肤不同部位(手,前额,脸颊)的肤色,无论光照条件如何。我能够使用这个project来做到这一点,但它没有照顾照明条件。这是Iphone app中的一个

1 个答案:

答案 0 :(得分:3)

如果您想自己进行一些图像处理,我建议您为图像的每个面部区域创建一个直方图。只要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中添加或添加颜色,那么您应该从另一个问题开始。