首先,我这篇博客是基于别人博客的研究,创建自己的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肤色侦测函数的源代码:
- void skinDetectionYCrCb(IplImage* imageRGB,int lower,int upper,IplImage* imgProcessed)
- {
- assert(imageRGB->nChannels==3);
- IplImage* imageYCrCb = NULL;
- IplImage* imageCb = NULL;
- imageYCrCb = cvCreateImage(cvGetSize(imageRGB),8,3);
- imageCb = cvCreateImage(cvGetSize(imageRGB),8,1);
- cvCvtColor(imageRGB,imageYCrCb,CV_BGR2YCrCb);
- cvSplit(imageYCrCb,0,0,imageCb,0);//Cb
- for (int h=0;h<imageCb->height;h++)
- {
- for (int w=0;w<imageCb->width;w++)
- {
- unsigned char* p =(unsigned char*)(imageCb->imageData+h*imageCb->widthStep+w);
- if (*p<=upper&&*p>=lower)
- {
- *p=255;
- }
- else
- {
- *p=0;
- }
- }
- }
- cvCopy(imageCb,imgProcessed,NULL);
- }
2、基于混合高斯模型去除背景法
高斯模型去除背景法也是背景去除的一种常用的方法,经常会用到视频图像侦测中。这种方法对于动态的视频图像特征侦测比较适合,因为模型中是前景和背景分离开来的。分离前景和背景的基准是判断像素点变化率,会把变化慢的学习为背景,变化快的视为前景。
- //
- #include "stdafx.h"
- #include "cv.h"
- #include "highgui.h"
- #include "cxtypes.h"
- #include "cvaux.h"
- # include <iostream>