通过计算机视觉实现强韧的手部检测

22

我目前正在开发一个稳健的手部检测系统。

第一步是使用手放置在小矩形框中,拍摄手部照片(在HSV色彩空间中),以确定肤色。随后,我会应用阈值过滤器将所有非皮肤像素设为黑色,所有皮肤像素设为白色。

到目前为止,这种方法效果还不错,但我想问是否有更好的解决方式?例如,我找到了一些提及高加索人具体肤色空间的论文,但没有与亚洲/非洲/高加索肤色进行比较的论文。

顺便说一下,我正在使用Python绑定的OpenCV。

6个回答

24

您有没有看过Gary Bradski的camshift论文?您可以从这里下载它。

我一年前使用过皮肤检测算法进行手部跟踪,它非常稳健。它取决于您如何使用它。

使用颜色进行跟踪的第一个问题是它对光照变化或像您提到的不同肤色的人不稳健。然而,正如在论文中提到的那样,这可以轻松地解决:

  1. 将图像转换为HSV颜色空间。
  2. 丢弃V通道,只考虑H和S通道,从而消除光照变化的影响。
  3. 由于它们的不稳定性,对低饱和度的像素进行阈值处理。
  4. 将选定的皮肤区域划分为一个二维直方图。(OpenCV的calcHist函数)这个直方图现在充当皮肤的模型。
  5. 使用calcBackProject计算“背投影”(即使用直方图计算图像中每个像素具有皮肤色调的“概率”)。皮肤区域将具有较高的值。
  • 接下来可以使用meanShift函数来查找由backproject生成的“概率”地图的二维模式或检测高“概率”的斑块。
  • 在HSV中舍弃V通道,仅考虑H和S通道就足以(出奇地)检测不同肤色并在不同光照变化下进行。另外一个好处是计算速度很快。

    这些步骤和相应的代码可以在原始的OpenCV书籍中找到。

    顺便说一句,我以前也用过高斯混合模型(GMM)。如果你只考虑颜色,那么我会说使用直方图或GMM没有太大区别。实际上,如果你的GMM未构建以考虑光照变化等因素,则直方图的性能更好。如果您的样本向量更为复杂(即考虑其他特征),则GMM效果更佳,但从速度上看,直方图要快得多,因为使用直方图计算概率映射本质上是表查找,而GMM需要执行矩阵计算(对于公式中维度> 1的向量)实时应用程序可能会耗费时间。

    因此,总之,如果您只想使用颜色检测皮肤区域,请使用直方图方法。您可以适应地考虑本地梯度(即梯度的直方图,但可能不会达到Dalal和Trigg的人类检测算法的全面程度),以便使用本地纹理信息区分皮肤和具有相似颜色的区域(例如纸板或木质家具)。但那需要更多的精力。

    如果您想查看如何使用直方图进行皮肤检测的示例源代码,可以参考OpenCV页面这里。但请注意,该网页提到他们仅使用了色调通道,如果同时使用色调和饱和度会得到更好的结果。

    对于更复杂的方法,您可以参考Margaret Fleck和David Forsyth的“检测裸体人”的研究。这是早期考虑颜色和纹理两个因素来检测皮肤区域的研究之一。详情请见这里

    一个关于计算机视觉和图像处理相关源代码资源的绝佳站点,包括用于视觉跟踪的代码,可以在这里找到。而且,这不是OpenCV。

    希望这些内容对您有所帮助。


    2
    谢谢您详细的回答。我不确定我是否会完全实现这种方法,但它是一个很大的帮助,因为它还解释了一些详情,比如忽略V通道——我目前正在这样做,但并没有真正理解为什么。 - Nicolas
    1
    我添加了一个链接到一个网站,该网站有许多计算机视觉和图像处理应用程序的源代码,包括视觉跟踪,我认为您可能会发现它们很有用,因为我认为皮肤检测可能只是其中一种可能的方法。也许值得看看其他的。 - lightalchemist
    更新检测裸体人士链接 - http://mfleck.cs.illinois.edu/naked.html - saurabheights

    5

    这里是一篇关于自适应高斯混合模型皮肤检测的论文,您可能会感兴趣。

    此外,我记得读过一篇论文(不幸的是我似乎找不到了),它使用了非常聪明的技巧,但需要在视野范围内有人脸。基本思想是检测人脸,并使用从人脸检测到的皮肤块自动识别皮肤颜色。然后,使用高斯混合模型稳健地隔离皮肤像素。

    最后,Google学术可能对搜索皮肤检测的最新技术很有帮助。它目前在学术界中受到广泛研究,并被用于工业中(例如Google Images和Facebook上传图片政策)。


    我也考虑过首先进行人脸识别的想法。不幸的是,我不能可靠地假定存在一张脸。 - Nicolas

    5
    我两年前曾经做过类似的工作。您可以尝试使用粒子滤波器(凝聚算法),将肤色像素用作初始化输入。它非常强大和快速。 我为我的项目应用的方法在这个链接中。您有演示文稿和调查报告。 如果您使用从要跟踪的手提取的真实颜色来初始化手的颜色,您不应该遇到黑人问题。
    对于粒子滤波器,我认为您可以找到一些代码实现样例。祝好运。

    4
    只凭颜色很难找到肤色匹配。
    首先,这取决于自动白平衡算法。比如,在这张图片中,任何人都能看出颜色是肤色,但对于电脑来说它是蓝色的。 enter image description here 其次,数字相机的正确色彩校准是困难的,很少能够达到你的目的所需的精度。你可以去看看www.DPReview.com,了解我的意思。
    总之,我真心相信颜色本身可以作为输入,但并不足够。

    这假设您无法控制白平衡。在许多相机上,可以手动控制它。此外,如果通过面部检测估计肤色,那也可以在任意白平衡情况下工作。 - mevatron
    OP 询问仅从 HSV 颜色通道进行手部检测。此外,我可以想象很多情况下图像中没有人脸。 - Andrey Rubshtein

    0

    我的皮肤建模经验不好,因为: 1)光线可能会变化 - 皮肤分割不够稳健 2)它也会标记你的脸(以及其他类似皮肤的物体)

    我会使用机器学习技术,如Haar训练。在我看来,这比建模和修复一些约束条件(如皮肤检测+阈值处理...)更好。


    0

    除了像素颜色之外,您可以使用手部几何模型来提高鲁棒性。首先为特定手势创建项目模型,然后将其与源图像进行交叉相关。这里是该技术的演示。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接