OpenCv皮肤检测-HSV分离

HSV皮肤检测

// 进行肤色检测   
void SkinDetect(IplImage* src, IplImage* dst)
{
    // 创建图像头   
    IplImage* hsv = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);//用于存图像的一个中间变量,是用来分通道用的,分成hsv通道   
    IplImage* tmpH1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//通道的中间变量,用于肤色检测的中间变量   
    IplImage* tmpS1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* tmpH2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* tmpS3 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* tmpH3 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* tmpS2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* H = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* S = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);
    IplImage* V = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);

    IplImage* src_tmp1 = cvCreateImage(cvGetSize(src), 8, 3);

    // 高斯模糊   
    cvSmooth(src, src_tmp1, CV_GAUSSIAN, 3, 3); //高斯模糊   

    // hue色度,saturation饱和度,value纯度   
    cvCvtColor(src_tmp1, hsv, CV_BGR2HSV);//颜色转换   
    cvSplit(hsv, H, S, V, 0);//分为3个通道   

    cvInRangeS(H, cvScalar(0.0, 0.0, 0, 0), cvScalar(20.0, 0.0, 0, 0), tmpH1);
    cvInRangeS(S, cvScalar(75.0, 0.0, 0, 0), cvScalar(200.0, 0.0, 0, 0), tmpS1);
    cvAnd(tmpH1, tmpS1, tmpH1, 0);

    // Red Hue with Low Saturation   
    // Hue 0 to 26 degree and Sat 20 to 90   
    cvInRangeS(H, cvScalar(0.0, 0.0, 0, 0), cvScalar(13.0, 0.0, 0, 0), tmpH2);
    cvInRangeS(S, cvScalar(20.0, 0.0, 0, 0), cvScalar(90.0, 0.0, 0, 0), tmpS2);
    cvAnd(tmpH2, tmpS2, tmpH2, 0);

    // Red Hue to Pink with Low Saturation   
    // Hue 340 to 360 degree and Sat 15 to 90   
    cvInRangeS(H, cvScalar(170.0, 0.0, 0, 0), cvScalar(180.0, 0.0, 0, 0), tmpH3);
    cvInRangeS(S, cvScalar(15.0, 0.0, 0, 0), cvScalar(90., 0.0, 0, 0), tmpS3);
    cvAnd(tmpH3, tmpS3, tmpH3, 0);

    // Combine the Hue and Sat detections   
    cvOr(tmpH3, tmpH2, tmpH2, 0);
    cvOr(tmpH1, tmpH2, tmpH1, 0);

    cvCopy(tmpH1, dst);

    cvReleaseImage(&hsv);
    cvReleaseImage(&tmpH1);
    cvReleaseImage(&tmpS1);
    cvReleaseImage(&tmpH2);
    cvReleaseImage(&tmpS2);
    cvReleaseImage(&tmpH3);
    cvReleaseImage(&tmpS3);
    cvReleaseImage(&H);
    cvReleaseImage(&S);
    cvReleaseImage(&V);
    cvReleaseImage(&src_tmp1);
}

int main(int argc, char* argv[])
{
    /*
    IplImage *src = cvLoadImage("C:\\C_C++ code\\Photo and video\\text009.jpg", CV_LOAD_IMAGE_COLOR);
    //    
    cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
    cvShowImage("src", src);
    //   

    cvNamedWindow("flip", CV_WINDOW_AUTOSIZE);
    IplImage *dsc = cvCreateImage(cvGetSize(src), src->depth, 1);

    // 以x轴翻转   
    SkinDetect(src, dsc);
    // cvFlip(src, dsc, 1);   
    cvShowImage("flip", dsc);
    cvWaitKey(0);
    cvDestroyAllWindows();
    cvReleaseImage(&src);
    printf("Hello World!\n");

    */
    VideoCapture video(0);
    IplImage *src, *dst;
    Mat img,bigimg;
    double scalar = 2;
    video >> img;
    src = &(IplImage(img));
    dst = cvCreateImage(cvGetSize(src), 8, 1);
    while (1)
    {
        video >> img;
        src = &(IplImage(img));
        SkinDetect(src, dst);
        img = cvarrToMat(dst);
        //腐蚀与膨胀

        erode(img, img, Mat());
        erode(img, img, Mat());
        //erode(img, img, Mat());
        
        dilate(img, img, Mat());
        dilate(img, img, Mat());
        dilate(img, img, Mat());

        dilate(img, img, Mat());
        dilate(img, img, Mat());
        resize(img, bigimg, Size(img.cols*scalar, img.rows*scalar), 1, 1, 1);
        imshow("x", bigimg);
        if (waitKey(40) > 0)
            break;
    }
    waitKey();
    return 0;
}

 

posted @ 2015-12-04 18:31  一样菜  阅读(1085)  评论(0编辑  收藏  举报