Python OpenCV 강좌 : 제 39강 - 마우스 콜백

Python OpenCV Mouse Callback

Python OpenCV 강좌 : 제 39강 - 마우스 콜백
[ Python-OpenCV ] - 윤대희

마우스 콜백(Mouse Callback)


1

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

즉, 특정한 이벤트가 발생하면 다른 함수를 실행하는 함수입니다.

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



Main Code


import cv2
import numpy as np

def mouse_event(event, x, y, flags, param):
    global radius
    
    if event == cv2.EVENT_FLAG_LBUTTON:    
        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()



Detailed Code


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

반지름(radius)를 저장할 변수와 원본 이미지(src)를 선언합니다.

radius는 마우스 콜백 함수에서 마우스 스크롤에 따라, 값을 증가하거나 감소할 수 있습니다.



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

먼저, cv2.namedWindow() 함수나 cv2.imshow() 함수를 활용하여 윈도우를 생성합니다.

윈도우가 생성되었다면, 마우스 콜백 설정 함수(cv2.setMouseCallback)로 마우스 콜백을 설정합니다.

cv2.setMouseCallback(윈도우, 콜백 함수, 사용자 정의 데이터)을 의미합니다.

윈도우는 미리 생성되어 있는 윈도우의 이름을 의미합니다.

콜백 함수는 마우스 이벤트가 발생했을 때, 전달할 함수를 의미합니다.

사용자 정의 데이터는 마우스 이벤트로 전달할 때, 함께 전달할 사용자 정의 데이터를 의미합니다.



def mouse_event(event, x, y, flags, param):
    global radius
    
    if event == cv2.EVENT_FLAG_LBUTTON:    
        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

콜백 함수에서 사용되는 매개변수는 event, x, y, flags, param 입니다.

event는 윈도우에서 발생하는 이벤트를 의미합니다.

x, y는 마우스의 좌표를 의미합니다.

flagsevent와 함께 활용되는 역할로 특수한 상태를 확인하는 용도입니다.

param은 마우스 콜백 설정 함수에서 함께 전달되는 사용자 정의 데이터를 의미합니다.


콜백 함수를 선언하고, radius를 전역변수로 선언합니다.

분기문(if)을 통해 event왼쪽 마우스 클릭이 발생했을 때 윈도우에 파란색 원을 그립니다.

만약, event마우스 스크롤을 조작했다면, 다시 하위 분기문(if)을 생성하여 나눕니다.

event가 마우스 스크롤 이벤트일 때, flag는 마우스 스크롤의 방향을 나타냅니다.

flag가 양수라면 스크롤 업이며, 음수라면 스크롤 다운입니다.

마우스 스크롤 업 이벤트일 때는 반지름(radius)를 증가시키고, 낮을 때에는 반지름을 감소시킵니다.

단, 반지름이 1보다 작지 않게 설정하기 위해, radius > 1 조건으로 검사합니다.



Event

이름 의미
EVENT_MOUSEMOVE 마우스 포인터가 윈도우 위에서 움직일 때
EVENT_LBUTTONDOWN 마우스 왼쪽 버튼을 누를 때
EVENT_MBUTTONDOWN 마우스 가운데 버튼을 누를 때
EVENT_RBUTTONDOWN 마우스 오른쪽 버튼을 누를 때
EVENT_LBUTTONUP 마우스 왼쪽 버튼을 뗄 때
EVENT_MBUTTONUP 마우스 가운데 버튼을 뗄 때
EVENT_RBUTTONUP 마우스 오른쪽 버튼을 뗄 때
EVENT_LBUTTONDBLCLK 마우스 왼쪽 버튼을 더블 클릭할 때
EVENT_MBUTTONDBLCLK 마우스 가운데 버튼을 더블 클릭할 때
EVENT_RBUTTONDBLCLK 마우스 오른쪽 버튼을 더블 클릭할 때
EVENT_MOUSEWHEEL 마우스 상하 스크롤을 사용할 때
EVENT_MOUSEHWHEEL 마우스 좌우 스크롤을 사용할 때



Flags

이름 의미
EVENT_FLAG_LBUTTON 마우스 왼쪽 버튼이 눌러져 있음
EVENT_FLAG_MBUTTON 마우스 가운데 버튼이 눌러져 있음
EVENT_FLAG_RBUTTON 마우스 오른쪽 버튼이 눌러져 있음
EVENT_FLAG_CTRLKEY 컨트롤(Ctrl) 키가 눌러져 있음
EVENT_FLAG_SHIFTKEY 쉬프트(Shift) 키가 눌러져 있음
EVENT_FLAG_ALTKEY 알트(Alt) 키가 눌러져 있음
flags > 0 마우스 스크롤 이벤트의 윗 방향 또는 오른쪽 방향
flags < 0 마우스 스크롤 이벤트의 아랫 방향 또는 왼쪽 방향



Result


2



Book Image

책이 출간되었습니다!

C#과 파이썬을 활용한 OpenCV 4 프로그래밍

컴퓨터 비전 기초 이론부터 머신러닝을 활용한 영상 처리 프로젝트까지

  • C# OpenCvSharp4
  • Python OpenCV4
  • Using Tesseract
  • Using TensorFlow
  • Using Regular Expression
  • 윤대희 저 | 위키북스

    [yes24 바로가기] [알라딘 바로가기] [교보문고 바로가기]

    후원하기


    ⤧  Previous post Python OpenCV 강좌 : 제 38강 - ORB(Oriented FAST and Rotated BRIEF) ⤧  Next post Python OpenCV 강좌 : 제 40강 - 리매핑
    Python-OpenCV Category