ピクセルデータに直接アクセス

OpenCVを使ってみます。OpenCVインテルが公開しているライブラリのことです。

とりあえずopencv.jpのサンプルコードを参考にしてコードを書いてみました。

#include <cv.h>
#include <highgui.h>

int
main (int argc, char **argv)
{
  int x, y;
  unsigned char p[3];
  IplImage *img;

  if (argc != 2 || (img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0)
    return -1;

  // ピクセルデータの取得(BGR)
  // widthStep = アライメントした横のバイトサイズ 
  for (y = 0; y < img->height; y++) {
    for (x = 0; x < img->width; x++) {
      p[0] = img->imageData[img->widthStep * y + x * 3];        // B
      p[1] = img->imageData[img->widthStep * y + x * 3 + 1];    // G
      p[2] = img->imageData[img->widthStep * y + x * 3 + 2];    // R

      img->imageData[img->widthStep * y + x * 3] = cvRound((p[0] + p[1] + p[2]) / 3);
      img->imageData[img->widthStep * y + x * 3 + 1] = cvRound((p[0] + p[1] + p[2]) / 3);
      img->imageData[img->widthStep * y + x * 3 + 2] = cvRound((p[0] + p[1] + p[2]) / 3);

    }
  }

  cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE);
  cvShowImage ("Image", img);
  cvWaitKey (0);

  cvDestroyWindow ("Image");
  cvSaveImage("gray.jpg",img);
  cvReleaseImage (&img);

  return 0;
}

実行結果

↓グレースケールに変換 (RGBの平均をとり、平均値をRGBに格納する)