MACでOpenCVを使ってカメラの画像のHSVの平均を求める

OpenCVを使ってMACのカメラに映る画像をHSVの平均を表示してみた。 OpenCVだとHは0-180,Sは0-255,Vは0-255とのこと。 適当にiPhoneのアプリとかでHSVを指定した色をカメラに見せると正しそうな値が表示されている、、気がする。

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <ctype.h>
#include <unistd.h>
#include <stdio.h>

int
main (int argc, char **argv)
{
  CvCapture *capture = 0;
  IplImage *frame = 0;
  IplImage *hsv_Image = 0;
  CvSize image_size = {320, 240};
  int c;
  int hue_average = 0;
  int saturation_average = 0;
  int value_average = 0;

  // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する
  if (argc == 1 || (argc == 2 && strlen (argv[1]) == 1 && isdigit (argv[1][0])))
    capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - '0' : 0);

  /* この設定は,利用するカメラに依存する */
  // (2)キャプチャサイズを設定する.
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, image_size.width);
  cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, image_size.height);

  cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE);

  /* HSV変換先のメモリを確保する */
  hsv_Image = cvCreateImage (image_size, IPL_DEPTH_8U, 3);

   // (3)カメラから画像をキャプチャする
  while (1) {
      frame = cvQueryFrame (capture);

      /* HSV形式に変換する */
      cvCvtColor(frame, hsv_Image, CV_BGR2HSV);
      for(int y = 0; y < hsv_Image->height; y++){
          for(int x = 0; x < hsv_Image->width; x++){
              /* imageDataはchar型なので 0-127? */
              /* 0 - 180 */
              hue_average += (unsigned char)hsv_Image->imageData[hsv_Image->widthStep * y + x * 3];
              /* 0 - 255 */
              saturation_average+= (unsigned char)hsv_Image->imageData[hsv_Image->widthStep * y + x * 3 + 1];
              /* 0 - 255 */
              value_average += (unsigned char)hsv_Image->imageData[hsv_Image->widthStep * y + x * 3 + 2];
          }
      }

      printf("hue_average=%d,%d\n",hue_average,hue_average/(hsv_Image->width * hsv_Image->height));
      printf("saturation_average=%d,%d\n",saturation_average,saturation_average/(hsv_Image->width * hsv_Image->height));
      printf("value_average=%d,%d\n",value_average,value_average/(hsv_Image->width * hsv_Image->height));
      fflush( stdout ); 

      cvShowImage ("Capture", frame);
      hue_average = 0;
      saturation_average = 0;
      value_average = 0;
      c = cvWaitKey (2);
      if (c == '\x1b')
          break;

      sleep(1);
  }

  cvReleaseCapture (&capture);
  cvReleaseImage (&hsv_Image);
  cvDestroyWindow ("Capture");

  return 0;
}