이벤트 처리하기

전종원·2022년 10월 17일
0

1. 키보드 이벤트 처리

int waitKey(int delay=0);
  • delay시간동안 대기 밀리초 단위.
  • delay < 0 이면 무한히 대기.
  • 반환값: 눌린 키값 눌리지 않으면 -1
  • 자주 쓰이는 값
    • esc - 27
    • enter - 13
    • TAB - 9
  • 화살표키, 함수키 등의 특수키 이벤트 처리를 수행하려면 waitKeyEx() 함수를 사용.

2. 마우스 이벤트 처리

setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0);
  • winname: 창 이름
  • onMouse: 마우스 콜백함수: 아래와 같은 형식의 함술흘 정의하고 해당 함수 이름을 지정.
    typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
    • event: 마우스 이벤트 종류. MouseEventTypes 상수.
    • x, y: 마우스 이벤트 발생좌표
    • flags: 마우스 이벤트 플래그. MouseEventFlags 상수.
    • userdata: setMouseCallback() 함수에서 지정한 사용자 지정 데이터
  • userdata: 콜백함수에 전달할 사용자 지정 데이터

실습코드

Mat src;
Point ptOld;

void on_mouse(int event, int x, int y, int flags, void*);

int main(void)
{
    src = imread("lenna.bmp");

    if (src.empty()) {
        cerr << "Image load failed!" << endl;
        return -1;
    }

    namedWindow("src");
    setMouseCallback("src", on_mouse);

    imshow("src", src);
    waitKey();
}

void on_mouse(int event, int x, int y, int flags, void*)
{
    switch (event) {
    case EVENT_LBUTTONDOWN:
        ptOld = Point(x, y);
        cout << "EVENT_LBUTTONDOWN: " << x << ", " << y << endl;
        break;
    case EVENT_LBUTTONUP:
        cout << "EVENT_LBUTTONUP: " << x << ", " << y << endl;
        break;
    case EVENT_MOUSEMOVE:
        if (flags & EVENT_FLAG_LBUTTON) {
            //cout << "EVENT_MOUSEMOVE: " << x << ", " << y << endl;
            //circle(src, Point(x, y), 2, Scalar(0, 255, 255), -1, LINE_AA);
            line(src, ptOld, Point(x, y), Scalar(0, 255, 255), 3, LINE_AA);
            ptOld = Point(x, y);
            imshow("src", src);
        }
        break;
        
    default:
        break;
    }
}

3. 트랙바 사용하기

트랙바 생성함수

int createTrackbar(const String& trackbarname, const String& winname, int* value, int count, 
					TrackbarCallback onChange = 0, void* userdata = 0);
  • trackbarname: 트랙바 이름
  • winname: 트랙바를 생성할 창 이름
  • value: 트랙바 위치 값을 받을 정수형 변수의 주소
  • count: 트랙바 최대 위치(최소 위치는 항상 0)
  • onChange: 트랙바 위치가 변경될 때마다 호출되게 만들 콜백함수 이름(함수의 포인터)
    • 만약 null을 지정하면 콜백함수는 호출되지 않고 value로 지정한 변수 값만 갱신됨.
    typedef void (*TrackbarCallback)(int pos, void* userdata);
  • userdata: 트랙바 콜백함수에 전달할 사용자 데이터의 포인터
  • 반환값: 정상동작하면 1, 실패하면 0

실습코드

void on_level_change(int pos, void* userdata);

int main(void)
{
	Mat img = Mat::zeros(400, 400, CV_8UC1);

	namedWindow("image");
	createTrackbar("level", "image", 0, 16, on_level_change, (void*)&img);

	imshow("image", img);
	waitKey();
}

void on_level_change(int pos, void* userdata)
{
	Mat img = *(Mat*)userdata;

	img.setTo(pos * 16);
	imshow("image", img);
}

main함수에 있는 어떤 영상을 마우스콜백함수 혹은 트랙바 콜백함수를 통해 변경하려면 userdata 포인터를 통해 주솟값을 전달해주거나 전역변수로 설정해야한다.

0개의 댓글