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;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM