본문 바로가기
Computer Vision

OpenCV 주요 기능 - 3. 이벤트 처리

by ksb0511 2020. 2. 13.

1. 키보드 이벤트 처리

// 키보드 입력을 처리하는 함수
int waitKey(int delay = 0);

 

  • delay : 키입력을 기다리는 시간. 지정하지 않거나 0 또는 음수일 경우 무한히 기다림.
  • 반환값이 눌러진 키값(아스키 코드), 눌러진 게 없을 경우 -1이 반환됨.
  • 특수키의 경우)
// 특수키의 입력을 처리하는 함수
int waitKeyEx(int delay = 0);

2. 마우스 이벤트 처리

openCV에서 마우스 이벤트를 처리하려면 먼저 마우스 콜백 함수를 등록하고, 이후 마우스 콜백 함수에 마우스 이벤트를 처리하는 코드를 추가해야 함.

// 특정 창에 마우스 콜백 함수를 등록할 때 사용하는 함수
void setMouseCallback(const String& winname, MouseCallback onMouse,
	void* userdata =0);

 

  • winname 창에서 마우스 이벤트가 발생하면 onMouse로 등록된 콜백 함수가 자동으로 호출되도록 설정.
  • userdata 인자에는 사용자가 마우스 콜백 함수에 전달하고 싶은 데이터를 void* 형식으로 전달할 수 있음. (콜백함수에 전달할 데이터가 없을 경우 userdata 인자 설정 x)
  • onMouse에는 마우스 콜백 함수가 지정되는데, 마우스 콜백 함수는 마우스 이벤트가 발생할 때 자동으로 호출되는 함수로, 4개의 정수형과 하나의 void* 타입을 인자로 가지며 void를 반환형으로 사용.
typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);

 

  • event에는 MouseEventTypes로 정의된 열거형 상수 중 하나가 전달.
  • x, y에는 마우스 이벤트가 발생한 좌표가 전달.
  • flags는 마우스 이벤트가 발생할 때의 마우스 or 키보드의 상태 정보를 담고 있음.
  • userdata에는 setMouseCallback() 함수에서 설정한 사용자 데이터의 포인터가 전달. 만약 userdata가 설정하지 않았다면 항상 0값이 전달됨.
MouseEventTypes 열거형 상수 설명
EVENT_MOUSEMOVE 0 마우스가 창 위에서 움직이는 경우
EVENT_LBUTTONDOWN 1 마우스 왼쪽 버튼을 누른 경우
EVENT_RBUTTONDOWN 2 마우스 오른쪽 버튼을 누른 경우
EVENT_MBUTTONDOWN 3 마우스 가운데 버튼을 누른 경우
EVENT_LBUTTONUP 4 마우스 왼쪽 버튼을 떼는 경우
EVENT_RBUTTONUP 5 마우스 오른쪽 버튼을 떼는 경우
EVENT_MBUTTONUP 6 마우스 가운데 버튼을 떼는 경우
EVENT_LBUTTONDBLCLK 7 마우스 왼쪽 버튼을 더블클릭하는 경우
EVENT_RBUTTONDBLCLK 8 마우스 오른쪽 버튼을 더블클릭하는 경우
EVENT_MBUTTONDBLCLK 9 마우스 가운데 버튼을 더블클릭하는 경우
EVENT_MOUSEWHEEL 10 마우스 휠을 앞뒤로 돌리는 경우
EVENT_MOUSEHWHEEL 11 마우스 휠을 좌우로 움직이는 경우

↑ MouseEventTypes 열거형 상수

 

MouseEventFlags 열거형 상수 설명
EVENT_FLAG_LBUTTON 1 마우스 왼쪽 버튼이 눌려 있음
EVENT_FLAG_RBUTTON 2 마우스 오른쪽 버튼이 눌려 있음
EVENT_FLAG_MBUTTON 4 마우스 가운데 버튼이 눌려 있음
EVENT_FLAG_CTRLKEY 8 Ctrl 키가 눌려 있음
EVENT_FLAG_SHIFTKEY 16 Shift 키가 눌려 있음
EVENT_FLAG_ALTKEY 32 Alt 키가 눌려 있음

↑ MouseEventFlags 열거형 상수


3. 트랙바 사용하기

// 트랙바 생성 함수
int createTrackbar(const String& trackbarname, const String& winname,
	int* value, int count, TrackbarCallback onChange = 0,
	void* userdata = 0);

 

  • winname 이름의 창에 trackbarname 이름의 트랙바를 부착. 트랙바가 움직일 때마다 onChange에 해당하는 트랙바 콜백 함수가 호출.
  • 트랙바의 최소 위치는 항상 0, 최대 위치는 count 값으로 지정.
  • value 인자에는 만들어둔 정수형 변수의 주소 값을 설정하면, 트랙바 위치가 해당 변수에 자동으로 저장.
  • 트랙바 콜백 함수에 전달하고 싶은 데이터가 있을 시 userdata 인자를 통해 void* 형식으로 전달.
  • onChange 인자는 트랙바 콜백 함수인데, 트랙바 콜백 함수는 트랙바 위치 변경될 때 자동으로 호출되는 함수로 형식은 다음과 같음.
typedef void (*TrackbarCallback)(int pos, void* userdata);

 

  • int와 void*타입의 인자 두 개를 가짐. pos에는 현재 트랙바의 위치 정보가 전달. userdata에는 createTrackbar() 함수에서 지정한 사용자 데이터 포인터 값이 전달.

// 트랙바의 현재 위치 
int getTrackbarPos(const String& trackbarname, const String& winname);
void setTrackbarPos(const String& trackbarname, const String& winname, int pos);

 

  • 프로그램 동작 중 트랙바 위치를 강제로 특정 위치로 옮기려고 할 때 사용 가능.
  • pos에 트랙바를 이동할 위치를 지정.

댓글