cVSetMouseCallback 함수로 이벤트 핸들러 함수를 지정하고, 핸들러 함수에서 이벤트를 처리한다.


window_name = 이벤트를 발생시킬 윈도우의 이름을 적는다.
on_mouseEvent = 마우스 이벤트를 처리할 핸들러 함수를 적는다. 함수명은 사용자가 임의로 정해도된다. 단,  인수의 자료형과 의미는 미리 정해져있다.
param = 핸들러 함수로 전달될 사용자 정의 인수이다.



이렇게 인수가 정해져있다.

event = 마우스 이벤트
flags = 마우스 이벤트가 발생했을 때 마우스 버튼, CTRL, SHIFT, ALT 키를 눌렀는지 확인하기 위해 사용된다.
param = 사용자 정의 인수


마우스 이벤트(event)상수

CV_EVENT_MOUSEMOVE      마우스를 움직임
CV_EVENT_LBUTTONDOWN   왼쪽버튼 DOWN
CV_EVENT_RBUTTONDOWN   오른쪽 버튼 DOWN
CV_EVENT_LBUTTONUP        왼쪽 버튼 UP
CV_EVENT_RBUTTONUP        오른쪽 버튼 UP
CV_EVENT_LBUTTONDBLCLK 왼쪽 버튼 더블클릭
CV_EVENT_RBUTTONDBLCLK 오른쪽 버튼 더블클릭



마우스 flags 상수

CV_EVENT_FLAG_LBUTTON  왼쪽버튼누름
CV_EVENT_FLAG_RBUTTON 오른쪽버튼누름
CV_EVENT_FLAG_CTRLKEY CTRL 키를 누름
CV_EVENT_FLAG_SHIFTKEY SHIFT 키를 누름
CV_EVENT_FLAG_ALTKEY   ALT 키를 누름




예제 소스


#include "stdafx.h"
#include <cv.h>
#include <highgui.h> // 키보드 마우스 트랙바 이벤트 처리 기능을 갖는 사용자 인터페이스 함수를 지원한다.

 
void on_eventhandle(int event, int x, int y, int flags, void* param);

int main()
{
  IplImage    *dstImage;
  dstImage = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 3);
 cvSet(dstImage, CV_RGB(255, 255, 255));
 
 cvNamedWindow("Mouse Event Handling", CV_WINDOW_AUTOSIZE);
    cvShowImage("Mouse Event Handling", dstImage);

 cvSetMouseCallback("Mouse Event Handling", on_eventhandle,  (void *)dstImage);
    cvWaitKey(0);

 cvDestroyAllWindows();
 cvReleaseImage(&dstImage);
    return 0;
}

void on_eventhandle (int event, int x, int y, int flags, void* param) //핸들러 함수
{
 IplImage    *image;
 image = (IplImage *)param;
 
 switch(event)
 {
  case CV_EVENT_LBUTTONDOWN:
  if(flags & CV_EVENT_FLAG_SHIFTKEY) // 쉬프트를 누르고 클릭시 네모
    cvRectangle(image, cvPoint(x-5, y-5), cvPoint(x+5, y+5), CV_RGB(255, 0, 0));
  else //아니면 원
  {
   cvCircle(image, cvPoint(x, y), 5, CV_RGB(0, 0, 255), 5);
  }
  break;
 
 case CV_EVENT_RBUTTONDOWN:
  cvCircle(image, cvPoint(x, y), 5, CV_RGB(255, 0, 0), 5);
  break;
 }
    cvShowImage("Mouse Event Handling", image);
}


참조 - OpenCv 프로그래밍

 

Posted by 아몰라