예제 영상 파일

choco.jpg

예제 파일은 아무 이미지 파일로 사용하셔도 됩니다. 저는 귀여운 강아지 초코로 진행해볼 예정입니다.

파일을 다운받으셔서 같은 환경(실행하는 파이썬 디렉터리)에 저장을 시켜 둡니다.

(만약 다른 곳에 있다면 경로를 아셔야 합니다)

 

마우스 함수

이번에는 마우스를 통해서 cv2를 활용할 수 있는 방법에 대해서 알아보도록 하겠습니다.

(실습을 하시면서 이해하시는게 빠릅니다)

cv2.setMouseCallback(windowName, onMouse, param=None)

기본적으로 마우스 함수는 이런식으로 사용이 가능합니다. windowName 변수가 있듯이 이 함수는 새로운 윈도우창을 띄우기 때문에, 윈도우 환경에서만 사용이 가능합니다.

windowName 변수는 마우스 이벤트를 처리할 윈도우창 이름이고,

onMouse 는 우리가 어떻게 이벤트 처리를 할지 지정하는 함수를 부르는 것입니다. (밑에 설명)

param 값은 이벤트 발생시 주고받을 값이 있으면 지정해주는 값입니다.

 

onMouse(event, x, y, flags, param)

onMouse 함수는, 우리가 세팅을 할 함수 입니다.

event 는 마우스 이벤트 종류(밑에 설명)

x 는 마우스 이벤트가 발생한 x좌표,

y 는 마우스 이벤트가 발생한 y좌표 입니다.

flags는 마우스 이벤트 발생 시 나타나는 종류(밑에 설명) 입니다.

 

event 는 마우스 이벤트 종류

설명

EVENT_MOUSEMOVE

마우스가 창 위에서 움직이는 경우

EVENT_LBUTTONDOWN

왼쪽 버튼이 눌려지는 경우

EVENT_RBUTTONDOWN

오른쪽 버튼이 눌려지는 경우

EVENT_MBUTTONDOWN

가운데 버튼이 눌려지는 경우

EVENT_LBUTTONUP

왼쪽 버튼이 떼어지는 경우

EVENT_RBUTTONUP

오른쪽 버튼이 떼어지는 경우

EVENT_MBUTTONUP

가운데 버튼이 떼어지는 경우

EVENT_LBUTTONDBLCLK

왼쪽 버튼을 더블클릭하는 경우

EVENT_RBUTTONDBLCLK

오른쪽 버튼을 더블클릭하는 경우

EVENT_MBUTTONDBLCLK

가운데 버튼을 더블클릭하는 경우

EVENT_MOUSEWHEEL

휠을 앞뒤로 돌리는 경우

EVENT_MOUSEHWHEEL

휠을 좌우로 움직이는 경우

MouseEventFlags 이벤트 종류

설명

EVENT_FLAG_LBUTTON

왼쪽 버튼이 눌려져 있음

EVENT_FLAG_RBUTTON

오른쪽 버튼이 눌려져 있음

EVENT_FLAG_MBUTTON

가운데 버튼이 눌려져 있음

EVENT_FLAG_CTRLKEY

CTRL 키가 눌려져 있음

EVENT_FLAG_SHIFTKEY

SHIFT 키가 눌려져 있음

EVENT_FLAG_ALTKEY

ALT 키가 눌려져 있음

 

다음 예제는 초코 이미지에서

왼쪽 마우스 클릭 했을 때, 클릭을 때어낼 때, 마우스를 이동할 때 좌표를 출력하고,

왼쪽 마우스로 드래그 시, 원모양의 라인을 그릴 수 있는 코드입니다.

`

import cv2

def onMouse(event, x, y, flags, param) :
    if event == cv2.EVENT_LBUTTONDOWN :
        print('왼쪽 마우스 클릭 했을 때 좌표 : ', x, y)
    elif event == cv2.EVENT_LBUTTONUP :
        print('왼쪽 마우스 클릭 땠을 때 좌표 : ', x, y)
    elif event == cv2.EVENT_MOUSEMOVE:
        print('현재 이동하는 좌표 : ', x, y)
        if flags & cv2.EVENT_FLAG_LBUTTON :
            cv2.circle(img, (x,y), 5, (0,0,255), -1)
            cv2.imshow('image', img)

img = cv2.imread('choco.jpg')
cv2.imshow('image', img)
cv2.setMouseCallback('image', onMouse)
cv2.waitKey()

(tip, flags & cv2.EVENT_FLAG_LBUTTON 라고 표현을 하였습니다. 사실 & 대신 == 을, 사용해도 정상 작동은 되나, 보통 flag 함수 사용시 & 연산자를 이용)

 

파이썬 출력 결과 값

현재 이동하는 좌표 :  191 414
현재 이동하는 좌표 :  192 414
왼쪽 마우스 클릭 했을 때 좌표 :  192 414
왼쪽 마우스 클릭 땠을 때 좌표 :  192 414
현재 이동하는 좌표 :  192 414
왼쪽 마우스 클릭 땠을 때 좌표 :  192 414
현재 이동하는 좌표 :  193 414
현재 이동하는 좌표 :  194 414
현재 이동하는 좌표 :  195 414
현재 이동하는 좌표 :  196 414
현재 이동하는 좌표 :  197 414
현재 이동하는 좌표 :  198 414

 

 

반응형

+ Recent posts