opencv-根據顏色進行目標檢測

Code:
  1. #include <cv.h>   
  2. #include <highgui.h>   
  3.   
  4. // 該接口來至   冰風2009手勢識別    
  5. // 進行膚色檢測   
  6. void SkinDetect(IplImage* src,IplImage* dst)   
  7. {   
  8.     // 創建圖像頭   
  9.     IplImage* hsv = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 3);//用於存圖像的一箇中間變量,是用來分通道用的,分成hsv通道   
  10.     IplImage* tmpH1 = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1);//通道的中間變量,用於膚色檢測的中間變量   
  11.     IplImage* tmpS1 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);   
  12.     IplImage* tmpH2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);   
  13.     IplImage* tmpS3 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);   
  14.     IplImage* tmpH3 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);   
  15.     IplImage* tmpS2 = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);   
  16.     IplImage* H = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1);   
  17.     IplImage* S = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1);   
  18.     IplImage* V = cvCreateImage( cvGetSize(src), IPL_DEPTH_8U, 1);     
  19.     IplImage* src_tmp1=cvCreateImage(cvGetSize(src),8,3);   
  20.        
  21.     // 高斯模糊   
  22.     cvSmooth(src,src_tmp1,CV_GAUSSIAN,3,3); //高斯模糊   
  23.        
  24.     // hue色度,saturation飽和度,value純度   
  25.     cvCvtColor(src_tmp1, hsv, CV_BGR2HSV );//顏色轉換   
  26.     cvCvtPixToPlane(hsv,H,S,V,0);//分爲3個通道   
  27. /*********************膚色檢測部分**************/  
  28.     cvInRangeS(H,cvScalar(0.0,0.0,0,0),cvScalar(20.0,0.0,0,0),tmpH1);   
  29.     cvInRangeS(S,cvScalar(75.0,0.0,0,0),cvScalar(200.0,0.0,0,0),tmpS1);   
  30.     cvAnd(tmpH1,tmpS1,tmpH1,0);   
  31.        
  32.     // Red Hue with Low Saturation   
  33.     // Hue 0 to 26 degree and Sat 20 to 90   
  34.     cvInRangeS(H,cvScalar(0.0,0.0,0,0),cvScalar(13.0,0.0,0,0),tmpH2);    
  35.     cvInRangeS(S,cvScalar(20.0,0.0,0,0),cvScalar(90.0,0.0,0,0),tmpS2);   
  36.     cvAnd(tmpH2,tmpS2,tmpH2,0);   
  37.   
  38.     // Red Hue to Pink with Low Saturation   
  39.     // Hue 340 to 360 degree and Sat 15 to 90   
  40.     cvInRangeS(H,cvScalar(170.0,0.0,0,0),cvScalar(180.0,0.0,0,0),tmpH3);   
  41.     cvInRangeS(S,cvScalar(15.0,0.0,0,0),cvScalar(90.,0.0,0,0),tmpS3);   
  42.     cvAnd(tmpH3,tmpS3,tmpH3,0);   
  43.   
  44.     // Combine the Hue and Sat detections   
  45.     cvOr(tmpH3,tmpH2,tmpH2,0);   
  46.     cvOr(tmpH1,tmpH2,tmpH1,0);   
  47.   
  48.     cvCopy(tmpH1,dst);   
  49.   
  50.     cvReleaseImage(&hsv);   
  51.     cvReleaseImage(&tmpH1);   
  52.     cvReleaseImage(&tmpS1);   
  53.     cvReleaseImage(&tmpH2);   
  54.     cvReleaseImage(&tmpS2);   
  55.     cvReleaseImage(&tmpH3);   
  56.     cvReleaseImage(&tmpS3);   
  57.     cvReleaseImage(&H);   
  58.     cvReleaseImage(&S);   
  59.     cvReleaseImage(&V);   
  60.     cvReleaseImage(&src_tmp1);   
  61. }   
  62.   
  63. int main(int argc, char* argv[])   
  64. {   
  65.   
  66.     IplImage *src=cvLoadImage("hand.jpg", CV_LOAD_IMAGE_COLOR);   
  67.     //    
  68.     cvNamedWindow("src", CV_WINDOW_AUTOSIZE);   
  69.     cvShowImage("src", src);   
  70.     //   
  71.   
  72.     cvNamedWindow("flip", CV_WINDOW_AUTOSIZE);   
  73.     IplImage *dsc = cvCreateImage(cvGetSize(src), src->depth, 1);   
  74.        
  75.     // 以x軸翻轉   
  76.     SkinDetect(src, dsc);   
  77.     // cvFlip(src, dsc, 1);   
  78.     cvShowImage("flip", dsc);   
  79.     cvWaitKey(0);   
  80.     cvDestroyAllWindows();   
  81.     cvReleaseImage(&src);   
  82.     printf("Hello World!/n");   
  83.     return 0;   
  84. }  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章