カメラの入力画像から平均的な色を求めてRGBで出力する。
頻出色じゃなくて、全体的に赤っぽかったらr:200,g:50,b:50みたいなかんじで出す。赤っぽいとか青っぽいとかを求めたい。


数えて平均出そうかと思ったけどOpenCVで1×1ピクセルの画像にリサイズしてしまうのが速い&早いことに気づいた。
一応カメラのプレビューと、その色で塗りつぶしたウィンドウを出してみている。1ピクセルの画像はcvShowImageできないので、表示のために2ピクセルの画像を作っている
image1px.cpp

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

int main(int argc, char** argv) {
  CvCapture *capture;
  IplImage *img, *img1px, *imgR, *imgG, *imgB, *img2px;
  img1px = cvCreateImage(cvSize(1,1), IPL_DEPTH_8U, 3);
  imgR = cvCreateImage(cvSize(1,1), IPL_DEPTH_8U, 1);
  imgG = cvCreateImage(cvSize(1,1), IPL_DEPTH_8U, 1);
  imgB = cvCreateImage(cvSize(1,1), IPL_DEPTH_8U, 1);
  img2px = cvCreateImage(cvSize(2,2), IPL_DEPTH_8U, 3);
  
  char *winNameCapture = "Capture";
  char *winName1px = "Image1px";
  cvNamedWindow(winNameCapture, CV_WINDOW_AUTOSIZE);
  cvNamedWindow(winName1px, CV_WINDOW_AUTOSIZE);
  capture = cvCreateCameraCapture(0);

  while (1) {
    img = cvQueryFrame(capture);
    cvShowImage(winNameCapture, img);
    cvResize(img, img1px, CV_INTER_CUBIC);
    cvSplit(img1px, imgB, imgG, imgR, NULL);
    printf("r:%d, g:%d, b:%d\n", 
           (unsigned char)imgR->imageDataOrigin[0],
           (unsigned char)imgG->imageDataOrigin[0],
           (unsigned char)imgB->imageDataOrigin[0]);
    cvResize(img1px, img2px, CV_INTER_CUBIC);
    cvShowImage(winName1px, img2px);
    if (cvWaitKey(33) == 'q') break;
  }
  
  cvReleaseCapture(&capture);
  cvDestroyWindow(winNameCapture);
  cvDestroyWindow(winName1px);
  return 0;
}


Makefile
SRC = image1px.cpp
DST = image1px

prefix=/opt/local
CV_INCPATH=$(prefix)/include/opencv
CV_LIBPATH=$(prefix)/lib 

CV_LIBS= -lcv -lcvaux -lcxcore -lhighgui 

all:
g++ -O $(SRC) -o $(DST) -I$(CV_INCPATH) -L. -L$(CV_LIBPATH) $(CV_LIBS)


赤いポストイットをカメラの前に
平均的な色を取得
出力
赤いことがわかる
r:186, g:61, b:61
r:186, g:61, b:61
r:191, g:63, b:61
r:198, g:67, b:63
r:200, g:69, b:63


平均的な色を取得
白い。
r:149, g:146, b:147
r:159, g:155, b:156
r:169, g:156, b:159
r:169, g:160, b:161
r:169, g:159, b:161
r:169, g:159, b:161


平均的な色を取得
赤黒いのかな?
r:126, g:92, b:124
r:126, g:92, b:124
r:126, g:92, b:124
r:126, g:92, b:124
r:126, g:92, b:124
r:126, g:92, b:124
r:125, g:92, b:124


平均的な色を取得
白い
r:126, g:119, b:126
r:126, g:119, b:126
r:126, g:119, b:125
r:125, g:118, b:125
r:125, g:118, b:125
r:125, g:118, b:125
r:125, g:118, b:125