OpenCV의 가장 기본적인 작업 중 하나는 이미지 위에 도형을 그리는 것입니다. 선(line), 원(circle), 사각형(rectangle) 등 다양한 기하학적 모양을 자유롭게 추가할 수 있습니다.
이미지 분석 작업을 하다 보면 특정 영역을 강조해야 하는 경우가 많습니다. 예를 들어 관심 영역을 표시하는 사각형을 그리거나, 특정 대상을 가리키는 화살표나 주석을 추가하는 것이 대표적입니다.
OpenCV에서 자주 사용되는 도면 관련 함수는 다음과 같습니다.
- cv2.line() — 이미지에 직선을 그립니다.
- cv2.rectangle() — 이미지에 사각형을 그립니다.
- cv2.circle() — 이미지에 원을 그립니다.
- cv2.putText() — 이미지에 텍스트를 작성합니다.
- cv2.ellipse() — 이미지에 타원을 그립니다.
기본 이미지 캔버스 만들기
도형을 그리기 전에 먼저 빈 이미지(캔버스)를 생성해야 합니다. NumPy의 zeros() 함수를 사용하면 검은색 배경의 이미지를 손쉽게 만들 수 있습니다.
import numpy as np
import cv2
my_img = np.zeros((350, 350, 3), dtype = "uint8")
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과

직선 그리기
직선을 그릴 때는 cv2.line() 함수를 사용합니다. 이 함수는 다음과 같은 다섯 개의 인자를 받습니다.
- 그림을 그릴 이미지 객체
- 시작점 좌표 (x, y)
- 끝점 좌표 (x, y)
- 선 색상 — BGR 순서이며 RGB가 아님에 유의
- 선 두께 (픽셀 단위)
import numpy as np
import cv2
my_img = np.zeros((350, 350, 3), dtype = "uint8")
# 선 그리기
cv2.line(my_img, (202, 220), (100, 160), (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과

사각형 그리기
사각형을 그릴 때는 cv2.rectangle() 함수를 사용하며, 이 함수 역시 다섯 개의 입력 매개변수를 받습니다.
- 그림을 그릴 이미지 객체
- 왼쪽 상단 꼭짓점 좌표 (x, y)
- 오른쪽 하단 꼭짓점 좌표 (x, y)
- 선 색상 — BGR 순서이며 RGB가 아님에 유의
- 선 두께 (픽셀 단위)
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 사각형 그리기
cv2.rectangle(my_img, (30, 30), (300, 200), (0, 20, 200), 10)
cv2.imshow('Window', my_img)
# 창을 강제로 닫을 때까지 이미지를 표시
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과

원 그리기
원을 그릴 때는 cv2.circle() 함수를 사용하며, 이 함수는 다섯 개의 입력 매개변수를 받습니다.
- 그림을 그릴 이미지 객체
- 중심 좌표 (x, y)
- 원의 반지름
- 선 색상 — BGR 순서이며 RGB가 아님에 유의
- 선 두께 (픽셀 단위)
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 원 그리기
cv2.circle(my_img, (200, 200), 80, (0, 20, 200), 10)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과

타원 그리기
타원을 그릴 때는 cv2.ellipse() 함수를 사용하며, 이 함수는 여덟 개의 입력 매개변수를 받습니다.
- 그림을 그릴 이미지 객체
- 중심 좌표 (x, y)
- 장축과 단축의 길이 (h, w)
- 타원의 회전 각도 (반시계 방향 기준)
- 시작 각도 (시계 방향 기준)
- 종료 각도 (시계 방향 기준)
- 선 색상 — BGR 순서이며 RGB가 아님에 유의
- 선 두께 (단, -1을 지정하면 내부가 채워짐)
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 타원 그리기
cv2.ellipse(my_img,(256,256),(100,50),0,0,180,255,-1)
cv2.imshow('Window', my_img)
# 창을 강제로 닫을 때까지 이미지를 표시
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과

다각형 그리기
다각형을 그릴 때는 cv2.polylines() 함수를 사용하며, 이 함수는 다섯 개의 인자가 필요합니다.
- 그림을 그릴 이미지 객체
- 좌표 배열
- 닫힌 선 여부 (True일 경우 닫힌 다각형)
- 선 색상
- 선 두께
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(my_img,[pts],True,(0,255,255))
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과

텍스트 쓰기
OpenCV에서 이미지에 텍스트를 작성할 때는 cv2.putText() 함수를 사용하며, 이 함수는 여러 개의 인자를 받습니다.
- 그림을 그릴 이미지
- 작성할 텍스트
- 텍스트 시작점 좌표
- 사용할 폰트
- 폰트 크기
- 텍스트 색상
- 텍스트 두께
- 사용할 선의 종류 (예: cv2.LINE_AA — 안티앨리어싱 적용)
import numpy as np
import cv2
my_img = np.zeros((400, 400, 3), dtype = "uint8")
# 텍스트 쓰기
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(my_img, 'Tutorials Point', (50, 50),font, 0.8, (255, 0, 0), 2, cv2.LINE_AA)
cv2.imshow('Window', my_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
출력 결과