通过计算机视觉进行稳健的手部检测

Nic*_*las 22 python opencv skin image-processing computer-vision

我目前正致力于一个强大的手检测系统.

第一步是拍摄手的照片(在HSV色彩空间中),将手放在一个小矩形中以确定肤色.然后,我应用阈值滤波器将所有非皮肤像素设置为黑色,将所有皮肤像素设置为白色.

到目前为止它运作良好,但我想问一下是否有更好的方法来解决这个问题?例如,我发现一些文章提到了白种人的具体色彩空间,但没有一篇提到亚洲/非洲/白人色调的比较.

顺便说一句,我正在通过Python绑定使用OpenCV.

lig*_*ist 24

你看过Gary Bradski的camshift纸了吗?你可以从这里下载

我在一年前使用了皮肤检测算法来检测皮肤区域以进行手部跟踪,并且它非常强大.这取决于你如何使用它.

使用颜色进行跟踪的第一个问题是,当人们有不同的肤色时,它对于照明变化或者你提到的不一样.然而,如本文所述,这可以很容易地解决:

  1. 将图像转换为HSV颜色空间.
  2. 扔掉V通道并考虑H和S通道,从而折扣照明变化.
  3. 阈值像素由于其不稳定性而具有低饱和度.
  4. 将所选皮肤区域划分为2D直方图.(OpenCV的calcHist 函数)此直方图现在充当皮肤模型.
  5. 使用calcBackProject计算"反投影"(即使用直方图计算图像中每个像素具有肤色的"概率").皮肤区域将具有高值.
  6. 然后,您可以使用meanShift查找由backproject生成的2D"概率"映射的模式,或者检测高"概率"的blob.

丢弃HSV中的V通道并且仅考虑H和S通道足以(令人惊讶地)检测不同的肤色并且在不同的光照变化下.好的一面是它的计算速度很快.

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

作为旁注,我之前也使用过高斯混合模型(GMM).如果你只考虑颜色,那么我会说使用直方图或GMM没有太大的区别.事实上,直方图表现更好(如果你的GMM不是为了解释照明变化等而构建的).如果您的样本向量更复杂(即您考虑其他特征),GMM是好的,但速度直方图要快得多,因为使用直方图计算概率图本质上是表查找,而GMM需要执行矩阵计算(对于具有维度的向量>在多维高斯分布公式中的1,这对于实时应用来说可能是耗时的.

总而言之,如果您只是尝试使用颜色检测皮肤区域,那么请使用直方图方法.您可以调整它以考虑局部梯度(即梯度直方图,但可能不会达到Dalal和Trigg的人体检测算法的全部范围.)以便它可以区分皮肤和具有相似颜色的区域(例如纸板或木制家具) )使用局部纹理信息.但这需要更多的努力.

有关如何使用直方图进行皮肤检测的示例源代码,您可以在这里查看OpenCV的页面.但是请注意,在该网页上提到它们仅使用色调通道并且使用色调和饱和度将给出更好的结果.

对于更复杂的方法,您可以看看Margaret Fleck和David Forsyth的"探究裸体人"的工作.这是检测考虑颜色和纹理的皮肤区域的早期工作之一.细节可以在这里找到.

可以在此处找到与计算机视觉和图像处理相关的源代码的重要资源,其恰好包括用于视觉跟踪的代码.而不是,它不是OpenCV.

希望这可以帮助.

  • 谢谢你的详细解答.不知道我是否会完全实现这个方法,但它有很大的帮助,因为它还解释了一些细节,比如忽略了v通道 - 我现在正在做但没有真正理解为什么 (2认同)

mev*_*ron 5

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

此外,我记得读过一篇论文(不幸的是我似乎无法追踪它),它使用了一种非常聪明的技巧,但它要求你在视野中拥有一张脸.基本思路是检测人的面部,并使用从脸部检测到的皮肤贴片自动识别肤色.然后,使用高斯混合模型来稳健地隔离皮肤像素.

最后,谷歌学术搜索可能是寻找皮肤检测技术发展水平的重要帮助.它现在在adademia中进行了大量研究以及在工业中使用(例如,谷歌图像和Facebook上传图片政策).


Jav*_*ock 5

我在2年前做过类似的事情.您可以尝试使用粒子滤镜(Condensation),使用肤色像素作为初始化输入.它非常强大和快速.我为我的项目应用它的方式是在这个链接.您有演示文稿(幻灯片)和调查.如果您使用从手中提取的真实颜色来初始化手的颜色,那么您将跟踪黑人的任何问题.

对于粒子滤波器,我认为您可以找到一些代码实现示例.祝好运.