zoukankan      html  css  js  c++  java
  • opencv基于HSV的肤色分割

    //函数功能:在HSV颜色空间对图像进行肤色模型分割 //输入:src-待处理的图像,imgout-输出图像 //返回值:返回一个iplimgae指针,指向处理后的结果 IplImage* SkinSegmentHSV(IplImage* src,IplImage* imgout)

    {

     //定义一些中间指针,指向处理过程中的中间变量

     IplImage* HSV = NULL;  

    IplImage* HImg= NULL;

     IplImage* SImg= NULL;

     IplImage* VImg= NULL;

     //指向处理后的结果  

    IplImage* result = NULL;

     if (!src||!imgout)  {   return NULL;  }

     //获取输入图像的大小

     CvSize SrcSize = cvGetSize(src);

     //为中间结果指针分配存储空间

     HSV = cvCreateImage(SrcSize,8,3);

     HImg= cvCreateImage(SrcSize,8,1);  

    SImg= cvCreateImage(SrcSize,8,1);  

    VImg= cvCreateImage(SrcSize,8,1);  

     result= cvCreateImage(cvGetSize(imgout),8,1);

     //将图像从RGB颜色空间转换到HSV空间

     cvCvtColor(src,HSV,CV_BGR2HSV);

     //将HSV分解为三张单通道图像,便于后面就行处理  

    cvSplit(HSV,HImg,SImg,VImg,NULL);

       int i,j;  int value = 0;  

    //对通道H进行处理  

    for (i = 0; i < HImg->height; i++)

     {  

              for (j = 0; j < HImg->width; j++)

               {   

                      value = cvGetReal2D(HImg,i,j);   

                      if (value >=0 && value <= 25)   

                      {     *(HImg->imageData+i*HImg->widthStep+j) = 255;    }    

                    else    {     *(HImg->imageData+i*HImg->widthStep+j) = 0;    }               

                }  

     }

     //对通道S进行处理

     for (i = 0; i < SImg->height; i++)  {   for (j = 0; j < SImg->width; j++)

      {    value = cvGetReal2D(SImg,i,j);   

     if (value >=26 && value <= 200)   

     {     *(SImg->imageData+i*SImg->widthStep+j) = 255;    }    

    else    {     *(SImg->imageData+i*SImg->widthStep+j) = 0;    }  

     }

     }

     //对通道V进行处理  

     for (i = 0; i < VImg->height; i++)  {  

     for (j = 0; j < VImg->width; j++)   {   

     value = cvGetReal2D(VImg,i,j);    

     if (value >=20 && value <= 200)     {     *(VImg->imageData+i*VImg->widthStep+j) = 255;     }     

    else     {      *(VImg->imageData+i*VImg->widthStep+j) = 0;     }    }   }

      cvAnd(HImg,SImg,result,0);  

    cvAnd(VImg,result,result,0);

     //对所得到的结果进行形态学腐蚀处理,去除小区域部分

     cvErode(result,result);  cvErode(result,result);  cvErode(result,result);  cvDilate(result,result);

     //将处理后的结果赋值给输出图像

     cvCopy(result,imgout);  

     //释放相关资源  

    cvReleaseImage(&src);  cvReleaseImage(&HSV);  cvReleaseImage(&HImg);  cvReleaseImage(&SImg);  cvReleaseImage(&VImg);  cvReleaseImage(&result);

     //返回处理后的结果

     return imgout;

    }

  • 相关阅读:
    SpringCloud分布式配置中心
    SpringCloud服务降级案列
    SpringCloud断路器(Hystrix)
    SpringCloud服务过滤filter
    SpringCloud路由网关Zuul
    SpringCloud微服务实现生产者消费者+ribbon负载均衡
    SpringCloud微服务的Eureka
    忘记MySQL密码以及无法登陆等解决办法
    MySQL备份
    实现两个MySQL数据库之间的主从同步
  • 原文地址:https://www.cnblogs.com/xingma0910/p/3197502.html
Copyright © 2011-2022 走看看