現在地 >> メニュー >> サンプルコード::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型」を用意し引数に渡す。

[例]

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;
    }

}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます