codeマウスイベントcvLine

#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;
	}
      //                                        color thick
      cvLine (dsp_img, start_pt, pt, CV_RGB(255,255,255), 1, 0, 0);
      //cvLine (dsp_img, start_pt, pt, CV_RGB(255,255,255), 1, CV_AA, 0);//滑らか
      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(" distance:%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日 09:33
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。