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

2024-01-27

在过去的几天里,我一直在使用 OpenCV Python 开发手势识别程序。理想情况下,我希望拥有一个如图所示的系统这个视频 https://youtu.be/xML2S6bvMwI?list=PLtszSfeV_ZqjcPArVX1PU68Vv4qRBVVnw。我已经通读了视频描述中描述的算法,并且我几乎理解了所有内容。然而,我一直难以复制他在背景扣除和肤色检测方面的成功。我所有的尝试都以非常嘈杂和/或非常依赖照明而告终,这两者都使我的代码暂时无用。

我已经尝试过以下方法:

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

到目前为止,我还没有成功。我已经能够挑选出一些轮廓,但这些轮廓很吵并且不稳定(根据框架来来去去)。他们是我应该使用的另一种方法吗?


我写了一个手指拼写 https://en.wikipedia.org/wiki/Fingerspelling解释器应用程序,所以我遇到了您面临的许多稳健性问题。经过几周的实验,我确定了一个包含几种不同方法的解决方案,但采用的最重要的方法是基于颜色的分割。

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

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

根据我的经验,most提高我的手部追踪逻辑性能的一个重要因素是当我想到不丢弃信息的想法时。您可能会想简单地使用一些最佳范围来设置阈值以生成二值图像,但了解一个像素有 40% 的机会是皮肤而另一个像素有 60% 的机会是有价值的。一旦达到阈值,您所拥有的就只有 1 和 0。

当然,如果您打算使用基于轮廓的姿势分类,则可能需要在某个点进行阈值处理。但如果您确实想构建强大的手势识别软件,您可能需要使用卷积神经网络 (CNN) https://en.wikipedia.org/wiki/Convolutional_neural_network来执行分类。预测可以非常快地完成,并且它对背景噪声、翻译等非常鲁棒......希望这有帮助!

编辑:让我澄清一下我关于“标准化和区分 HSV 直方图”的评论。首先,这样做的理由是能够利用OpenCV的LUT(查找表) http://docs.opencv.org/2.4.11/modules/core/doc/operations_on_arrays.html#lut而不是使用基于范围的阈值。LUT非常高效,并且比基于范围的阈值更灵活。例如,假设您想要的色调包含两个不同范围内的值(例如:0-30 和 150-180)。基于 LUT 的方法可以轻松处理这个问题,因为每个单独的值都可以独立映射。

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

就我而言,为了构建 LUT,我采取了以下步骤:

  • 转换为 HSV 颜色空间。
  • 获取拳头周围紧密边界框的投资回报率。
  • 为 ROI 和整个图像的每个通道构建直方图。
  • 缩小(标准化)完整图像通道直方图,以便比例与 ROI 直方图相匹配(即:将每个完整图像直方图乘以 ROI_area/full_image_area)。
  • 从 ROI 直方图中减去(差值)完整图像直方图。 (具有较大正值的条目将对应于 ROI 中常见的通道值,但不是完整图像。)
  • 然后,我平滑差异直方图以减少噪声和“过度拟合”。
  • 最后,我使用 OpenCV 将差异直方图标准化为 0.0 和 1.0 之间的值normalize功能与NORM_MINMAX.
  • 然后可以将差异直方图合并在一起以生成 3 通道 LUT。

我个人在使用 LUT 后不会对值进行阈值设置。相反,我只是使用结果数据来计算“颜色质量中心”,我用它来保持 ROI 以手为中心。然后,我可以将相同的基于 LUT 的值发送到 CNN 进行分类。

请注意,虽然这种方法非常适合我的目的,但如果您执行阈值处理,它仍然不会完美;将会有一些前景被检测为背景,反之亦然。我加入了一些基于边缘检测的逻辑,以帮助减少米色墙壁(我家里常见的故障模式)造成的误报,但现实是,如果有一种真正可靠的方法可以从背景中干净地分割出一只手,那么这种方法就真正可靠改变背景和照明条件,我还没有找到。因此,我的建议是从视觉皮层获取提示,并允许来自更高抽象级别的信息来帮助过滤噪音。 (换句话说,研究一下 CNN——它们真的很了不起。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python cv2 中的皮肤检测和背景扣除 的相关文章

随机推荐

  • 通过 Maven 添加 Janino 包时出现“无效的签名文件摘要”错误

    我正在尝试通过 Maven 存储库添加对 Janino 2 7 6 的依赖项 当我尝试运行该应用程序时 出现以下错误 exec maven plugin 1 2 1 exec unpack dependencies JanineAttemp
  • C# 中左移位的奇怪行为

    在测试这段代码时 for int i 0 i lt 32 i Console WriteLine i byte MaxValue 1 lt lt i 我得到这些输出 0 256 1 512 2 1024 3 2048 4 4096 5 81
  • 按住自定义 UIButton 时更改深灰色突出显示的颜色?

    我有一个习惯UIButton这是一个云 透明的黑白 png 文件 没有关闭状态 只有一张图像 当用手指轻敲并按住它时 它会变成深灰色 我正在尝试将深灰色改成不那么压抑的颜色 该按钮在视图中公开 而不是在选项卡栏 工具栏或导航控制器中 我已经
  • 如何将自定义文件导入 APK

    众所周知 apk 文件是一个 zip 格式的存档文件 包括以下文件和文件夹 AndroidManifest xml assets 类 dex META INF res 资源 arsc 我想要的是包含一个自定义文件 即 README txt
  • 创建一个人类可读的时间戳并存储在 C++ 中的字符串中

    我想根据程序运行的时间创建带有时间戳的文件名 即 logfile 2020 04 21 18 11 10 txt logfile 2020 04 22 18 13 43 txt 我可以得到时间戳 我认为 std chrono steady
  • 异步多线程异常处理?

    我希望在异步编程 beginInvoke endInvoke 中采用一种异常处理方法 其中如果任何一个线程 beginInvoke 失败 那么我希望所有其他异步处理线程停止工作 请提出一些解决方案 下面我还附上了我的示例代码 public
  • 如何与框架项目 swift 共享父(主机)项目 pod?

    我正在开发框架 我已将此框架项目添加到宿主项目中 现在我想将 cocoapods pod 框架 添加到父 主机 项目中 并将相同的 pod 共享到子 框架 项目中 或者我可以添加一些东西到 Podfile 中 它将与子项目共享 SwiftP
  • Report Builder 3.0 SWITCH 表达式 DEFAULT/ELSE

    我正在尝试根据用户的特许经营号码显示不同的徽标 参数 UserFranNr 如果值 99 且 87 则要显示的嵌入图像是 ID0 嵌入图像名称是字符串 这适用于嵌套 IIF 但似乎是使用正确的时间 地点SWITCH 未来很可能会有更多特许经
  • 无法登录 Magento 管理员

    我已将 magento 安装在子目录中 www domain com subdir magento 该网站一度运行得非常完美 我什么也没做 直到我的客户说他无法登录到 magento admin 我从我的电脑上登录得很好 但在他的电脑上 它
  • 使用 Delphi 以编程方式添加、删除文件并将文件提交到 Subversion 存储库中

    我想以编程方式检查文件是否已版本化 并使用 Delphi 添加 删除文件并将文件提交到 subversion 存储库中 有谁有示例代码可以帮助我创建必要的函数和过程 Thanks Steve Delphi XE 集成是开源的 基于 MPL
  • 我如何从左侧切换而不使用 jquery-ui

    如何在不使用 jquery ui 的情况下从左侧切换 JavaScript document ready function button click function content slideToggle HTML div This is
  • Javascript toFixed 不四舍五入

    我正在使用 javascript 绑定到一些复选框 并且toFixed 2 没有四舍五入 有什么想法为什么不四舍五入吗 例如 如果数字是859 385它只是显示859 38代替859 39 我还读到toFixed可以根据您使用的浏览器进行不
  • 消息中的换行符

    使用Google Apps脚本 如何在变量中换行以发送邮件 换行符在msgBox Browser msgBox line 1 n line 2 请注意 您需要使用额外的反斜杠转义 n
  • React Native 应用程序崩溃,没有任何错误日志

    React Native 应用程序崩溃 没有任何错误日志 没有输出 react native log android 终端 没有出现错误的红屏 Android 模拟器只是崩溃 尝试使用 Expo 运行 再次崩溃 没有错误 工作时发生Text
  • 滚动到 UWP 的 ListView 中的新项目

    我正在创建一个带有包含消息的 ListView 的聊天应用程序 当发送 接收新消息时 ListView 应滚动到新消息 我正在使用 MVVM 所以 ListView 看起来像
  • ASP.NET 正则表达式验证器(密码强度)

    我有一个具有以下表达式的验证控件 d 2 w 2 W 1 8 这是一个至少包含以下内容的密码2 digits 2 个字母字符 1 个非字母数字 and 最少 8 个字符 不幸的是 这似乎不兼容跨浏览器 此验证在 Firefox 中完美运行
  • 在 HPC 集群上使用 python 代码 (mpi4py) 提交作业

    我正在工作带有 MPI 的 python 代码 mpi4py 我想在 HPC 集群的队列中跨多个节点 每个节点有 16 个处理器 实现我的代码 我的代码结构如下 from mpi4py import MPI comm MPI COMM WO
  • 是否有与 SQL Profiler 等效的 IBM Iseries/DB2?

    主题说明了一切 希望捕获提交给 DB2 的 sql 查看 Iseries SQL 退出点 它允许您记录任何提交的 SQL 唯一的问题是您必须编写自己的程序来进行日志记录 http publib boulder ibm com infocen
  • Ant 继承 Maven 属性

    我正在考虑将 Ant Ivy 项目转换为 Ant Maven Ant Tasks 我不想单独使用 Maven 因为我需要对构建过程进行更多控制 有没有办法让Ant build xml 文件继承pom xml 文件中设置的属性 我一直在创建一
  • Python cv2 中的皮肤检测和背景扣除

    在过去的几天里 我一直在使用 OpenCV Python 开发手势识别程序 理想情况下 我希望拥有一个如图所示的系统这个视频 https youtu be xML2S6bvMwI list PLtszSfeV ZqjcPArVX1PU68V