热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OpenCV基础教程:CvAdaptiveSkinDetector皮肤检测功能详解与应用

前言皮肤检测是利用皮肤的颜色信息的阈值来进行检测的,不过这些阈值一般不是使用rgb空间,而是用HSV或者YCrCb等空间。皮肤检测是使用统计的方法统

 

  前言
  皮肤检测是利用皮肤的颜色信息的阈值来进行检测的,不过这些阈值一般不是使用rgb空间,而是用HSV或者YCrCb等空间。皮肤检测是使用统计的方法统计出大量人的皮肤信息,然后就可以得到色彩空间某一分量的阈值了,利用该阈值就可以初步对皮肤进行分割。当然了,OpenCV中也自带了皮肤检测算子,包含在类CvAdaptiveSkinDetector中。本节内容就是来试试OpenCV自带的皮肤检测算法的性能。

  开发环境:OpenCV2.4.3+QtCreator2.5.1

 

  实验基础

  OpenCV自带是算法的参考文献有网友说是An adaptive real-time skin detector based on Hue thresholding: A comparison on two motion tracking methods,见参考资料1。稍微看了下该论文的算法流程和CvAdaptiveSkinDetector类的源码,该源码的实现差不多就是按照这篇文章进行的,主要是把皮肤阈值分割和运动检测相结合。该算法的流程图如下所示:

  

  可以看出该皮肤检测算法是在HSV空间进行的,HSV空间模型图如下所示:

  

  其中H表示的是色相,即不同颜色最具有区别性的地方,见模型中的那个圆弧;S代表的是饱和度,也就是含白光的纯度,见模型中的那条半径,S越大表示越饱和,即表示对应色相越纯;V表示亮度,见模型中那条竖直的线,V越大表示对应点越亮。 

  下面来看看CvAdaptiveSkinDetector类中的2个比较重要的函数:

  CvAdaptiveSkinDetector(int samplingDivider = 1, int morphingMethod = MORPHING_METHOD_NONE);

  该函数为类的构造函数,其中参数1表示的是样本采样的间隔,默认情况下为1,即表示不进行降采样;参数2为图形学操作方式,即对用皮肤检测后的图像进行图形学操作。其取值有3种可能,如果为MORPHING_METHOD_ERODE,则表示只进行一次腐蚀操作;如果为MORPHING_METHOD_ERODE_ERODE,则表示连续进行2次腐蚀操作;如果为MORPHING_METHOD_ERODE_DILATE,则表示先进行一次腐蚀操作,后进行一次膨胀操作。 

  virtual void process(IplImage *inputBGRImage, IplImage *outputHueMask);

  该函数为皮肤检测的核心函数,参数1为需要进行皮肤检测的输入图像;参数2为输出皮肤的掩膜图像,如果其值为1,代表该像素为皮肤,否则当其为0时,代表为非皮肤。另外需要注意的是,这个函数只有opencv的c版本的,因为CvAdaptiveSkinDetector这个类放在opencv源码里的contrib目录里,即表示比较新的但不成熟的算法,所以暂时没有提供c++版本的opencv。因此参数1和参数2的图像数据类型都是IplImage,如果要使用Mat,就得先进行一个小小的转换,具体参考代码部分。

 

 

  C/c++知识点总结:

  看了CvAdaptiveSkinDetector类的源码,发现在类的设计中,其内部还可以设计一个类,比如CvAdaptiveSkinDetector中嵌入了一个直方图的类。

 

 

  实验结果

  下面的图是需要进行肤色检测的图(主要是检测出手部):

  

 

  其检测完后的效果图如下:

  

  由此可见,其检测效果一般般,因为很多背景都被考虑进来了。

 

  实验代码及注释:

  main.cpp:

#include
#include

#include

#include

#include
using namespace std;
using namespace cv;Mat input_image;
Mat output_mask;
Mat output_image;
IplImage
*src_image;
IplImage
*dst_image;
void main()
{VideoCapture cam(
0);if(!cam.isOpened())return;namedWindow("input image");namedWindow("output mask");namedWindow("output image");CvAdaptiveSkinDetector skin_detector(1, CvAdaptiveSkinDetector::MORPHING_METHOD_NONE);while(true) {cam >> input_image;src_image = &input_image.operator IplImage();if(dst_image == NULL)dst_image = cvCreateImage(cvSize(src_image->width, src_image->height), IPL_DEPTH_8U, 1); //一定要先分配一个内存
skin_detector.process(src_image, dst_image);output_mask = 255*Mat(dst_image);input_image.copyTo(output_image, output_mask);imshow("input image", input_image);imshow("output mask", output_mask);imshow("output image", output_image);output_image.setTo(0);if(27 == waitKey(30))return;}return;
}

 

 

  实验总结:

  皮肤检测本身就受背景,光照,肤色等方面的影响,所以要使效果好还是比较难的,OpenCV带的该算法效果也非常一般。

 

  参考资料:

     基于opencv的皮肤检测

     An adaptive real-time skin detector based on Hue thresholding: A comparison on two motion tracking methods

 

 

 



推荐阅读
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
author-avatar
56修行者场_872
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有