원문은 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_mouse_handling/py_mouse_handling.html 입니다.
이미지 처리를 위해 OpenCV에서는 자체적인 마우스 이벤트 체계를 가지고 있습니다. 마우스 이벤트는 cv2.setMouseCallback 함수를 통해 마우스 이벤트를 처리할 Window에 등록됩니다. 먼저 간단한 예를 통해 살펴보겠습니다.
import cv2 import numpy as np def draw_circle(event, x, y, flags, param): if event == cv2.EVENT_LBUTTONDBLCLK: cv2.circle(img,(x,y),100,(255,0,0),-1) img = np.zeros((512,512,3), np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image',draw_circle) while(1): cv2.imshow('image',img) if cv2.waitKey(20) & 0xFF == 27: break cv2.destroyAllWindows()
위의 프로그램은 Window 위에서 마우스 버튼을 더블클릭하면 해당 지점에서 파란색 큰 원을 그립니다.
좀더 복잡한 예제를 살펴보겠습니다.
import cv2 import numpy as np drawing = False mode = True ix, iy = -1, -1 def draw_circle(event,x,y,flags,param): global ix, iy, drawing, mode if event == cv2.EVENT_LBUTTONDOWN: drawing = True ix, iy = x, y elif event == cv2.EVENT_MOUSEMOVE: if drawing == True: if mode == True: cv2.rectangle(img, (ix,iy), (x,y), (0,255,0), -1) else: cv2.circle(img, (x,y), 5, (0,0,255), -1) elif event == cv2.EVENT_LBUTTONUP: drawing = False if mode == True: cv2.rectangle(img, (ix,iy), (x,y), (0,255,0), -1) else: cv2.circle(img, (x,y), 5, (0,0,255), -1) img = np.zeros((512,512,3), np.uint8) cv2.namedWindow('image') cv2.setMouseCallback('image', draw_circle) while(1): cv2.imshow('image', img) k = cv2.waitKey(1) & 0xFF if k == ord('m'): mode = not mode elif k == 27: break cv2.destroyAllWindows()
위의 프로그램은 마우스 드래그를 이용해 사각형과 원을 그릴 수 있는데, m 키를 눌러 그리고자 하는 원과 사각형을 결정할 수 있습니다.