OpenCV에서 Mouse Event를 사용해보자

저에게 맡겨진 3개의 프로젝트와 기말고사가 드디어 끝이났네요.


이런저런 일들이 많았지만 그렇다보니 블로그 포스팅에 대해 소홀해지게 되었는데요. 오늘은 지난 포스트에 이어서 OpenCV를 이용한 포스트를 작성해보고자 합니다.


모든 코딩에 있어서 MouseEvent는 많이 보셨을 것입니다. 버튼 액션, 이벤트 이런 것 많이 보셨을 것이라 생각됩니다. 그런데, 영상 처리에서 마우스 이벤트는 어떤 용도로 쓰일까요? 

여러분들이 어떤 영상을 만들거나 아니면 만들어진 영상을 IplImage나 Mat 클래스를 사용해 불러오게 되면, 해당 영상에서 픽셀이 몇인지 궁금할 때가 있습니다.


cout으로 Pixel 값을 확인할 수도 있지만, 픽셀 수 따라 엄청나게 많은 양을 출력할 수도 있고, 자신이 원하는 부분을 찝어서 코딩하기에는 매우 어렵습니다.




영싱 띄우기

지난 포스트에서 익혔던 것을 그대로 활용해서 여러분이 원하는 영상을 띄워봅시다. 


저는 3개의 당구공이 있는 이미지를 띄워봤습니다.


본래 이미지만 띄웠을 때는 마우스나 키보드 어떤 버튼을 클릭해도 반응이 없습니다. 자 그럼 이미지에 마우스 이벤트를 줘보겠습니다.



MouseEvent 



두 개의 이미지를 띄웠지만, 둘 다 모두 똑같은 이미지임을 알 수 있습니다. 타이틀대로, 한 이미지는 마우스 이벤트가 없고, 다른 이미지에는 마우스 이벤트가 있는데, 시험사마 cout을 사용해서 내가 클릭한 마우스 지점을 Point 클래스를 사용해 x, y 값으로 보여주도록 했습니다.


Non Mouse Event 창에 마우스를 100번을 뚜들겨도 아무런 반응이 없지만, Mouse Event 이미지에서 마우스 클릭을 하면, 내가 찍은 지점의 좌표를 정확하게 출력해줍니다. 이 좌표를 가지고, 이 위에 어떤 무언가를 그릴 수도 있고, 이 좌표 값의 내용을 바꿀수도 있습니다.



그림판의 하얀 지우개

마우스 이벤트를 사용해서 간단한 것을 구현해보겠습니다. Windows에서 어렸을 때 자주 가지고 놀던 그림판이 있죠, 그 그림판에는 지우개가 있는데요. 간단하게 그 지우개를 한 번 구현해보도록 하겠습니다.


어렵지 않습니다. 위에서는 단순히 마우스 클릭만을 사용했지만, OpenCV에서는 EVENT_MOUSEMOVE라는 것을 제공해주어서 이를 이진 연산해주면 됩니다. 그러면 마우스 클릭과 동시에 이동하면, circle 코드가 수행됩니다.


본래 그림판의 지우개는 사각형이지만, 뭐 똑같이 하라는 법은 없기 때문에 ㅎㅎ 저는 circle을 사용했습니다.

지우개는 보통 하얀색깔로 칠해지기 때문에 Scalar 값을 전부 255를 사용해주시면 됩니다.



마치며....

OpenCV를 배우기 이전까지만 해도, 텍스트를 주무르고 놀거나 GUI 프로그래밍을 주무르거나 둘 중 한 개였지만 OpenCV를 가지고 영상처리를 쉽게 할 수 있음에 재미가 조금 많이 생겨버릇해 블로그에 글을 올리곤 하고 있습니다.


요즘 딥러닝이나 머신러닝이 점점 텍스트의 처리가 아닌 형상 처리가 점점 눈에 띄고 있고, 시간이 지날수록 영상처리의 필요성은 갈수록 높아지고 있습니다. 실제 영상처리는 범죄 예방이나 군사목적으로도 사용되고 있고, 그 발전이 점점 높아지는 추세에 있다고 합니다. 


다음 OpenCV 포스트는 키보드 이벤트를 사용한 포스트를 진행하도록 하겠습니다.

TAGS.
comments powered by Disqus

Tistory Comments 0