最終更新: mikk_ni3_92 2008年06月17日(火) 13:20:45履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::塗りつぶし
#include <iostream>
#include <cv.h>
#include <highgui.h>
/****** 無名名前空間 ******/
namespace
{
const int WIDTH = 300;
const int HEIGHT = 300;
}
/*************[マウスのコールバック]************/
void Mouse( int event, int x, int y, int flags ,void *imgB);
/*******************[メイン関数]******************/
int main( int argc, char **argv)
{
IplImage *imgA = cvCreateImage(cvSize(WIDTH,HEIGHT),IPL_DEPTH_8U,3);
cvSet (imgA, cvScalarAll (255), 0);
cvDrawRect(imgA,cvPoint(WIDTH/3,HEIGHT/3),cvPoint(WIDTH*2/3,HEIGHT*2/3),CV_RGB(0,0,255));
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);
cvSetMouseCallback("window", Mouse,imgA);
cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvReleaseImage(& imgA);
cvDestroyWindow("window");
return 0;
}
/**************[ここから コールバック]************/
void Mouse( int event, int x, int y, int flags ,void *imgB)
{
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
cvFloodFill(static_cast<IplImage*>(imgB),cvPoint(x,y),CV_RGB(0,255,0));
cvShowImage("window",static_cast<IplImage *>(imgB));
break;
case CV_EVENT_RBUTTONDOWN:
cvSet (static_cast<IplImage *>(imgB), cvScalarAll (255), 0);
cvDrawRect(static_cast<IplImage *>(imgB),cvPoint(WIDTH/3,HEIGHT/3),cvPoint(WIDTH*2/3,HEIGHT*2/3),CV_RGB(0,0,255));
cvShowImage("window",static_cast<IplImage *>(imgB));
break;
default:
break;
}
}
塗りつぶした部分の情報が欲しい場合は、
「CvConnectedComp型」を用意し引数に渡す。
[例]
#include <iostream>
#include <cv.h>
#include <highgui.h>
/****** 無名名前空間 ******/
namespace
{
const int WIDTH = 300;
const int HEIGHT = 300;
}
/*************[マウスのコールバック]************/
void Mouse( int event, int x, int y, int flags ,void *imgB);
/*******************[メイン関数]******************/
int main( int argc, char **argv)
{
IplImage *imgA = cvCreateImage(cvSize(WIDTH,HEIGHT),IPL_DEPTH_8U,3);
cvSet (imgA, cvScalarAll (255), 0);
cvDrawRect(imgA,cvPoint(WIDTH/3,HEIGHT/3),cvPoint(WIDTH*2/3,HEIGHT*2/3),CV_RGB(0,0,255));
cvNamedWindow("window",CV_WINDOW_AUTOSIZE);
cvShowImage("window",imgA);
cvSetMouseCallback("window", Mouse,imgA);
cvWaitKey(0); // 0秒待つ => ずっと入力待ち
cvReleaseImage(& imgA);
cvDestroyWindow("window");
return 0;
}
/**************[ここから コールバック]************/
void Mouse( int event, int x, int y, int flags ,void *imgB)
{
switch(event)
{
case CV_EVENT_LBUTTONDOWN:
cvFloodFill(static_cast<IplImage*>(imgB),cvPoint(x,y),CV_RGB(0,255,0));
cvShowImage("window",static_cast<IplImage *>(imgB));
break;
case CV_EVENT_RBUTTONDOWN:
cvSet (static_cast<IplImage *>(imgB), cvScalarAll (255), 0);
cvDrawRect(static_cast<IplImage *>(imgB),cvPoint(WIDTH/3,HEIGHT/3),cvPoint(WIDTH*2/3,HEIGHT*2/3),CV_RGB(0,0,255));
cvShowImage("window",static_cast<IplImage *>(imgB));
break;
default:
break;
}
}
塗りつぶした部分の情報が欲しい場合は、
「CvConnectedComp型」を用意し引数に渡す。
[例]
void Mouse( int event, int x, int y, int flags ,void *imgB) { CvConnectedComp data; switch(event) { case CV_EVENT_LBUTTONDOWN: cvFloodFill(static_cast<IplImage*>(imgB),cvPoint(x,y),CV_RGB(0,255,0),cvScalarAll(0),cvScalarAll(0),&data); cvShowImage("window",static_cast<IplImage *>(imgB)); puts("今ぬりつぶした所は..."); printf("面積 %.0f \n",data.area); printf("色データ (B,G,R) = (%.0f,%.0f,%.0f) \n",data.value.val[0],data.value.val[1],data.value.val[2]); break; ... ... default: break; } }