본문 바로가기

딥러닝(Deep Learning)/컴퓨터 비전

cv.setMouseCallback() 사용 시, 매개 변수 flags의 역할

import cv2 as cv
import sys

img = cv.imread("1.png")

if img is None:
    sys.exit("해당 파일을 찾지 못하였습니다.")

BrushSiz = 5
LColor,RColor = (255,0,0),(0,0,255) 

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

    if event == cv.EVENT_LBUTTONDOWN:
        cv.circle(img,(x,y),BrushSiz,LColor,-1) 

    elif event == cv.EVENT_RBUTTONDOWN:
        cv.circle(img,(x,y),BrushSiz,RColor,-1)

    elif event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_LBUTTON: # flags 매개변수
        cv.circle(img,(x,y),BrushSiz,LColor,-1)
    
    elif event == cv.EVENT_MOUSEMOVE and flags == cv.EVENT_FLAG_RBUTTON: # flags 매개변수
        cv.circle(img,(x,y),BrushSiz,RColor,-1)

    cv.imshow("tittle",img)

cv.namedWindow("Painting")
cv.imshow("Painting",img)

cv.setMouseCallback('Painting',painting)

while True:

    if cv.waitKey(1) == ord('q'):

        cv.destroyAllWindows()
        break

flags 매개변수는 마우스 이벤트 발생 시 함께 전달되는 특정 플래그(Flag) 값을 나타냅니다.

이 플래그 값은 마우스 버튼 상태 등을 나타내며, cv.EVENT_MOUSEMOVE 이벤트에서만 의미가 있습니다.

일반적으로 사용되는 플래그 값은 다음과 같습니다.

  • cv.EVENT_FLAG_LBUTTON: 왼쪽 마우스 버튼이 눌린 상태입니다.
  • cv.EVENT_FLAG_RBUTTON: 오른쪽 마우스 버튼이 눌린 상태입니다.
  • cv.EVENT_FLAG_MBUTTON: 가운데 마우스 버튼이 눌린 상태입니다.
  • cv.EVENT_FLAG_CTRLKEY: Ctrl 키가 눌린 상태입니다.
  • cv.EVENT_FLAG_SHIFTKEY: Shift 키가 눌린 상태입니다.
  • cv.EVENT_FLAG_ALTKEY: Alt 키가 눌린 상태입니다.

따라서, cv.EVENT_MOUSEMOVE 이벤트가 발생하고 flags 값이 cv.EVENT_FLAG_LBUTTON이면 왼쪽 마우스 버튼이

눌린 상태에서 마우스를 이동한 것이라고 해석할 수 있습니다.

코드에서는 이를 활용하여 왼쪽 마우스 버튼이 눌린 상태에서 마우스를 이동할 때 원을 그리고 있습니다.

 

( 참고로, painting(event,x,y,flags,param)의 매개변수들은 마우스 이벤트가 발생하면 OpenCV가 자동으로 painting 함수를

호출하며, 해당 함수에 마우스 이벤트와 관련된 정보(event,x,y,flags,param)가 전달됩니다 )

 

cv.setMouseCallback() 함수는 마우스 이벤트를 감지하기 위한 콜백 함수를 등록하는 역할을 합니다.

이 함수를 호출하면 OpenCV는 지정된 창에서 마우스 이벤트가 발생할 때마다 등록된 콜백 함수를 호출합니다.

따라서, 이 함수가 호출된 후에는 해당 창이 열려 있는 동안에는 계속해서 마우스 이벤트를 감지하고 콜백 함수를 실행합니

다.

이는 사용자가 마우스로 해당 창에서 클릭하거나 이동할 때마다 해당 콜백 함수가 호출되는 것을 의미합니다.

만약 이 함수를 호출한 창이 닫히거나 프로그램이 종료된다면, 해당 창에서의 마우스 이벤트 감지도 종료됩니다.

즉, cv.setMouseCallback() 함수는 특정 창에서만 동작하며, 해당 창이 활성화되어 있는 동안에만 마우스 이벤트를 감지하

고 콜백 함수를 호출합니다.