Drawing & Events: 영상 위 도형 그리기와마우스 이벤트

minho-log·2026년 3월 30일

OpenCV

목록 보기
2/3

<공부 주제>

OpenCV를 활용한 데이터 시각화(도형, 텍스트) 및 마우스 인터랙션 구현

<공부한 내용 정리>

이미지 행렬 데이터 위에 직접 선을 긋거나 글자를 써서 분석 결과를 표현할 수 있다. 또한, 마우스 클릭이나 드래그 같은 이벤트를 감지하여 특정 영역(ROI)을 지정하는 등의 인터랙티브한 코드를 짤 수 있다.

  1. 주요 그리기 함수

cv2.line(): 직선 그리기.

cv2.rectangle(): 사각형 그리기 (검출된 객체 표시용으로 가장 많이 씀).

cv2.circle(): 원 그리기.

cv2.putText(): 영상 위에 문자열 출력. (한글은 기본적으로 지원되지 않음)

  1. 마우스 이벤트 처리

cv2.setMouseCallback(): 특정 윈도우 창에서 발생하는 마우스 동작을 감지할 콜백(Callback) 함수를 등록한다.

마우스 왼쪽 버튼 클릭(LBUTTONDOWN), 떼기(LBUTTONUP), 움직임(MOUSEMOVE) 등을 구분하여 처리할 수 있다.

<예제 / 실습 코드>

빈 캔버스에 마우스 드래그로 사각형을 그리는 실습.

  1. 도형 그리기 및 이벤트 처리 (mouse_draw.py)

Python

import cv2
import numpy as np

# 전역 변수 설정
is_drawing = False
start_x, start_y = -1, -1

def draw_rect(event, x, y, flags, param):
    global is_drawing, start_x, start_y, img

    if event == cv2.EVENT_LBUTTONDOWN: # 마우스 클릭 시작
        is_drawing = True
        start_x, start_y = x, y

    elif event == cv2.EVENT_MOUSEMOVE: # 마우스 이동
        if is_drawing:
            # 실시간으로 그려지는 효과를 위해 원본 복사본 사용 추천 (여기선 생략)
            pass

    elif event == cv2.EVENT_LBUTTONUP: # 마우스 클릭 종료
        is_drawing = False
        # 사각형 그리기 (이미지, 시작점, 끝점, 색상(BGR), 두께)
        cv2.rectangle(img, (start_x, start_y), (x, y), (0, 255, 0), 2)
        cv2.imshow('Canvas', img)

# 검은색 배경 이미지 생성
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('Canvas')

# 마우스 콜백 함수 등록
cv2.setMouseCallback('Canvas', draw_rect)

while True:
    cv2.imshow('Canvas', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

<헷갈렸던 점>

BGR 색상 순서: 여전히 (Red, Green, Blue) 순서가 아니라 (Blue, Green, Red) 순서라는 점. 초록색 사각형을 그릴 때 (0, 255, 0)을 사용하는 것에 익숙해져야 한다.

좌표계 체계: 영상의 왼쪽 상단이 (0,0)(0, 0)이며, 마우스 이벤트로 들어오는 x, y 값도 이 좌표계를 따른다는 점을 명확히 이해했다.

<오늘의 정리>

Drawing 함수는 원본 이미지(numpy 배열)를 직접 수정한다.

콜백 함수를 이용하면 사용자의 마우스/키보드 입력을 실시간으로 반영할 수 있다.

영상 처리 결과를 사용자에게 직관적으로 보여주기 위해 시각화 능력은 필수다.

profile
개발 공부를 하며 직접 부딪히고 공부한 것을 기록합니다.

0개의 댓글