Menu

OpenCV探索之路(二十七):皮肤检测技术 – Madcola

0 Comment

我冗长的缺勤写视频博客了。,因近的我一向从一边至另一边赶工夫和玩游玩。 好吧,其时我计划写一篇就运用opencv做皮肤检测的技术总结。那率先列大概现时主流的皮肤检测的方法都有多少:

  1. RGB color space
  2. YCRCB的CR附加加重值于 OTSU门限值
  3. YCrCb中133<=Cr<=173 77<=Cb<=127
  4. 在HSV 7
  5. 鉴于长圆皮肤制作模型的皮肤检测
  6. OpenCV附属机构面色检测类自适应检测仪

这么我们的其时即将逐个地地认得它。!

方法一:鉴于RGB的皮肤检测

阵地RGB色制作模型,查找精确地解释的皮肤色击中要害像素。,类别在远处的像素设置为黑色。。

你可以在商量通讯以后意识到。,先驱做了大批的研究工作。,RGB时尚下的面色类别根本契合以下内容::

在无变化照明下,以下标准应该是达到的:

R>95 AND G>40 B>20 AND 峰值(R),G,B)-MIN(R,G,B)>15 AND ABS(R g)>15 AND R>G AND R>B

侧光拍摄使处于某种特任的情况之下下:

R>220 AND G>210 AND B>170 AND ABS(R g)<=15 AND R>B AND G>B

现时判别曾经决定了。,终于,阵地标准停止划桨写作顺序。。

/*鉴于RGB类别的皮肤检测*/
Mat RGB_detect(Mat& IMG)
{
    /*
        R>95 AND G>40 B>20 AND 峰值(R),G,B)-MIN(R,G,B)>15 AND ABS(R g)>15 AND R>G AND R>B
            OR
        R>220 AND G>210 AND B>170 AND ABS(R g)<=15 AND R>B AND G>B
    */
    Mat detect = ();
    (0);
    if (() || () != 3)
    {
        return detect;
    }

    for (int) i = 0; i < img.rows; i++)
    {
        for (int) j = 0; j < img.cols; j++)
        {
            uchar *p_detect = (i, j);
            uchar *p_img = (i, j);
            if ((p_img[2] > 95 && p_img[1]>40 && p_img[0] > 20 &&
                (标准斯)(PIMIG〔0〕, 峰值(PIMIG〔1〕, p_img[2])) - min(PIMIG〔0〕, min(PIMIG〔1〕, p_img[2])) > 15) &&
                ABS(PIMIG〔2〕 - p_img[1]) > 15 && p_img[2] > p_img[1] && p_img[1] > p_img[0]) ||
                (p_img[2] > 200 && p_img[1] > 210 && p_img[0] > 170 && ABS(PIMIG〔2〕 - p_img[1]) <= 15 &&
                p_img[2] > p_img[0] &&  p_img[1] > p_img[0]))
            {
                p_detect[0] = p_img[0];
                p_detect[1] = p_img[1];
                p_detect[2] = p_img[2];
            }

         
        }

    }
    return detect;
}

检测出路如次::

从实验出路可以看出。,皮肤检测去地。,率先皮肤检测的完好性不许的高,大概光线稍差的区域不克不及检测皮肤。。以第二位,该算法鉴于RGB类别来决定皮肤设想受光的星力,健壮性不敷好。。

方法二:鉴于长圆皮肤制作模型的皮肤检测

大批的皮肤统计学可以钞票先驱。,假定皮肤通讯熭到YCRCB空隙,在CRCB二维空隙中,这些皮肤像素相近于长圆。。假定我们的设法对付CRCB的长圆,比邻使动作协调(CR), Cb)我们的只需求决定它设想在长圆中(包含BO)。,假定是,它可以被断定为皮肤。,用以表现威胁,缺勤皮肤像素。。

/*鉴于长圆皮肤制作模型的皮肤检测*/
Mat ellipse_detect(Mat& SRC)
{
    Mat img = ();
    Mat skinCrCbHist = 零点(大块)(256), 256), CV_8UC1);
    使用OpenCV的长圆构筑应变量,将其适宜面色长圆。
    ellipse(skinCrCbHist, Point(113, ), Size(23.4, 15.2), 43.0, 0.0, 360.0, Scalar(255, 255, 255), -1);
    Mat ycrcb_image;
    Mat output_mask = 垫子:零点, CV_8UC1);
    cvtColor(img, ycrcb_image, CV_BGR2YCrCb); 率先替换为YCRCB空隙。
    for (int) i = 0; i < img.cols; i++)   //使用长圆皮肤制作模型停止皮肤检测
        for (int) j = 0; j < img.rows; j++) 
        {
            Vec3b ycrcb = (j, i);
            if ((ycrcb[1], ycrcb[2]) > 0)   假定它落入皮肤制作模型的长圆区域,关键点是皮肤像素。
                (j, i) = 255;
        }

    Mat detect;
    (检测,output_mask);  返乡皮肤色图
    return detect;
}

检测印象:

这种鉴于面色长圆制作模型的算法的皮肤检测较上面算法在印象上有钱人较大的推,根本上,曾经检测到改性皮肤。,光的抗干忧的充其量的也很强。,检测到的图像更彻底。,安排杂质少。

法三:YCRCB色空隙CR附加加重值于 OTSU方法门限值使成粉末

这边概要绍介YCRCB色空隙。。
YCrCb即YUV,Y表现光彩(光彩或光彩)。,这执意灰度值。;和U和V。 脸色是色度(色度或色度)。,其功用是刻画图像的色和饱和状态。,用于任命像素的色。。光彩是经过RGB输出征象创办的。,该方法是将RGB征象的特任零件叠加合作。。色度精确地解释了色彩和饱和状态的两个方面。,它们使分裂由Cr和Cb表现。。在监狱里,CR反省的RGB输出征象的白色物质值当中的差值。。CB反省的了RGB输出征象的蓝色值当中的多样化。。

该方法的规律也去复杂。:

将RGB图像替换为YCRCB色空隙。,CR附加加重值于图像的学会

b.从Otsu(Otsu)实施CR自门限值使成粉末

YCRCB色空隙CR附加加重值于 Otsu方法
Mat YCrCb_Otsu_detect(Mat& SRC)
{
    Mat ycrcb_image;
    cvtColor(src, ycrcb_image, CV_BGR2YCrCb); 率先替换为YCRCB空隙。
    Mat detect;
    vector channels;
    split(ycrcb_image, 小巷)
    Mat output_mask = 小巷〔1〕
    threshold(output_mask, output_mask, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
    (检测, output_mask);
    return detect;

}

检测印象:

法四:鉴于YCRCB色空隙的CR,CB类别选择方法

左右方法与法度方法完好相等地。,不管怎样色空隙是不同的的。。阵地最高纪录显示,标准蒙古人种的Cr附加加重值于大概在133至173当中,Cb附加加重值于大概在77至127当中。你可以阵地你减少或减少这两个身分的类别。,它会有不同的的印象。。

YCRCB色空隙CR,CB类别选择方法*/
Mat YCrCb_detect(Mat & SRC)
{
    Mat ycrcb_image;
    int Cr = 1;
    int Cb = 2;
    cvtColor(src, ycrcb_image, CV_BGR2YCrCb); 率先替换为YCRCB空隙。
    Mat output_mask = 垫子:零点, CV_8UC1);
    for (int) i = 0; i < src.rows; i++)
    {
        for (int) j = 0; j < src.cols; j++)
        {
            uchar *p_mask = (i, j);
            uchar *p_src = (i, j);
            if (p_src[Cr] >= 133 && p_src[Cr] <= 173 && p_src[Cb] >= 77 && p_src[Cb] <= 127)
            {
                p_mask[0] = 255;
            }
        }
    }
    Mat detect;
    (检测, output_mask);;
    return detect;

}

检测印象:

法五:HSV色空隙H类别选择方法

异样地,它也在不同的的色空隙中采取正当的的色类别。。

/*HSV色空隙H类别选择方法*/
Mat HSV_detector(Mat& SRC)
{
    Mat hsv_image;
    int h = 0;
    int s = 1;
    int v = 2;
    cvtColor(src, hsv_image, CV_BGR2HSV); 率先替换为YCRCB空隙。
    Mat output_mask = 垫子:零点, CV_8UC1);
    for (int) i = 0; i < src.rows; i++)
    {
        for (int) j = 0; j < src.cols; j++)
        {
            uchar *p_mask = (i, j);
            uchar *p_src = (i, j);
            if (p_src[h] >= 0 && p_src[h] <= 20 && p_src[s] >=48 && p_src[v] >=50)
            {
                p_mask[0] = 255;
            }
        }
    }
    Mat detect;
    (检测, output_mask);;
    return detect;
}

检测印象:

法六:OpenCV附属机构面色检测类自适应检测仪

opencv布置了上面左右好用的皮肤检测应变量:

CvAdaptiveSkinDetector(int) samplingDivider = 1, int morphingMethod = MORPHING_METHOD_NONE);

左右应变量的以第二位个参量表现皮肤检测皱纹时所采取的图形学手柄方法,有3种可能性。:

  • 假定是畸变方法,这隐含不料任一侵蚀手柄。;
  • 假定是畸变方法_ERODE,这隐含2次陆续的侵蚀手柄。;
  • 假定是畸变方法_DILATE,这隐含率先要停止侵蚀手柄。,拉长说手柄后。。
/*OpenCV附属机构面色检测类自适应检测仪*/
Mat AdaptiveSkinDetector_detect(Mat& SRC)
{
    IplImage *frame;
    frame = &IplImage(SRC);  //Mat -> IplImage
    CvAdaptiveSkinDetector 滤波器(1), CvAdaptiveSkinDetector::MORPHING_METHOD_ERODE_DILATE);

    IplImage *maskImg = cvCreateImage(cvSize(src.cols, src.rows), IPL_DEPTH_8U, 1);
    IplImage *skinImg = cvCreateImage(cvSize(src.cols, src.rows), IPL_DEPTH_8U, 3);
    cvZero(skinImg);
    (骨架构架, maskImg);    // process the frame
    cvCopy(骨架构架, skinImg, maskImg);
    Mat tmp(skinImg);  //IplImage -> Mat
    Mat detect = ();
    cvReleaseImage(&skinImg);
    cvReleaseImage(&maskImg);
    return detect;
}

从印象图,安排中有许多的白色物质杂质。,从天才的角度看,它如同不同的我上面写的那么多的算法。,它与发现参与吗?自然。,opencv自带的左右api在皮肤检测上确凿相当合适的的。

总结

其时花了将近7个小时才撸了冠词摆脱==!冠词对各大主流的皮肤检测算法做了个总结和应验。确实,这很复杂。,每个算法的思惟去证实。,一切都是鉴于总结的大概经历。,设定面色类别。,那时过滤掉它。,不同的的是,过滤皱纹是在不同的的COL中停止的。。我们的可以运用我们的本身的发现。,正当的地修正这些区域。,获益达到印象。。可以改善的方位是,我们的可以运用正当的的滤波器或形态学处置大概听起来。,使学会的皮肤更新的。。

完好的编码可以会谈我的GITHUB

发表评论

电子邮件地址不会被公开。 必填项已用*标注