基于OpenCV 肤色检测

来源:互联网 发布:淘宝上的宝贝怎么分类 编辑:程序博客网 时间:2024/06/02 21:26

一、相关代码如下

//肤色检测
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

}
   

 

 

 

0 0
原创粉丝点击