OpenCV

[OpenCV_01_17_마우스 이벤트로 원 그리기]

선호하는 2022. 12. 15. 21:10
import cv2

title = 'mouse event'
img = cv2.imread('./white.jpg')
cv2.imshow(title, img)

def onMouse(event, x, y, flags, param):
    print(event, x, y)
    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img, (x, y), 30, (0, 0, 0), -1)
        cv2.imshow(title, img)

cv2.setMouseCallback(title, onMouse)

while True:
    if cv2.waitKey(0) & 0xFF == 27:
        break
cv2.destroyAllWindows()

title이라는 이름의 창을 하나 만들고, 

onMouse 함수를 선언한 후,

setMouseCallback(windowName, onMouse [, param])를 통해서 마우스콜백함수로 설정한다.

마우스의 이벤트를 감지해서 계속 반환하고 만약 좌측 버튼 클릭 시 원을 그린다.

 

setMouseCallback(windowName, onMouse [, param]) - 마우스 이벤트를 설정해주는 함수

  onMouse - windowName에서 받아온 (event, x, y, flags, param)형태의 값을 이용해 작동하는 자체 제작 함수

 

마우스 이벤트들

  cv2.EVENT_(L/R)BUTTONDBLCLK - 버튼 더블클릭 할 때
  cv2.EVENT_(L/R)BUTTONDOWN - 버튼 누를 때
  cv2.EVENT_(L/R)BUTTONUP - 버튼 누른 거 뗄 때
  cv2.EVENT_MOUSEHWHEEL - 가로 휠 굴릴 때
  cv2.EVENT_MOUSEMOVE - 마우스 움직일 때
  cv2.EVENT_MOUSEWHEEL - 세로 휠 굴릴 때

 

<추측>

onMouse 함수가 어떻게 선언하고 작동하는지를 자세히 모르겠다.

물론 onMouse함수가 마우스 움직임을 감지해서 발생한 움직임과 해당 좌표값 x와 y, 그리고 컨트롤, 쉬프트, 알트 등의 키 flags를 전달해주는 함수인 것은 알겠다.

그런데 이게 언어 자체에서 미리 선언되어있고 우리가 그걸 오버라이딩해서 쓰는 함수인가?

어떻게 이벤트를 받아오고, 해당 좌표값을 받아오는거지?