我目前正在开发一个稳健的手部检测系统。
第一步是使用手放置在小矩形框中,拍摄手部照片(在HSV色彩空间中),以确定肤色。随后,我会应用阈值过滤器将所有非皮肤像素设为黑色,所有皮肤像素设为白色。
到目前为止,这种方法效果还不错,但我想问是否有更好的解决方式?例如,我找到了一些提及高加索人具体肤色空间的论文,但没有与亚洲/非洲/高加索肤色进行比较的论文。
顺便说一下,我正在使用Python绑定的OpenCV。
我目前正在开发一个稳健的手部检测系统。
第一步是使用手放置在小矩形框中,拍摄手部照片(在HSV色彩空间中),以确定肤色。随后,我会应用阈值过滤器将所有非皮肤像素设为黑色,所有皮肤像素设为白色。
到目前为止,这种方法效果还不错,但我想问是否有更好的解决方式?例如,我找到了一些提及高加索人具体肤色空间的论文,但没有与亚洲/非洲/高加索肤色进行比较的论文。
顺便说一下,我正在使用Python绑定的OpenCV。
您有没有看过Gary Bradski的camshift论文?您可以从这里下载它。
我一年前使用过皮肤检测算法进行手部跟踪,它非常稳健。它取决于您如何使用它。
使用颜色进行跟踪的第一个问题是它对光照变化或像您提到的不同肤色的人不稳健。然而,正如在论文中提到的那样,这可以轻松地解决:
在HSV中舍弃V通道,仅考虑H和S通道就足以(出奇地)检测不同肤色并在不同光照变化下进行。另外一个好处是计算速度很快。
这些步骤和相应的代码可以在原始的OpenCV书籍中找到。
顺便说一句,我以前也用过高斯混合模型(GMM)。如果你只考虑颜色,那么我会说使用直方图或GMM没有太大区别。实际上,如果你的GMM未构建以考虑光照变化等因素,则直方图的性能更好。如果您的样本向量更为复杂(即考虑其他特征),则GMM效果更佳,但从速度上看,直方图要快得多,因为使用直方图计算概率映射本质上是表查找,而GMM需要执行矩阵计算(对于公式中维度> 1的向量)实时应用程序可能会耗费时间。
因此,总之,如果您只想使用颜色检测皮肤区域,请使用直方图方法。您可以适应地考虑本地梯度(即梯度的直方图,但可能不会达到Dalal和Trigg的人类检测算法的全面程度),以便使用本地纹理信息区分皮肤和具有相似颜色的区域(例如纸板或木质家具)。但那需要更多的精力。
如果您想查看如何使用直方图进行皮肤检测的示例源代码,可以参考OpenCV页面这里。但请注意,该网页提到他们仅使用了色调通道,如果同时使用色调和饱和度会得到更好的结果。
对于更复杂的方法,您可以参考Margaret Fleck和David Forsyth的“检测裸体人”的研究。这是早期考虑颜色和纹理两个因素来检测皮肤区域的研究之一。详情请见这里。
一个关于计算机视觉和图像处理相关源代码资源的绝佳站点,包括用于视觉跟踪的代码,可以在这里找到。而且,这不是OpenCV。
希望这些内容对您有所帮助。
我的皮肤建模经验不好,因为: 1)光线可能会变化 - 皮肤分割不够稳健 2)它也会标记你的脸(以及其他类似皮肤的物体)
我会使用机器学习技术,如Haar训练。在我看来,这比建模和修复一些约束条件(如皮肤检测+阈值处理...)更好。