マウスで円を描く cvCircle

マウスで線を引くの一部を修正して円を描く。
クリックしたところが円の中心、ドラッグして半径を指定する。離すと円を描画する。
標準出力には中心座標-ドラッグを離す地点 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
ツールボックス

下から選んでください:

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