본문 바로가기
강의 (Lecture)/OpenCV와 Python으로 쉽게 배우는 Computer Vision

OpenCV + Python 다양한 그리기 함수 및 문자 출력

by codingwalks 2024. 9. 25.
반응형

안녕하세요. 코딩산책입니다.

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: 선의 두께

cv2.line

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)
• cv2.clipLine(rect, pt1, pt2)
• rect: 직선을 클리핑할 사각형 범위 (x, y, width, height)
• pt1, pt2: 직선의 시작점과 끝점
• 반환값으로 직선이 사각형 내에 있으면 True, 클리핑된 직선의 새로운 시작점과 끝점 좌표를 반환합니다.

cv2.clipLine

 

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: 사각형의 우하단 좌표

cv2.rectangle

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은 내부를 채운다는 의미

cv2.circle

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: 선의 두께

cv2.ellipse

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이면 열린 도형

cv2.polylines

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: 각도 간격에 따른 점의 밀도

cv2.ellipse2Poly

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: 다각형의 꼭짓점 좌표들

cv2.fillConvexPoly

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: 다각형 꼭짓점 좌표들의 리스트

cv2.fillPoly

 

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: 텍스트 두께

cv2.putText

 

4. 결론

이 포스팅에서 OpenCV의 다양한 그리기 함수들을 살펴보았습니다. 직선부터 다각형, 타원, 그리고 텍스트까지, OpenCV를 활용하여 다양한 이미지 처리를 손쉽게 구현할 수 있습니다. 이를 통해 이미지 주석 작업이나, 그래픽적인 작업을 더욱 효율적으로 처리할 수 있습니다.  

 

해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^

Buy me a coffee

 

반응형