마우스의 입력을 통해 이벤트 처리를 수행할 함수를 작성해서 마우스 입력 상태에 따라 이미지의 출력 결과가 다르게 나타나도록 할 수 있다.
import cv2
import numpy as np
img = np.full((300,300,3), 255, dtype = np.uint8)
title = "Mouse Event"
cv2.imshow(title, img)
def Mouse(event, x, y, flag, param):
if event == cv2.EVENT_LBUTTONDOWN: # 왼쪽 버튼 클릭
cv2.circle(img, (x,y), 15, (255,0,0), -1)
cv2.imshow(title, img)
cv2.setMouseCallback(title, Mouse)
while True:
if cv2.waitKey() == 27:
break
cv2.destroyAllWindows()
이벤트 처리를 하는 함수(Mouse)를 선언하고 cv2.setMouseCallback()에 이벤트 처리 함수 인자로 넣어 이벤트 처리가 이루어지도록 작동하는 코드이다. cv2.setMouseCallback()은 이벤트를 수행할 창 이름, 이벤트 처리를 수행할 함수, [이벤트 처리를 수행할 함수에 전달할 인자]를 인자로 지정할 수 있다.
event 변수에 지정할 수 있는 마우스 이벤트 종류로는 다음과 같다.
cv2.EVENT_MOUSEMOVE | 마우스 움직임 |
cv2.EVENT_LBUTTONDOWN | 왼쪽 버튼 누름 |
cv2.EVENT_RBUTTONDOWN | 오른쪽 버튼 누름 |
cv2.EVENT_MBUTTONDOWN | 가운데 버튼 누름 |
cv2.EVENT_LBUTTONUP | 왼쪽 버튼 뗌 |
cv2.EVENT_RBUTTONUP | 오른쪽 버튼 뗌 |
cv2.EVENT_MBUTTONUP | 가운데 버튼 뗌 |
cv2.EVENT_LBUTTONDBLCLK | 왼쪽 버튼 더블 클릭 |
cv2.EVENT_RBUTTONDBLCLK | 오른쪽 버튼 더블 클릭 |
cv2.EVENT_MBUTTONDBLCLK | 가운데 버튼 더블 클릭 |
cv2.EVENT_MOUSEWHEEL | 휠 스크롤 |
cv2.EVENT_MOUSEHWHEEL | 가로 휠 스크롤 |
Mouse 함수는 왼쪽 버튼이 클릭되면 해당 위치에 크기가 15, 파란색으로 채워진 원이 그려지는 함수다. 입력받은 키가 ASCII 코드 27에 해당하는 Esc라면 생성된 창은 사라지게 된다. 위의 코드를 확장해서 플래그에 따라 원의 색상을 다르게 나타낼 수도 있다.
flag 종류는 다음과 같다.
cv2.EVENT_FLAG_LBUTTON | 왼쪽 버튼 누름 |
cv2.EVENT_FLAG_RBUTTON | 오른쪽 버튼 누름 |
cv2.EVENT_FLAG_MBUTTON | 가운데 버튼 누름 |
cv2.EVENT_FLAG_ALTKEY | Alt 누름 |
cv2.EVENT_FLAG_CTRLKEY | Ctrl 누름 |
cv2.EVENT_FLAG_SHIFTKEY | Shift 누름 |
import cv2
import numpy as np
img = np.full((300,300,3), 255, dtype = np.uint8)
title = "Mouse & Flag Event"
cv2.imshow(title, img)
color = {'red' : (0,0,255), 'green' : (0,255,0), 'blue' : (255,0,0), 'black' : (0,0,0)}
def Mouse(event, x, y, flag, param):
output = color['black']
if event == cv2.EVENT_LBUTTONDOWN: # 왼쪽 버튼 클릭
if flag & cv2.EVENT_FLAG_ALTKEY : # Alt 누르면 Red
output = color['red']
elif flag & cv2.EVENT_FLAG_CTRLKEY : # Ctrl 누르면 Green
output = color['green']
elif flag & cv2.EVENT_FLAG_SHIFTKEY : # Shift 누르면 Blue
output = color['blue']
cv2.circle(img, (x,y), 15, output, -1)
cv2.imshow(title, img)
cv2.setMouseCallback(title, Mouse)
while True:
if cv2.waitKey() == 27:
break
cv2.destroyAllWindows()
출력할 색상 목록을 color에 저장한다. 그리고 Mouse함수를 통해 출력되는 default 색상을 black으로 정하고, 왼쪽 버튼이 클릭될 때마다 해당 플래그에 맞춰서 색상이 변경되어 출력되도록 한다. 클릭할 때 Alt키를 누르면 red, Ctrl키를 누르면 green, Shift를 누르면 blue로 색이 바뀌며 출력된다. 이 외의 코드는 위와 동일하며, Esc 키를 누르면 창이 사라진다.
728x90
반응형
'데이터 분석 & 시각화 > OpenCV' 카테고리의 다른 글
[OpenCV Programming] 이미지 변환 2 (1) | 2020.07.15 |
---|---|
[OpenCV Programming] 관심 영역 지정(ROI) (2) | 2020.07.13 |
[OpenCV Programming] 이미지에 그림 그리기 (2) | 2020.07.08 |
[OpenCV Programming] Webcam (0) | 2020.07.06 |
[OpenCV Programming] 이미지 변환 (0) | 2020.07.03 |
최근댓글