본문으로 바로가기

OpenCV에서 KeyEvent를 사용해보자.

category Programming/C++ 2017.01.21 14:27

OpenCV 3번째 포스트입니다. OpenCV 포스트를 안쓴지도 꽤 오래되었네요. ^^;


이번 포스트에서는 영상에 KeyEvent를 넣어 효과를 추가하거나 이벤트를 넣어보는 실습을 한 번 해보고자 합니다.


waitKey 함수

지난 포스트도, 처음에 했던 포스트에서도, 영상을 띄우고, 사용자의 입력을 기다리기 위해, 우리는 여태까지 waitKey 함수를 사용했습니다. 아마 조금 눈치가 있으신 분들이라면, 영상에 키보드 이벤트를 줄 때도 이 함수를 모태로 나갈 것이라는 예측을 하지 않았을까 생각해보는데요.


맞습니다. waitKey 함수에는 인자값으로 int 형태의 값을 넣고, 그 값을 다시 int 형으로 반환합니다. 그렇다면 인자로 주는 int 형 값은 무엇이고, 어떤 값을 되돌려 받는 것일까요?


int waitKey(int delay = 0);


waitKey 함수의 형태는 위와 같습니다. 인자 값은 delay 값으로, key 입력을 받을 시간을 주어줍니다. 아무 인자값도 넣지 않으면 기본값인 0을 부여하고, 0을 인자로 삼으면 입력 받는 시간은 무기한입니다. 시간의 단위는 밀리 초입니다. (1 Seconds = 1000 mili seconds)


예시의 코드로 보면, 위와 같습니다. 여태까지 우리는 waitKey의 인자 값으로 아무런 값을 주지 않았기 때문에 입력 받는 시간에는 제한이 없었습니다. 그리고, 빠져나오기 위해서는 Esc 키를 사용해야 했지요.



KeyEvent 응용

그럼 위에 있는 것을 토대로, KeyEvent를 응용해보도록 하겠습니다. 인자 값은 키 이벤트를 받는 시간이었다면, waitKey 함수의 반환 값은 사용자가 누른 키 이벤트의 값입니다. 그러면, 키 이벤트 값을 받아 해당 이벤트 키 값에 따른 이벤트를 추가하거나 삭제할 수 있겠죠?


먼저 키 이벤트 값을 알아보도록 하겠습니다.


키 이벤트 값을 알아보기 위해, 저는 무한 루프문을 사용해봤습니다. 일단 어떤 키가 어떤 값인지 모르기 때문에, 임의로 0을 때려버렸습니다(-_-;) 그리고 아무런 키 값을 입력해봤습니다. 


키를 마구잡이로 눌러보니 숫자가 막 나옵니다. ESC 키를 눌러보니 0x10001b 임을 확인할 수 있었습니다. 그래서 저는 ESC 키를 눌렀을 때, 프로그램이 종료되도록 구현해보기로 했습니다. 


구현은 생각보다 꽤 간단합니다.


이제 키보드 이벤트에 대한 개념이 충분히 이해됐을 것입니다. 

간단한 예제로, 키보드 이벤트를 사용해, 2채널의 이미지를 만들고, 오른쪽으로 갈수록 검정색으로, 왼쪽으로 갈수록 흰색으로 역투영하는 간단한 영상을 짜보겠습니다.


위 영상은 세포 사진의 일부입니다. 본래는 컬러 이미지이지만,
GRAYSCALE 로드 방식을 사용해 3채널의 이미지를 2채널의 흑백 이미지로 변환하였습니다.

좌, 우 키보드만을 사용하여 구현하기 때문에 2채널의 이미지로 변환하여 작성해봤습니다.


특성상 255의 숫자를 넘지 않도록 하였습니다. 255를 넘길 경우, 차후에 너무 오른쪽으로 넘겨도 다시 왼쪽으로 돌아가기가 매우 번거롭기 때문입니다.



마치며...

마우스 이벤트에 이어서 키보드 이벤트에 대한 간단한 내용이었습니다.


마우스 이벤트를 사용했을 때는 어떤 특정한 영역을 사용하여 영상을 바꿨기 때문에, 어떻게 보면 쉬울수도, 어려울 수도 있었습니다만 키보드 이벤트는 어떤 영역을 바꾸는 것이 아닌 영상 전체 영역을 바꾸는 데 기울이게 됩니다.


그렇다고 해서, 특정 영역을 변경할 때, 키보드를 쓰지 못하는 것은 아닙니다. 키보드와 마우스 이벤트를 병행한다면, 마우스로 원하는 영역을 잡고, 그 영역을 메모리에 저장해뒀다가, 키보드로 그 값을 자유로이 바꾸는 방법도 하나의 방법이 될 수 있습니다.


comments powered by Disqus

티스토리 툴바