12月 242009
カメラの入力画像から平均的な色を求めて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