一、相关代码如下
//肤色检测
void IMG_ComplexionDetector(IplImage* img)
{
Mat imgROI(img);
Mat ROI_mask;
IplImage *img_mask = NULL;
//椭圆皮肤模型
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);
Mat ycrcb_image;
ROI_mask = Mat::zeros(imgROI.size(), CV_8UC1);
cvtColor(imgROI, ycrcb_image, CV_BGR2YCrCb); //首先转换成到YCrCb空间
img_mask = cvCreateImage(cvSize(IplImage(ROI_mask).width, IplImage(ROI_mask).height),\
IplImage (ROI_mask).depth, IplImage(ROI_mask).nChannels);
if(img_mask == NULL)
{
printf("img_mask == NULL error\r\n");
}
//利用椭圆皮肤模型进行皮肤检测
for(int i = 0; i < imgROI.cols; i++)
{
for(int j = 0; j < imgROI.rows; j++)
{
Vec3b ycrcb = ycrcb_image.at<Vec3b>(j, i);
if(skinCrCbHist.at<uchar>(ycrcb[1], ycrcb[2]) > 0)
{
ROI_mask.at<uchar>(j, i) = 255;
}
}
}
cvCopy(&IplImage(ROI_mask), img_mask);
//进行形态学滤波,去掉噪声
//cvErode(img_mask, img_mask, 0, 2); //腐蚀 2
//cvDilate(img_mask, img_mask, 0, 10); //膨胀 5 15
}