#include <stdio.h>
 #include "opencv2/core/core.hpp"
 #include "opencv2/features2d/features2d.hpp"
 #include "opencv2/highgui/highgui.hpp"
 #include "opencv2/nonfree/nonfree.hpp"
 #ifndef _DEBUG
 #pragma  comment(lib,"IlmImf.lib")   
 #pragma  comment(lib,"libjasper.lib")    
 #pragma  comment(lib,"libjpeg.lib")   
 #pragma  comment(lib,"libpng.lib")       
 #pragma  comment(lib,"libtiff.lib")  
 #pragma  comment(lib,"zlib.lib")   
 #pragma  comment(lib,"opencv_calib3d2411.lib")
 #pragma  comment(lib,"opencv_contrib2411.lib")
 #pragma  comment(lib,"opencv_core2411.lib")
 #pragma  comment(lib,"opencv_features2d2411.lib")
 #pragma  comment(lib,"opencv_flann2411.lib")
 #pragma  comment(lib,"opencv_gpu2411.lib")
 #pragma  comment(lib,"opencv_highgui2411.lib")
 #pragma  comment(lib,"opencv_imgproc2411.lib")
 #pragma  comment(lib,"opencv_legacy2411.lib")
 #pragma  comment(lib,"opencv_ml2411.lib")
 #pragma  comment(lib,"opencv_nonfree2411.lib")
 #pragma  comment(lib,"opencv_objdetect2411.lib")
 #pragma  comment(lib,"opencv_ocl2411.lib")
 #pragma  comment(lib,"opencv_photo2411.lib")
 #pragma  comment(lib,"opencv_stitching2411.lib")
 #pragma  comment(lib,"opencv_superres2411.lib")
 #pragma  comment(lib,"opencv_ts2411.lib")
 #pragma  comment(lib,"opencv_video2411.lib")
 #pragma  comment(lib,"opencv_videostab2411.lib")
 #else
 #pragma  comment(lib,"zlibd.lib")
 #pragma  comment(lib,"IlmImfd.lib")
 #pragma  comment(lib,"libjasperd.lib")
 #pragma  comment(lib,"libjpegd.lib")
 #pragma  comment(lib,"libpngd.lib")
 #pragma  comment(lib,"libtiffd.lib")
 #pragma  comment(lib,"opencv_calib3d2411d.lib")
 #pragma  comment(lib,"opencv_contrib2411d.lib")
 #pragma  comment(lib,"opencv_core2411d.lib")
 #pragma  comment(lib,"opencv_features2d2411d.lib")
 #pragma  comment(lib,"opencv_flann2411d.lib")
 #pragma  comment(lib,"opencv_gpu2411d.lib")
 #pragma  comment(lib,"opencv_highgui2411d.lib")
 #pragma  comment(lib,"opencv_imgproc2411d.lib")
 #pragma  comment(lib,"opencv_legacy2411d.lib")
 #pragma  comment(lib,"opencv_ml2411d.lib")
 #pragma  comment(lib,"opencv_nonfree2411d.lib")
 #pragma  comment(lib,"opencv_objdetect2411d.lib")
 #pragma  comment(lib,"opencv_ocl2411d.lib")
 #pragma  comment(lib,"opencv_photo2411d.lib")
 #pragma  comment(lib,"opencv_stitching2411d.lib")
 #pragma  comment(lib,"opencv_superres2411d.lib")
 #pragma  comment(lib,"opencv_ts2411d.lib")
 #pragma  comment(lib,"opencv_video2411d.lib")
 #pragma  comment(lib,"opencv_videostab2411d.lib")
 #endif using namespace cv;
 using namespace std;
 #include <math.h>
 #include "opencv\highgui.h"
 #include "opencv\cv.h"
 #include "time.h"
 #include <iostream>struct BGR
 {
  uchar b;
  uchar g;
  uchar r;
 };struct HSV
 {
  int h;
  double s;
  double v;
 };bool IsEquals(double val1 , double val2 )
 {
  return fabs( val1 - val2) < 0.00001;
 }//RGB(BGR: 0~255)转HSV(H: [0~360), S: [0~1], V: [0~1])
 void BGR2HSV(BGR &bgr, HSV &hsv)
 {
  double b, g, r;
  double h, s, v;
  double min, max;
  double delta; b = bgr.b / 255.0;
  g = bgr.g / 255.0;
  r = bgr.r / 255.0; if (r > g)
  {
   max = MAX( r, b);
   min = MIN( g, b);
  }
  else
  {
   max = MAX( g, b);
   min = MIN( r, b);
  } v = max;
  delta = max - min; if (IsEquals( max, 0))
  {
   s = 0.0;
  }
  else
  {
   s = delta/ max;
  } if (max == min)
  {
   h = 0.0;
  }
  else
  {
   if ( IsEquals( r, max) && g >= b)
   {
    h = 60 * ( g - b)/ delta + 0;
   }
   else if ( IsEquals( r, max) && g < b)
   {
    h = 60 * ( g - b)/ delta + 360;
   }
   else if ( IsEquals( g, max))
   {
    h = 60 * ( b - r)/ delta + 120;
   }
   else if ( IsEquals( b, max))
   {
    h = 60 * ( r - g)/ delta + 240;
   }
  } hsv.h = ( int)( h + 0.5);
  hsv.h = ( hsv. h > 359) ? ( hsv. h - 360) : hsv. h;
  hsv.h = ( hsv. h < 0) ? ( hsv. h + 360) : hsv. h; //hsv. h = hsv. h + 60;// h取值范围为[0, 360)
  //hsv. h = ( hsv. h > 359) ?  (hsv. h - 360): hsv. h;
  //hsv. h = ( hsv. h < 0) ? ( hsv. h + 360) : hsv. h; hsv.s = s;
  hsv.v = v;
 }//RGB(BGR: 0~255)转HSV(H: [0~360), S: [0~1], V: [0~1])
 void HSV2BGR(HSV &hsv, BGR &bgr)
 {
  int h = hsv.h;
  double s = hsv. s;
  double v = hsv. v;
  double b = 0.0;
  double g = 0.0;
  double r = 0.0; int flag = ( int) abs( h/60.0 );
  double f = h/60.0 - flag;
  double p = v * (1 - s);
  double q = v * (1 - f* s);
  double t = v * (1 - (1- f)* s); switch ( flag)
  {
  case 0:
   b = p;
   g = t;
   r = v;
   break;
  case 1:
   b = p;
   g = v;
   r = q;
   break;
  case 2:
   b = t;
   g = v;
   r = p;
   break;
  case 3:
   b = v;
   g = q;
   r = p;
   break;
  case 4:
   b = v;
   g = p;
   r = t;
   break;
  case 5:
   b = q;
   g = p;
   r = v;
   break;
  default:
   break;
  } int blue = int( b * 255);
  bgr.b = ( blue > 255) ? 255 : blue;
  bgr.b = ( blue < 0) ? 0 : bgr. b; int green = int( g * 255);
  bgr.g = ( green > 255) ? 255 : green;
  bgr.g = ( green < 0) ? 0 : bgr. g; int red = int( r * 255);
  bgr.r = ( red > 255) ? 255 : red;
  bgr.r = ( red < 0) ? 0 : bgr. r;
 }int main()
 {
  string imgName = "D:/opencv/images/lena.jpg";
  Mat img = cv::imread(imgName);
  Mat tmp = img.clone(); if (img.data == NULL)
  {
   cout<< "Could not open or find the image"<<endl;
   return -1;
  } int row = img. rows;
  int col = img. cols * img.channels();
  uchar * pImg = NULL;
  BGR bgr;
  HSV hsv; for ( int i = 0; i < row; i++)
  {
   pImg = img. ptr< uchar>( i); // 遍历时用img.at()效率会降很多, 很耗时
   for ( int j = 0; j < col; j+=3)
   {
    bgr. b = pImg[ j];
    bgr. g = pImg[ j + 1];
    bgr. r = pImg[ j + 2];
    BGR2HSV( bgr, hsv);
    pImg[j]     = hsv.h/2;
    pImg[j + 1] = hsv.s*255;
    pImg[j + 2] = hsv.v*255;   //HSV2BGR( hsv, bgr);
    //pImg[j]     = bgr. b;
    //pImg[j + 1] = bgr. g;
    //pImg[j + 2] = bgr. r;
   }
  }
  imshow("hsv", img); cvtColor(img, img, CV_HSV2BGR);
 #if 0
  for ( int i = 0; i < row; i++)
  {
   pImg = img. ptr< uchar>( i); // 遍历时用img.at()效率会降很多, 很耗时
   for ( int j = 0; j < col; j+=3)
   {
    //bgr. b = pImg[ j];
    //bgr. g = pImg[ j + 1];
    //bgr. r = pImg[ j + 2];
    //BGR2HSV( bgr, hsv);   hsv.h = pImg[j]*2    ;
    hsv.s = pImg[j + 1]/255;
    hsv.v = pImg[j + 2]/255;   HSV2BGR( hsv, bgr);
    pImg[j]     = bgr. b;
    pImg[j + 1] = bgr. g;
    pImg[j + 2] = bgr. r;
   }
  }
 #endif
  imshow("dd", img);
  cv::waitKey();  imshow("opencv", tmp);
  cv::waitKey();
  cvtColor(tmp, tmp, CV_BGR2HSV);
  imshow("opencv", tmp);
  cv::waitKey();
  vector< Mat> channels;
  split( tmp, channels);
  //channels[0] += 30;//H 这里没有做范围判断,opencv的h取值范围为[0, 180)
  //channels[1] += 100;//S
  channels[2] += 100;//V
  merge(channels, tmp);
  cvtColor(tmp, tmp, CV_HSV2BGR);
  imshow("opencv", tmp);
  cv::waitKey(); return 0;
 }int mainBak()
 {
  IplImage* image = cvLoadImage("D:/opencv/images/lena.jpg");  
  IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );
  cvCvtColor(image,hsv,CV_BGR2HSV); cvNamedWindow("saturate_SV",CV_WINDOW_AUTOSIZE);  
  cvShowImage("saturate_SV",hsv);  
  cvWaitKey(0);  
  cvReleaseImage(&hsv);  
  cvDestroyWindow("saturate_SV");  
  return 0;
 }