예제 영상 파일
예제 파일은 아무 이미지 파일로 사용하셔도 됩니다. 저는 귀여운 강아지 초코로 진행해볼 예정입니다.
파일을 다운받으셔서 같은 환경(실행하는 파이썬 디렉터리)에 저장을 시켜 둡니다.
(만약 다른 곳에 있다면 경로를 아셔야 합니다)
마우스 함수
이번에는 마우스를 통해서 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
'AI > OpenCV-실습' 카테고리의 다른 글
OpenCV - 영상(이미지) 다루기(8)_(이미지 변환) (0) | 2020.09.03 |
---|---|
OpenCV - 영상(이미지) 다루기(7)_(트랙바 사용) (0) | 2020.09.03 |
OpenCV - 영상(이미지) 다루기(5)_(그리기 함수) (0) | 2020.09.02 |
OpenCV - 영상(이미지) 다루기(4)_(matplotlib 사용) (0) | 2020.09.02 |
OpenCV - 영상(이미지) 다루기(3)_(이미지 표현) (0) | 2020.09.02 |