OpenCV를 활용한 데이터 시각화(도형, 텍스트) 및 마우스 인터랙션 구현
이미지 행렬 데이터 위에 직접 선을 긋거나 글자를 써서 분석 결과를 표현할 수 있다. 또한, 마우스 클릭이나 드래그 같은 이벤트를 감지하여 특정 영역(ROI)을 지정하는 등의 인터랙티브한 코드를 짤 수 있다.
cv2.line(): 직선 그리기.
cv2.rectangle(): 사각형 그리기 (검출된 객체 표시용으로 가장 많이 씀).
cv2.circle(): 원 그리기.
cv2.putText(): 영상 위에 문자열 출력. (한글은 기본적으로 지원되지 않음)
cv2.setMouseCallback(): 특정 윈도우 창에서 발생하는 마우스 동작을 감지할 콜백(Callback) 함수를 등록한다.
마우스 왼쪽 버튼 클릭(LBUTTONDOWN), 떼기(LBUTTONUP), 움직임(MOUSEMOVE) 등을 구분하여 처리할 수 있다.
빈 캔버스에 마우스 드래그로 사각형을 그리는 실습.
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)을 사용하는 것에 익숙해져야 한다.
좌표계 체계: 영상의 왼쪽 상단이 이며, 마우스 이벤트로 들어오는 x, y 값도 이 좌표계를 따른다는 점을 명확히 이해했다.
Drawing 함수는 원본 이미지(numpy 배열)를 직접 수정한다.
콜백 함수를 이용하면 사용자의 마우스/키보드 입력을 실시간으로 반영할 수 있다.
영상 처리 결과를 사용자에게 직관적으로 보여주기 위해 시각화 능력은 필수다.