前言 

  最近课题研究上想采用皮肤信息,但是个人总是对皮肤信息应用在目标检测和目标识别上有排斥,认为皮肤信息完全不足以胜任这个工作。其实计算机视觉的最终实现是一个长期的过程,是AI领域一个经典的问题,所以在AI完全突破之前,任何对CV有用的信息都值得去深入研究,除非有一种算法能够在所有情况下都工作。好了,废话不扯了,进入正题,有偏见但是还是得使用它。皮肤模型中有单高斯,混合高斯,贝叶斯模型和椭圆模型等。经过前人学者大量的皮肤统计信息可以知道,如果将皮肤信息映射到YCrCb空间,则在CrCb二维空间中这些皮肤像素点近似成一个椭圆分布。因此如果我们得到了一个CrCb的椭圆,下次来一个坐标(Cr, Cb)我们只需判断它是否在椭圆内(包括边界),如果是,则可以判断其为皮肤,否则就是非皮肤像素点。

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

  实验基础

  本实验是参考小短文A super-simple skin detector in OpenCV,该文章里面首先直接给出了一个比较合理的椭圆,即该椭圆能够代表大部分人的皮肤信息CrCb的分布。椭圆的分布如下:

  

  说它比较有趣是因为我们是用一副图像来存储上面的椭圆的,而不是直接采用椭圆数学方程。该图像是二值图像,即椭圆区域内部为白色,其它地方为黑色。所以当其需要判断其它像素点时,只需将该像素点转换成Cr,Cb两个坐标,然后在上面的椭圆中找到该坐标的值,如果非0,则为皮肤,反之亦然。

  在实际代码中,该椭圆是采用绘画函数绘制到图片上的,一句代码而已:

ellipse(skinCrCbHist, Point(113, 155.6), Size(23.4, 15.2), 43.0, 0.0, 360.0, Scalar(255, 255, 255), -1);

  void ellipse(Mat& img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar&color, int thickness=1, int lineType=8, int shift=0)

  该函数是用来在指定图片上绘制椭圆弧线的。

  参数image为需要绘制椭圆的图像;

  参数center是该椭圆的中心点坐标;

  参数axes是该椭圆的长半轴和短半轴;

  参数angle是该椭圆和水平方向上的旋转夹角;

  参数startAngle表示绘制椭圆弧线相对该椭圆自己的水平轴的起始角度;

  参数endAngel表示绘制椭圆弧线相对该椭圆自己的水平轴的终止角度;

  后面的参数比较普通就不介绍了。

  绘制椭圆曲线的示意图如下所示:

  

  实验结果

  检测前的图像:

  

  利用该算法进行皮肤检测后的二值图:

  

  实验代码及注释

<span style="font-size:12px;">#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>using namespace std;
using namespace cv;Mat input_image;
Mat output_mask;
Mat output_image;void main()
{VideoCapture cam(0);if(!cam.isOpened())return;namedWindow("input image");namedWindow("output mask");namedWindow("output image");/*椭圆皮肤模型*/Mat skinCrCbHist = Mat::zeros(Size(256, 256), CV_8UC1);ellipse(skinCrCbHist, Point(113, 155.6), Size(23.4, 15.2), 43.0, 0.0, 360.0, Scalar(255, 255, 255), -1);while(true) {cam >> input_image;if(input_image.empty())return ;Mat ycrcb_image;output_mask = Mat::zeros(input_image.size(), CV_8UC1);cvtColor(input_image, ycrcb_image, CV_BGR2YCrCb); //首先转换成到YCrCb空间for(int i = 0; i < input_image.cols; i++)   //利用椭圆皮肤模型进行皮肤检测for(int j = 0; j < input_image.rows; j++){Vec3b ycrcb = ycrcb_image.at<Vec3b>(j, i);if(skinCrCbHist.at<uchar>(ycrcb[1], ycrcb[2]) > 0)output_mask.at<uchar>(j, i) = 255;}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;
}</span>

实验总结: 皮肤的椭圆模型确实可以用来做皮肤检测,一旦确定好了该椭圆就可以用来做皮肤检测了。

  参考文献:

A super-simple skin detector in OpenCV

皮肤检测与克服光线影响的连通域寻找

 http://docs.opencv.org/modules/core/doc/drawing_functions.html?highlight=ellipse#cv.Ellipse

基于椭圆模块的肤色检测相关推荐

  1. 基于椭圆模型的肤色检测

    算法思想:主要判断YCrCb空间中以(Cr, Cb)为坐标的点是否落在肤色椭圆内,如果在椭圆内,则为肤色点. 注:RGB空间转换为YCrCb空间时要以为坐标(Cb, Cr),BGR空间转换为YCrCb ...

  2. OpenCV 基于色彩直方图进行肤色检测

    色彩直方图是统计不同色彩在图像中的像素个数.例如,下图的猫咪在RGB色彩空间中每通道的灰度直方图(线条的颜色与其通道相对应). 将图像转为HSV色彩空间(Hue:色调:Saturation:饱和度:V ...

  3. 基于INA226模块的功率检测电路

    1 模块简介 INA226是一款分流/功率监视器,具有I2C™或SMBUS兼容接口. 该器件监视分流压降和总线电源电压. 可编程校准值.转换时间和取平均值功能与内部乘法器相结合,可实现电流值(单位为安 ...

  4. 【matlab 图像处理】 肤色检测

    肤色检测 肤色是人类皮肤重要特征之一,在检测人脸或手等目标时常采用肤色检测的方法,将相关区域从图像中分割出来. 肤色检测方法: 肤色检测方法有很多,但无论是基于不同的色彩空间还是不同的肤色模型,其根本 ...

  5. python opencv 肤色检测

    附上我自己的实例代码 基于运动信息和肤色检测的手位置检测 基于深度学习的asl手语识别例程 1 椭圆肤色检测模型 原理:将RGB图像转换到YCRCB空间,肤色像素点会聚集到一个椭圆区域.先定义一个椭圆 ...

  6. 人脸检测---基于肤色检测的实现

    在2015年本科毕业的时候,当时因为保送研究生的时候,选择了图像处理的研究方向,因此本科的毕业设计就选择了人脸检测的课题.人脸检测是一个研究得比较深入得一门方向了,对于人脸识别的重要性不言而喻,人脸都 ...

  7. 基于椭圆皮肤模型的皮肤检测-Opencv

    肤色检测主要有以下六种方法: 1.RGB color space 2.Ycrcb之cr分量+otsu阈值化 3.YCrCb中133<=Cr<=173 77<=Cb<=127 4 ...

  8. 简单的基于YCrCb颜色空间的人脸检测(肤色)

    简单的基于YCrCb颜色空间的人脸检测(肤色) 环境:Windows XP+MATLAB 2010b 基本思路: 1)将基于彩色空间的RGB模型转换为YCbCr模型(考虑到人脸的生理特征,只采取了Cr ...

  9. 计算机视觉之利用颜色进行肤色检测(基于OpenCV自带库函数)

    概述: 在对待物体做初步检测时,颜色信息非常有用.比如说辅助驾驶程序中的路标检测功能,就要凭借标准路标的颜色快速识别可能是路标信息.另一个例子是肤色检测,检测到的皮肤区域可以作为图像中有人存在的标志. ...

最新文章

  1. 使用datatables实现列宽设置、水平滚动条、显示某列部分内容
  2. 推荐10个百度,阿里,美团系公众号,第2个化学专业,半路出家!
  3. C#基础知识(个人笔记)
  4. 阿里redis规范(转自别人的公众号)
  5. 正态分布的峰度和偏度分别为_ML中的正态分布
  6. WPF实现截屏(仿微信)
  7. python staticmethod规范_Python Staticmethod可以调用另一个本地方法吗?
  8. 8s保留cpu设置_使用资源设置控制CPU资源
  9. delphi 监控文件变化_监控Linux文件变化,防止系统被黑
  10. linux系统给串口权限,让ubuntu串口和USB设备不用root权限访问
  11. Python中的注释和文档
  12. M3DGIS三维电子沙盘开发教程第52课无人机倾斜摄影全景三维建模
  13. 数论基本定理和欧拉广义降幂公式
  14. java stl分解_stl文件格式解析代码--java版
  15. 解决ffmpeg合成的视频格式浏览器无法播放问题
  16. 如何批量添加图片到ppt的方法
  17. 计算机网络最新复习【太原理工大学】
  18. 二分查找算法详细汇总
  19. 2022年最火副业;海外抖音 (TikTok) 搬运视频,一周赚一个月工资。
  20. 表格拖拽、树状拖拽的各种方法

热门文章

  1. 问题描述】星期天上午小明乘出租车去本市的外婆家。出租车计价方案为:2公里以内起步价是6元,超过2公里之后按1.8元/公里计价,超过10公里之后在1.8元/公里的基础上加价50%,另外,停车等候则
  2. 谷歌浏览器开启导入登录密码功能
  3. Android开发之拍照功能实现(附源码)
  4. 设计模式——(装饰者模式)(组合模式)
  5. 微信小程序和H5之间相互跳转的几种情况
  6. shell从入门到精通手把手教你
  7. 群晖 NAS WebDAV服务手机ES文件浏览器远程访问
  8. GCN-LSTM 预测出租车速度 英文 Taxi Speed Prediction Using GCN-LSTM
  9. java 画图 文字 描边_Android开发:文字描边
  10. 1029.Median (25)