現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCVとマウス入力 >> クリック地点と線描画

関連 : OpenCV::基本編03

問題


画像を読み込んで、画像の任意の2地点をクリックすると、
その2点をむすんだ線分をひくようにせよ。

答え

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


//----- 各種外部変数 ------//
char *filename ="test2.jpg";

//直線のデータ構造
struct LineObj
{
	int count;
	CvPoint start;	//開始点
	CvPoint end;	//終点
};
LineObj LineData={0,{0,0},{0,0}};

//----- プロトタイプ宣言 -----//
void Mouse( int event, int x, int y, int flags ,void *image);


//-------- メイン関数 --------------//
int main( int argc, char **argv)
{
	IplImage *imgA = cvLoadImage( filename, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
	if(imgA ==NULL)
	{
		std::cout<<filename <<" : Can't load Image\n";
		return -1;
	}

	cvNamedWindow(filename,CV_WINDOW_AUTOSIZE);
	cvShowImage(filename,imgA);

	cvSetMouseCallback(filename, Mouse,imgA);  //コールバック関数の登録(第3引数あり)

	cvWaitKey(0);

	cvReleaseImage( &imgA );

	cvDestroyWindow(filename);

	return 0;
}


/***********[ここから コールバック]***********/

void Mouse( int event, int x, int y, int flags ,void *image)
{

	switch(event)
	{
		case CV_EVENT_LBUTTONDOWN:
			if(LineData.count == 0)
			{
				LineData.start.x = x;
				LineData.start.y = y;
				++LineData.count;
			}else if(LineData.count == 1){
				LineData.end.x = x;
				LineData.end.y = y;

				cvLine(static_cast<IplImage*>(image),LineData.start,LineData.end,CV_RGB( 0, 0, 255),2,CV_AA ,0);
				LineData.count = 0;
			}

			cvShowImage(filename,image);
	break;

	default:
	break;
	}

}

メモ

再描画を
 cvShowImage()
で行っている。

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






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


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

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