안녕하세요. 코딩산책입니다.
OpenCV는 이미지 처리 라이브러리로, 이미지 위에 다양한 도형과 텍스트를 쉽게 그릴 수 있는 함수를 제공합니다. 이번 포스팅에서는 직선, 도형(사각형, 원, 다각형, 타원 등)을 그리는 다양한 함수들과, 텍스트를 이미지 위에 출력하는 방법을 설명하고 예제 코드를 통해 활용 방법을 알아보겠습니다. 각 축마다 좌표계를 쉽게 구현하기 위해 이미지를 그리기 위한 도구로 matplotlib를 사용하도록 합니다. 사용방법을 모르시는 경우에는 아래의 포스트를 참조 하여주시기 바랍니다.
2024.09.25 - [프로그래밍 (Programming)/파이썬 (Python)] - Python Matplotlib 데이터 시각화 - imshow 함수 사용법
1. 직선 그리기 (cv2.line 및 cv2.clipLine)
1.1. 직선 그리기 (cv2.line)
직선은 가장 기본적인 도형 중 하나입니다. OpenCV의 cv2.line 함수를 사용하여 이미지를 생성하고 직선을 그릴 수 있습니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Draw a line (start point (x1, y1), end point (x2, y2), color (BGR), thickness)
cv2.line(image, (100, 100), (400, 400), (0, 255, 0), 5)
plt.imshow(image)
plt.show()
• cv2.line(img, pt1, pt2, color, thickness)
• img: 이미지
• pt1, pt2: 직선의 시작점과 끝점 좌표
• color: 직선의 색상 (BGR 형식)
• thickness: 선의 두께
1.2. 직선 자르기 (cv2.clipLine)
clipLine은 직선을 주어진 사각형 내에서만 보이도록 클리핑(자르기)하는 함수입니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Draw a line only inside a rectangle
rect = (50, 50, 200, 200) # Definition of a square (x, y, width, height)
p1 = (0, 0)
p2 = (400, 400)
inside, clipped_p1, clipped_p2 = cv2.clipLine(rect, p1, p2)
if inside:
cv2.line(image, clipped_p1, clipped_p2, (0, 0, 255), 3)
plt.imshow(image)
plt.show()
• cv2.clipLine(rect, pt1, pt2)
• rect: 직선을 클리핑할 사각형 범위 (x, y, width, height)
• pt1, pt2: 직선의 시작점과 끝점
• 반환값으로 직선이 사각형 내에 있으면 True, 클리핑된 직선의 새로운 시작점과 끝점 좌표를 반환합니다.
2. 도형 그리기
다양한 도형도 OpenCV를 통해 쉽게 그릴 수 있습니다. 여기서는 사각형, 원, 타원, 다각형 등을 그리는 방법을 살펴보겠습니다.
2.1. 사각형 그리기 (cv2.rectangle)
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Draw a rectangle
cv2.rectangle(image, (50, 50), (450, 450), (255, 0, 0), 3)
plt.imshow(image)
plt.show()
• cv2.rectangle(img, pt1, pt2, color, thickness)
• pt1: 사각형의 좌상단 좌표
• pt2: 사각형의 우하단 좌표
2.2. 원 그리기 (cv2.circle)
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Draw a circle
cv2.circle(image, (256, 256), 100, (255, 0, 0), 3)
plt.imshow(image)
plt.show()
• cv2.circle(img, center, radius, color, thickness)
• center: 원의 중심 좌표
• radius: 원의 반지름
• thickness: 선의 두께, -1은 내부를 채운다는 의미
2.3. 타원 그리기 (cv2.ellipse)
타원은 cv2.ellipse 함수를 사용하여 그릴 수 있습니다. 타원의 중심 좌표, 장축과 단축의 길이, 각도 등을 지정할 수 있습니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Draw a ellipse
cv2.ellipse(image, (256, 256), (150, 100), 45, 0, 360, (255, 0, 0), 3)
plt.imshow(image)
plt.show()
• cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness)
• center: 타원의 중심 좌표
• axes: 타원의 장축, 단축 길이 (major axis, minor axis)
• angle: 타원의 회전 각도
• startAngle, endAngle: 타원의 그려질 각도 범위
• color: 색상
• thickness: 선의 두께
2.4. 다각형 그리기 (cv2.polylines)
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Set polygon coordinates
pts = np.array([[100, 50], [200, 300], [70, 200]], np.int32)
pts = pts.reshape((-1, 1, 2))
# Drawing a polygon
cv2.polylines(image, [pts], True, (255, 0, 0), 3)
plt.imshow(image)
plt.show()
• cv2.polylines(img, pts, isClosed, color, thickness)
• pts: 다각형의 꼭짓점 좌표 리스트
• isClosed: True이면 도형을 닫고, False이면 열린 도형
2.5. 타원 폴리곤 좌표 생성 (cv2.ellipse2Poly)
cv2.ellipse2Poly는 타원의 꼭짓점 좌표를 폴리곤 형태로 반환하여 그릴 수 있도록 해주는 함수입니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Generate elliptical coordinates
ellipse_points = cv2.ellipse2Poly((256, 256), (150, 100), 45, 0, 360, 30)
# Drawing an ellipse with a polygon
cv2.polylines(image, [ellipse_points], True, (255, 0, 0), 3)
plt.imshow(image)
plt.show()
• cv2.ellipse2Poly(center, axes, angle, startAngle, endAngle, delta)
• delta: 각도 간격에 따른 점의 밀도
2.6. 볼록 다각형 채우기 (cv2.fillConvexPoly)
fillConvexPoly는 볼록한 다각형을 색으로 채울 때 사용합니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Convex polygon coordinates
pts = np.array([[150, 100], [200, 200], [100, 300], [50, 200]], np.int32)
cv2.fillConvexPoly(image, pts, (0, 255, 0))
plt.imshow(image)
plt.show()
• cv2.fillConvexPoly(img, points, color)
• points: 다각형의 꼭짓점 좌표들
2.7. 다각형 채우기 (cv2.fillPoly)
fillPoly는 여러 개의 다각형을 한 번에 그릴 수 있는 함수입니다. 각 다각형은 서로 다른 색상으로 그릴 수 있습니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# Polygon Coordinates
pts1 = np.array([[100, 50], [200, 300], [70, 200]], np.int32)
pts2 = np.array([[300, 200], [400, 400], [250, 350]], np.int32)
cv2.fillPoly(image, [pts1, pts2], (255, 0, 0))
plt.imshow(image)
plt.show()
• cv2.fillPoly(img, pts, color)
• pts: 다각형 꼭짓점 좌표들의 리스트
3. 문자열 출력하기 (cv2.putText)
이미지에 텍스트를 넣는 것은 유용한 기능입니다. cv2.putText 함수를 사용하여 이미지를 주석 처리하거나 설명을 추가할 수 있습니다.
import cv2
from matplotlib import pyplot as plt
import numpy as np
# Create a blank image (black background)
image = np.zeros((512, 512, 3), np.uint8)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.putText(image, 'OpenCV Drawing!', (50, 450), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
plt.imshow(image)
plt.show()
• cv2.putText(img, text, org, font, fontScale, color, thickness)
• text: 출력할 문자열
• org: 텍스트가 시작되는 좌표
• font: 폰트 스타일
• fontScale: 텍스트 크기
• color: 텍스트 색상
• thickness: 텍스트 두께
4. 결론
이 포스팅에서 OpenCV의 다양한 그리기 함수들을 살펴보았습니다. 직선부터 다각형, 타원, 그리고 텍스트까지, OpenCV를 활용하여 다양한 이미지 처리를 손쉽게 구현할 수 있습니다. 이를 통해 이미지 주석 작업이나, 그래픽적인 작업을 더욱 효율적으로 처리할 수 있습니다.
해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^
★ 모든 내용은 아래의 링크를 참조하였습니다. ★
'강의 (Lecture) > OpenCV 마스터 with Python (초급)' 카테고리의 다른 글
OpenCV + Python 각도 측정기 (실습) (3) | 2024.09.30 |
---|---|
OpenCV + Python 한글 폰트 출력하기 (2) | 2024.09.30 |
OpenCV + Python 마우스 및 키보드 이벤트 처리와 트랙바 활용하기 (0) | 2024.09.28 |
OpenCV + Python 이미지, 비디오, 웹캠(Webcam), RTSP 및 RTMP 스트림 처리 (1) | 2024.09.24 |
OpenCV + Python 과정 소개 및 설치 과정 (1) | 2024.09.08 |