我目前正在开发用于可靠手部检测的系统。
第一步是拍摄手的照片(在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。
希望这可以帮助。