마우스의 입력을 통해 이벤트 처리를 수행할 함수를 작성해서 마우스 입력 상태에 따라 이미지의 출력 결과가 다르게 나타나도록 할 수 있다.

 

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()

코드 실행 화면(Capture)

이벤트 처리를 하는 함수(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()

코드 실행 화면(Capture)

출력할 색상 목록을 color에 저장한다. 그리고 Mouse함수를 통해 출력되는 default 색상을 black으로 정하고, 왼쪽 버튼이 클릭될 때마다 해당 플래그에 맞춰서 색상이 변경되어 출력되도록 한다. 클릭할 때 Alt키를 누르면 red, Ctrl키를 누르면 green, Shift를 누르면 blue로 색이 바뀌며 출력된다. 이 외의 코드는 위와 동일하며, Esc 키를 누르면 창이 사라진다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기