안녕하세요! 오늘은 OpenCV를 활용해 이미지 위에 다양한 도형을 그리는 방법을 알아보겠습니다. 분석된 영상 위에 가이드라인을 긋거나, 감지된 객체에 바운딩 박스를 쳐주는 등 시각화 작업에서 가장 기본이 되는 기술입니다.
1. 기본 준비: 좌표계와 BGR 색상
본격적으로 그리기 전에 꼭 기억해야 할 두 가지가 있습니다.
- 좌표계: 이미지의 좌측 상단이 (0, 0)입니다. 오른쪽으로 갈수록 x가 커지고, 아래로 갈수록 y가 커집니다.
- 색상: OpenCV는 RGB가 아니라 BGR(Blue, Green, Red) 순서를 사용합니다.
- 빨간색: (0, 0, 255)
- 초록색: (0, 255, 0)
- 파란색: (255, 0, 0)
2. 직선과 사각형 그리기 (Line & Rectangle)
가장 많이 쓰이는 직선과 사각형입니다. thickness 값을 -1로 주면 내부가 꽉 찬 도형을 그릴 수 있습니다.
import cv2
import numpy as np
# 500x500 사이즈의 검은색 배경 생성
img = np.zeros((500, 500, 3), dtype=np.uint8)
# 1. 직선: (시작x, 시작y), (종료x, 종료y), 색상, 두께
cv2.line(img, (50, 50), (450, 50), (255, 255, 0), 3) # 하늘색 가로선
# 2. 사각형: (좌상단x, y), (우하단x, y), 색상, 두께(-1은 채우기)
cv2.rectangle(img, (50, 100), (200, 250), (0, 255, 0), 2) # 초록색 테두리
cv2.rectangle(img, (300, 100), (450, 250), (0, 0, 255), -1) # 빨간색 채우기
cv2.imshow('Line & Rect', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 원과 다각형 (Circle & Polygon)
다각형을 그릴 때는 좌표들을 Numpy 배열 형태로 묶어서 전달해야 합니다.
# 3. 원: (중심x, y), 반지름, 색상, 두께
cv2.circle(img, (150, 400), 60, (255, 0, 255), 5) # 보라색 원
# 4. 다각형: 좌표 배열, 닫힘여부, 색상, 두께
pts = np.array([[300, 350], [450, 350], [450, 450], [350, 480]], dtype=np.int32)
cv2.polylines(img, [pts], True, (255, 255, 255), 2) # 흰색 4각형
cv2.imshow('Circle & Poly', img)
cv2.waitKey(0)
4. 이미지에 텍스트 넣기 (Text)
글꼴 종류와 크기, 위치를 지정해 메시지를 띄울 수 있습니다. 안타깝게도 OpenCV 기본 함수는 한글 지원이 되지 않으니 영어 위주로 실습해 보세요.
# 텍스트: (문구, 시작위치(좌하단), 글꼴, 크기, 색상, 두께)
text = "OpenCV Drawing"
cv2.putText(img, text, (100, 300), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (200, 200, 200), 2)
cv2.imshow('Text', img)
cv2.waitKey(0)
🛠️ 주요 파라미터 한눈에 보기
- lineType: 선의 부드러움을 결정합니다. cv2.LINE_AA를 사용하면 대각선이나 곡선에서 발생하는 계단 현상을 줄여 훨씬 부드럽게 보입니다. (강력 추천!)
- thickness: 선의 두께입니다. -1은 면을 채우는 용도입니다.
🚀 마치며
도형 그리기는 단순히 그림을 그리는 용도를 넘어, 나중에 객체 검출(Detection) 결과나 ROI(관심 구역)를 설정할 때 시각적인 가이드라인이 되어줍니다. 궁금하신 점은 댓글로 남겨주세요!
반응형
'컴퓨터 과학 > 👀 컴퓨터 비전' 카테고리의 다른 글
| 🎨 [OpenCV 기초] 이미지 색상 표현 방식 (BGR, HSV, YUV) 이해하기 (0) | 2026.01.07 |
|---|---|
| 📸 [OpenCV 기초] 이미지 내 관심영역(ROI) 표시 및 활용하기 (0) | 2026.01.07 |
| 🖱️ [OpenCV 기초] 창 관리와 인터랙티브한 이벤트 처리 (키보드 & 마우스) (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 이미지와 동영상 입출력 완벽 가이드 (0) | 2026.01.07 |
| 📸 [OpenCV 기초] 영상 처리와 컴퓨터 비전, 도대체 뭐가 다를까? (0) | 2026.01.07 |