zoukankan      html  css  js  c++  java
  • 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!
    ");
    
        */
        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;
    }
  • 相关阅读:
    一、单一职责原则
    四、接口隔离原则
    彼得·林奇的25条黄金规则
    程序员的四个境界
    VS2008开发.NET 2.0的项目时,可用的C#3.0语言特性一览表
    Linq试用问题总结
    SQL Server 2000中修改数据库COLLATE一例
    SQL Tip:将SP生成的结果集Insert到另一Table中
    OOAD读书笔记(一):什么是好的软件?
    成功创业的8个关键点
  • 原文地址:https://www.cnblogs.com/mypsq/p/5020183.html
Copyright © 2011-2022 走看看