我正在尝试开发一个应用程序,该应用程序将在提供图像后检测面部颜色。我能够从 OpenCV 中找到人脸检测算法并将其集成。但是我找不到任何可以检测面部颜色的示例或界面。
我有我要呈现的逻辑。请让我知道是否有任何可用的东西,或者我需要为此编写单独的函数吗?
逻辑:在给定的图像区域中,找到在给定中重复最多的颜色细节。我已经浏览了直方图,但不确定它会有什么帮助。
任何帮助将不胜感激。
我正在尝试开发一个应用程序,该应用程序将在提供图像后检测面部颜色。我能够从 OpenCV 中找到人脸检测算法并将其集成。但是我找不到任何可以检测面部颜色的示例或界面。
我有我要呈现的逻辑。请让我知道是否有任何可用的东西,或者我需要为此编写单独的函数吗?
逻辑:在给定的图像区域中,找到在给定中重复最多的颜色细节。我已经浏览了直方图,但不确定它会有什么帮助。
任何帮助将不胜感激。
要检测人脸(或任何图像!)的肤色,我强烈建议您使用 HSV 颜色空间(或更复杂的颜色空间,例如 LAB)而不是默认的 RGB 颜色空间,因为 RGB 值会根据不同而有很大差异强或暗的照明和阴影等。而 HSV 在处理照明差异方面要好得多,它为您提供易于使用的颜色值。
HSV 表示 Hue-Saturation-Value,其中 Hue 是颜色。例如:0 的色调是红色,50 的色调可能是绿色。饱和度是灰度,因此饱和度值接近 0 意味着它看起来暗淡或灰色,而饱和度值 200 可能是非常强烈的颜色(例如:如果色调为 0,则为红色)。而Value是像素的亮度,所以0是黑色,255是白色。
因此,是否使用直方图取决于您,但无论哪种方式,您都应首先将图像转换为 HSV,然后您可以使用直方图或简单搜索来查找最常见的色调值。色调值将是您想要的肤色或颜色。如果你想让它更高级一点,你可以考虑饱和度和亮度值来决定它实际上是黑色、白色还是灰色,而不是颜色。
我的 HSV 教程页面上有更多 OpenCV RGB 到 HSV 的转换信息:
直方图表示图像中给定颜色的像素数量。
例如,假设您有这个 3x3 图像:
3 4 3 1 1 1 2 2 1
直方图为:计数:4 2 2 1 颜色:1 2 3 4
从这里你会发现发现最多的颜色是颜色 1。总结非常相似的颜色可能也是有意义的。
例如使用 count(2) = sum(hist(1), hist(2), hist(3)); (作为该颜色的像素数)
OpenCV 中没有这样的功能,这是有原因的。人脸检测是一个非常复杂的问题,只有少数几种方法可以完成这项工作。例如,OpenCV 实现了 Viola & Jones 人脸检测算法,该算法被称为最好的此类算法之一。其他一些实现使用神经网络等。
因此,一些一般复杂场景中的人脸检测问题并不像看起来那么容易。恐怕使用面部颜色信息不足以提供稳定的结果。有一些论文提出了这种技术,但算法工作的条件大多受到限制(例如,每张图像只有一张脸或非常简单的背景)。