Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cv2中的皮肤检测和背景减除_Python_Opencv_Gesture Recognition - Fatal编程技术网

Python cv2中的皮肤检测和背景减除

Python cv2中的皮肤检测和背景减除,python,opencv,gesture-recognition,Python,Opencv,Gesture Recognition,在过去的几天里,我一直在使用OpenCV Python开发一个手势识别程序。理想情况下,我希望有一个如中所示的系统。我已经通读了视频描述中描述的算法,我几乎完全理解了它。然而,我一直难以复制他在背景减法和肤色检测方面的成功。我所有的尝试都以非常嘈杂和/或非常依赖灯光而告终,这两种情况都使得我的代码暂时无用 我尝试了以下方法: BackgroundSubtractorMOG和BackgroundSubtractorMOG2应用于彩色边框 将图像拆分为Y Cr Cb,在重新组合为单个图像之前对每个

在过去的几天里,我一直在使用OpenCV Python开发一个手势识别程序。理想情况下,我希望有一个如中所示的系统。我已经通读了视频描述中描述的算法,我几乎完全理解了它。然而,我一直难以复制他在背景减法和肤色检测方面的成功。我所有的尝试都以非常嘈杂和/或非常依赖灯光而告终,这两种情况都使得我的代码暂时无用

我尝试了以下方法:

  • BackgroundSubtractorMOG和BackgroundSubtractorMOG2应用于彩色边框
  • 将图像拆分为Y Cr Cb,在重新组合为单个图像之前对每个图像应用MOG或MOG2
  • 过滤范围以删除非肤色的颜色(应用于彩色图像)

到目前为止,我还没有取得成功。我已经能够挑出一些轮廓,但这些轮廓一直是嘈杂和不稳定的(来来去去取决于帧)。这是我应该使用的另一种方法吗?

背景减法往往会留下很多鬼图像。你应该从基于HSV的皮肤检测开始,排除非皮肤区域。这将消除背景减法的需要

然后,您可以应用人脸检测来遮罩您的脸,接下来,当您只剩下手的轮廓时,您可以使用approxPolyDP()获得简化的多边形。计算多边形的矩和凸度将为手势识别奠定基础

我已经编写了一个解释器应用程序,因此我遇到了您面临的许多健壮性问题。经过几周的实验,我终于找到了一个解决方案,其中包含了几种不同的方法,但最重要的方法是基于颜色的分割

基于颜色(肤色)的分割功能非常强大,但过于简单的实现必然会缺乏所需的健壮性。首先,每个人的肤色都是不同的。因此,通过其他机制识别基线肤色非常重要。一种方法是使用人脸检测器(如级联分类器)来查找对象的人脸,然后相应地“调整”过滤器范围

我个人使用了一个级联分类器,首先找到闭合的拳头形状,然后对HSV直方图进行标准化和区分,1)一个仅包含拳头的紧边界框,2)整个图像。然后我建立了一个查找表(LUT),将每个通道的每个值映射到一个0到255之间的值,该值表示像素代表皮肤的概率

根据我的经验,提高我的手跟踪逻辑性能的最重要因素是当我突然想到不丢弃信息时。为了生成二值图像,您可能会尝试简单地使用一些最佳范围来设置阈值,但是知道一个像素有40%的几率成为皮肤,而另一个像素有60%的几率是有价值的。一旦设置了阈值,就只有1和0了

当然,如果您打算使用基于轮廓的姿势分类,可能需要在某个点设置阈值。但是,如果您真的想要构建健壮的手势识别软件,您可能需要研究使用一种方法来执行分类。预测可以很快完成,而且对背景噪声、平移等非常鲁棒。。。希望这有帮助

编辑:让我澄清我对“HSV直方图的标准化和差异化”的评论。首先,这样做的基本原理是能够利用OpenCV,而不是使用基于范围的阈值
LUT
非常有效,并且比基于范围的阈值更灵活。例如,假设您想要的色调包括两个不同范围(例如:0-30和150-180)中的值。基于LUT的方法很容易处理这个问题,因为每个单独的值都可以独立映射

因此,一旦你建立了LUT,你只需要为每一帧在HSV图像上运行
LUT
。这是一个非常有效的解决方案

在我的例子中,为了构建LUT,我采取了以下步骤:

  • 转换为HSV颜色空间
  • 获得拳头周围紧边界框的ROI
  • 为ROI和整个图像的每个通道构建直方图
  • 缩小(标准化)完整图像通道直方图,使其比例与ROI直方图的比例匹配(即:将每个完整图像直方图乘以ROI\u区域/完整图像\u区域)
  • 从ROI直方图中减去(差异)完整图像直方图。(具有较大正值的条目将对应于ROI中常见的通道值,但不对应于完整图像。)
  • 然后,我平滑差异直方图以减少噪声和“过度拟合”
  • 最后,我使用OpenCV的
    normalize
    函数和
    NORM\u MINMAX
    将差异直方图标准化为0.0和1.0之间的值
  • 然后,差分直方图可以合并在一起,生成一个3通道LUT
我个人不会在使用LUT后设置阈值。相反,我只是使用得到的数据来计算一个“色心”,我用它来保持ROI集中在手上。然后,我可以将相同的基于LUT的值发送到CNN进行分类

请注意,尽管这种方法对我来说效果很好,但如果您执行阈值处理,它仍然不是完美的;将有一些前景检测为背景,反之亦然。我加入了一些基于边缘检测的逻辑,以帮助减少米色墙壁(我家中常见的故障模式)造成的误报,但现实是,如果有一种真正可靠的方法从背景中清晰地分割出一只手,并且对不断变化的背景和照明条件非常可靠,我还没有找到它。所以我的推荐