我目前正致力于一个强大的手部检测系统。
第一步是拍摄手的照片(在HSV色彩空间中),将手放在一个小矩形中以确定肤色。然后,我应用阈值滤波器将所有非皮肤像素设置为黑色,将所有皮肤像素设置为白色。
到目前为止它运作良好,但我想问一下是否有更好的方法来解决这个问题?例如,我发现一些文章提到了白种人的具体色彩空间,但没有一篇提到亚洲/非洲/白人色调的比较。
顺便说一句,我正在通过Python绑定使用OpenCV。
答案 0 :(得分:24)
您是否看过Gary Bradski的camshift纸?您可以从here
下载我在一年前使用皮肤检测算法来检测皮肤区域以进行手部跟踪,并且它非常强大。这取决于你如何使用它。
使用颜色进行跟踪的第一个问题是,当人们有不同的肤色时,它对于照明变化或者你提到的不一样。但是,如本文所述,这可以很容易地解决:
扔掉HSV中的V通道,只考虑H和S通道就足以(令人惊讶地)检测不同的肤色和不同的光照变化。另一方面是它的计算速度很快。
这些步骤和相应的代码可以在原始OpenCV book中找到。
作为旁注,我之前也使用过高斯混合模型(GMM)。如果你只考虑颜色,那么我会说使用直方图或GMM没有太大的区别。事实上,直方图表现更好(如果你的GMM不是为了解释照明变化等而构建的)。如果您的样本向量更复杂(即您考虑其他特征),GMM是好的,但速度直方图要快得多,因为使用直方图计算概率图本质上是表查找,而GMM需要执行矩阵计算(对于具有维度&gt的向量) ;多维高斯分布公式中的1;这对于实时应用来说可能是耗时的。
总而言之,如果您只是尝试使用颜色检测皮肤区域,那么请使用直方图方法。您可以调整它以考虑局部梯度(即梯度直方图,但可能不会达到Dalal和Trigg的人体检测算法的全部范围。)以便它可以区分皮肤和具有相似颜色的区域(例如纸板或木制家具) )使用局部纹理信息。但这需要更多的努力。
有关如何使用直方图进行皮肤检测的示例源代码,您可以查看OpenCV的页面here。但请注意,该网页上提到他们只使用色调通道和使用色调和饱和度会得到更好的结果。
对于更复杂的方法,你可以看看Margaret Fleck和David Forsyth的“探究裸体人”的工作。这是检测考虑颜色和纹理的皮肤区域的早期工作之一。详细信息可以在here找到。
可以找到与计算机视觉和图像处理相关的源代码的优秀资源,其中包括用于视觉跟踪的代码here。而不是,它不是OpenCV。
希望这有帮助。
答案 1 :(得分:5)
Here是一篇关于自适应高斯混合模型皮肤检测的论文,你可能会感兴趣。
另外,我记得读过一篇论文(不幸的是我似乎无法追踪它),它使用了一种非常聪明的技巧,但它需要你在视野中有脸。基本思路是检测人的面部,并使用从脸部检测到的皮肤贴片自动识别肤色。然后,使用高斯混合模型稳健地隔离皮肤像素。
最后,Google Scholar可能对寻找皮肤检测技术水平有很大帮助。它目前在adademia和工业中都有大量研究(例如Google Images和Facebook上传图片政策)。
答案 2 :(得分:5)
我在两年前做过类似的事情。您可以尝试使用Particle Filter(Condensation),使用肤色像素作为初始化输入。它非常强大和快速。 我为我的项目应用它的方式是link。您有演示文稿(幻灯片)和调查。 如果您使用从手中提取的真实颜色初始化手的颜色,那么您将跟踪黑人的任何问题。
对于粒子滤波器,我认为您可以找到一些代码实现示例。祝你好运。
答案 3 :(得分:4)
您很难仅根据颜色找到肤色 首先,它很大程度上取决于自动白平衡算法。 例如,在此图像中,任何人都可以看到颜色是肤色。但对于电脑来说它会是蓝色的。
其次,在数码相机中进行正确的色彩校准是一件困难的事情,对于您的目的来说,它很难准确 您可以查看www.DPReview.com,了解我的意思。
总之,我真的相信颜色本身可以作为输入,但这还不够。
答案 4 :(得分:0)
我的皮肤建模经验不好,因为: 1)闪电可能会有所不同 - 皮肤分割不稳健 2)它也会标记你的脸(像其他类似皮肤的物体)
我会使用像哈尔训练这样的机器学习技术,在我看来,如果比建模和修复一些约束(如皮肤检测+阈值处理......)更好的方法
答案 5 :(得分:0)
要比像素颜色更健壮,可以使用手部几何模型。特定手势的第一个项目模型,并将其与源图像互相关。 Here是该技术的演示。