单色背景抠图方法(绿色背景抠图、肤色检测)之——chroma kye

首先,我这篇博客是基于别人博客的研究,创建自己的project来练习

1、肤色侦测法(每种方法提供完整源码下载链接)

下载链接:点击打开链接http://download.csdn.net/detail/chenxun2009/7731489

肤色提取是基于人机互动方面常见的方法。因为肤色是人体的一大特征,它可以迅速从复杂的背景下分离出自己的特征区域。一下介绍两种常见的肤色提取:

1)HSV空间的肤色提取

HSV色彩空间是一个圆锥形的模型,具体如右图所示:

色相(H)是色彩的基本属性,就是平常说的颜色名称,例如红色、黄色等


依照右图的标准色轮上的位置,取360度得数值。(也有0~100%的方法确定) 饱和度(S)是色彩的纯度,越高色彩越纯,低则变灰。取值为0~100%。明度(V)也叫亮度,取值0~100。
     根据肤色在HSV三个分量上的值,就可以简单的侦测出一张图像上肤色的部分。一下是肤色侦测函数的源代码:

void skinDetectionHSV(IplImage* pImage,int lower,int upper,IplImage* process)  
{  
	IplImage* pImageHSV = NULL;  
	IplImage* pImageH = NULL;  
	IplImage* pImageS = NULL;  
	IplImage* pImageProcessed = NULL;  
	IplImage* tmpH = NULL;  
	IplImage* tmpS = NULL;  
	static IplImage* pyrImage = NULL;  

	CvSize imgSize;  
	imgSize.height = pImage->height;  
	imgSize.width = pImage->width ;  

	//create you want to use image and give them memory allocation  
	pImageHSV = cvCreateImage(imgSize,IPL_DEPTH_8U,3);  
	pImageH = cvCreateImage(imgSize,IPL_DEPTH_8U,1);  
	pImageS = cvCreateImage(imgSize,IPL_DEPTH_8U,1);  
	tmpS = cvCreateImage(imgSize,IPL_DEPTH_8U,1);  
	tmpH = cvCreateImage(imgSize,IPL_DEPTH_8U,1);  
	pImageProcessed = cvCreateImage(imgSize,IPL_DEPTH_8U,1);  
	pyrImage = cvCreateImage(cvSize(pImage->width/2,pImage->height/2),IPL_DEPTH_8U,1);  

	//convert RGB image to HSV image  
	cvCvtColor(pImage,pImageHSV,CV_BGR2HSV);  

	//Then split HSV to three single channel images  
	cvCvtPixToPlane(pImageHSV,pImageH,pImageS,NULL,NULL);  
	//The skin scalar range in H and S, Do they AND algorithm  
	cvInRangeS(pImageH,cvScalar(0.0,0.0,0,0),cvScalar(lower,0.0,0,0),tmpH);  
	cvInRangeS(pImageS,cvScalar(26,0.0,0,0),cvScalar(upper,0.0,0,0),tmpS);  
	cvAnd(tmpH,tmpS,pImageProcessed,0);  
	//  
	//cvPyrDown(pImageProcessed,pyrImage,CV_GAUSSIAN_5x5);  
	//cvPyrUp(pyrImage,pImageProcessed,CV_GAUSSIAN_5x5);  
	//Erode and dilate  
	cvErode(pImageProcessed,pImageProcessed,0,2);  
	cvDilate(pImageProcessed,pImageProcessed,0,1);  

	cvCopy(pImageProcessed,process,0);  
	//do clean  
	cvReleaseImage(&pyrImage);  
	cvReleaseImage(&pImageHSV);  
	cvReleaseImage(&pImageH);  
	cvReleaseImage(&pImageS);  
	cvReleaseImage(&pyrImage);  
	cvReleaseImage(&tmpH);  
	cvReleaseImage(&tmpS);  
	cvReleaseImage(&pImageProcessed);  
}

 (2)YCrCb空间的肤色提取

完整project下载:http://download.csdn.net/detail/chenxun2009/7731641
   YCrCb也是一种颜色空间,也可以说是YUV的颜色空间。Y是亮度的分量,而肤色侦测是对亮度比较敏感的,由摄像头拍摄的RGB图像转化为YCrCb空间的话可以去除亮度对肤色侦测的影响。下面给出基于YCrCb肤色侦测函数的源代码:

 

  1. void skinDetectionYCrCb(IplImage* imageRGB,int lower,int upper,IplImage* imgProcessed)  
  2. {  
  3.   
  4.         assert(imageRGB->nChannels==3);  
  5.     IplImage* imageYCrCb = NULL;  
  6.     IplImage* imageCb = NULL;  
  7.     imageYCrCb = cvCreateImage(cvGetSize(imageRGB),8,3);  
  8.     imageCb = cvCreateImage(cvGetSize(imageRGB),8,1);  
  9.   
  10.     cvCvtColor(imageRGB,imageYCrCb,CV_BGR2YCrCb);  
  11.     cvSplit(imageYCrCb,0,0,imageCb,0);//Cb  
  12.     for (int h=0;h<imageCb->height;h++)  
  13.         {  
  14.         for (int w=0;w<imageCb->width;w++)  
  15.                  {  
  16.             unsigned char* p =(unsigned char*)(imageCb->imageData+h*imageCb->widthStep+w);  
  17.             if (*p<=upper&&*p>=lower)  
  18.                        {  
  19.                 *p=255;  
  20.             }  
  21.                         else  
  22.                         {  
  23.                 *p=0;  
  24.             }  
  25.         }  
  26.     }  
  27.     cvCopy(imageCb,imgProcessed,NULL);  
  28. }  

 

2、基于混合高斯模型去除背景法

   高斯模型去除背景法也是背景去除的一种常用的方法,经常会用到视频图像侦测中。这种方法对于动态的视频图像特征侦测比较适合,因为模型中是前景和背景分离开来的。分离前景和背景的基准是判断像素点变化率,会把变化慢的学习为背景,变化快的视为前景。

  1. //  
  2.  
  3. #include "stdafx.h"  
  4. #include "cv.h"  
  5. #include "highgui.h"  
  6. #include "cxtypes.h"  
  7. #include "cvaux.h"  
  8. # include <iostream>  
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值