#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); }
このwikiの更新情報RSS