영상처리/OpenCV

마우스 콜백

성혜영 2022. 6. 7. 14:23

마우스 콜백 : 윈도우에 마우스 이벤트가 발생했을 때, 특정한 함수에 이벤트를 전달해 실행

 

콜백(Callback) 함수 : 매개변수를 통해 다른 함수를 전달받고, 이벤트가 발생할 때 매개변수에 전달된 함수를 호출하는 역할. 즉, 이벤트가 발생하면 다른 함수를 실행하는 함수

 

OpenCV에는 HighGUI를 이용해 윈도우를 생성해서 화면에 이미지를 출력하는 프로그램을 작성 가능하므로 윈도우에서 마우스 이벤트를 받아 상호작용 할 수 있음. 

 

cv2.setMouseCallback(

    windowName,

    onMouse,

    param = None

)

<마우스 콜백 설정 함수>

 

사전에 정의된 윈도우 이름(windowName)에 마우스 콜백을 설정하고, 콜백함수(onMouse) 전달. 설정된 윈도우에만 선언한 콜백 함수가 실행.

 

마우스 이벤트 데이터 외에도 사용자 데이터(userdata) 콜백 함수 전달 가능. 사용자 데이터에는 주로 윈도우에 부착된 이미지를 전달.

 

마우스 콜백은 마우스에 관련된 정보를 전달해야 하므로 함수에 정해진 매개변수가 있음.

 

def func_name(

    event,

    x,

    y,

    flags,

    param

)

<마우스 콜백 함수>

 

마우스 콜백 델리게이트(함수)는 마우스 이벤트(event), 마우스의 좌표(x,y), 마우스 플래그(flags), 사용자 정의 데이터(userdata, param)을 매개변수로 사용.

마우스 이벤트 : 마우스의 동작을 전달하며, 마우스의 좌표는 마우스 이벤트가 발생했을 때의 좌표를 전달.

마우스 플래그 : 마우스 동작에 대한 특수한 정보나 방식을 전달

사용자 정의 데이터 : 마우스 이벤트가 발생했을 때 전달할 임의의 데이터 전달




import cv2

import numpy as np



def mouse_event(event, x, y, flags, param):

    global radius



    if event == cv2.EVENT_LBUTTONDOWN:

        cv2.circle(param, (x,y), radius, (255,0,0), 2)

        cv2.imshow("draw", src)



    elif event == cv2.EVENT_MOUSEWHEEL:

        if flags > 0:

            radius += 1

        elif radius > 1:

            radius -= 1



radius = 3

src = np.full((500, 500, 3), 255, dtype=np.uint8)



cv2.imshow("draw", src)

cv2.setMouseCallback("draw", mouse_event, src)

cv2.waitKey()

cv2.destroyAllWindows()

 

<마우스 콜백 적용>

 

마우스 왼쪽 버튼 : radius 크기의 파란색 원을 그려 출력

마우스 스크롤 이벤트 : 원의 크기 조절, 마우스 플래그(flags)를 통해 관리

 

'영상처리 > OpenCV' 카테고리의 다른 글

이미지 연결  (0) 2022.06.07
동영상 출력  (0) 2022.06.07
이미지 출력  (0) 2022.06.07
이미지 입력  (0) 2022.06.07
ndarray 클래스 - 관심채널  (0) 2022.06.07