//函數功能:在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;
}