マウスで線を引くの一部を修正して円を描く。
クリックしたところが円の中心、ドラッグして半径を指定する。離すと円を描画する。
標準出力には中心座標-ドラッグを離す地点 radius:半径 を出力する。
C:\usr\lesson\opencv\simple\マウスでcvCircle>main
(144,144)-(150,264) radius:120.149906
(224,54)-(229,112) radius:58.215118
(54,56)-(84,85) radius:41.725292
(66,197)-(82,160) radius:40.311289
以下がソースコード
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
/* コードが読みやすいようにマウスイベント関係の定数を一覧しておく
#define CV_EVENT_MOUSEMOVE 0 移動
#define CV_EVENT_LBUTTONDOWN 1 左クリック下げ時
#define CV_EVENT_RBUTTONDOWN 2
#define CV_EVENT_MBUTTONDOWN 3
#define CV_EVENT_LBUTTONUP 4 左クリック上げ時
#define CV_EVENT_RBUTTONUP 5
#define CV_EVENT_MBUTTONUP 6
#define CV_EVENT_LBUTTONDBLCLK 7 左ダブルクリック時
#define CV_EVENT_RBUTTONDBLCLK 8
#define CV_EVENT_MBUTTONDBLCLK 9 中ボタンダブルクリック時
#define CV_EVENT_FLAG_LBUTTON 1
#define CV_EVENT_FLAG_RBUTTON 2
#define CV_EVENT_FLAG_MBUTTON 4
#define CV_EVENT_FLAG_CTRLKEY 8 Ctrlキー
#define CV_EVENT_FLAG_SHIFTKEY 16 Shiftキー
#define CV_EVENT_FLAG_ALTKEY 32 ALTキー
*/
IplImage *dsp_img, *src_img = 0;
/* マウスイベント用コールバック関数 この関数のフォーマットはcvSetMouseCallbackで決まっている */
void
on_mouse (int event, int x, int y, int flags, void *param)//マウスイベント毎に何度も再入してくる
{
CvPoint pt = cvPoint (x, y);
static CvPoint start_pt = { -1, -1 };//staticこの変数はこの関数を抜けてからも有効にしておく
if (event == CV_EVENT_LBUTTONDOWN)
{
start_pt = cvPoint (x, y);
}
else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
{
dsp_img = cvCloneImage (src_img); //前の描画がクリアー これをコメントアウトするとドラッグ中の線も描画する。
if (start_pt.x < 0)
{
start_pt = pt;
}
double x=start_pt.x-pt.x;
double y=start_pt.y-pt.y;
cvCircle(dsp_img,start_pt,sqrt(x*x+y*y),CV_RGB(255,255,255),1,8,0);
cvLine(dsp_img,start_pt,pt,CV_RGB(0,0,255),1,CV_AA,0);//CV_AAで滑らか
cvShowImage ("image", dsp_img); //その都度線を引いて表示する
}
else if (event == CV_EVENT_LBUTTONUP)
{
src_img = cvCloneImage (dsp_img); //書き込んだものを固定
printf("(%d,%d)-(%d,%d)",start_pt.x,start_pt.y,pt.x,pt.y);
double x=start_pt.x-pt.x;
double y=start_pt.y-pt.y;
printf(" radius:%f\n",sqrt(x*x+y*y));
}
}
int
main (int argc, char **argv)
{
CvSize window_size = { 300, 300 };
src_img = cvCreateImage (window_size, IPL_DEPTH_8U, 3);
dsp_img = cvCloneImage (src_img);
cvNamedWindow ("image", CV_WINDOW_AUTOSIZE);
cvShowImage ("image", src_img);
cvSetMouseCallback ("image", on_mouse, 0);//イベントを受けるウィンドウタイトル名を指定し、コールバック関数名も指定
cvWaitKey (0);
cvReleaseImage (&src_img);
cvReleaseImage (&dsp_img);
}
最終更新:2010年01月17日 14:38