Python/OpenCV

[OpenCV 튜토리얼] 3. 도형 그리기 및 문자열 출력하기

Hannah_ko 2020. 11. 17. 14:13
SMALL

OpenCV에는 처리 결과를 영상에 표시하기 위해 다양한 도형을 그리는 함수 및 문자열을 출력하는 합수가 있다.

간단한 예제로 살펴보려 한다.

 

1. 직선, 사각형 그리기

import cv2
import numpy as np

# white background
img = np.zeros(shape=(512, 512, 3), dtype=np.uint8) + 255
# black background
# img = np.zeros(shape=(512, 512, 3), dtype=np.uint8)

p1 = 100, 100
p2 = 400, 400

# rectangle
cv2.rectangle(img, p1, p2, (0, 255, 0), 2)

# line set
cv2.line(img, (0, 0), (500, 0), (255, 0, 0), 5)
cv2.line(img, (0, 0), (0, 500), (0, 0, 255), 5)

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindow()

 

0으로 초기화된 배열에 512 x 512 크기의 3 채널 컬러 영상을 생성한다.

dtype=np.uint8은 부호없는 8비트 정수인영상 화소를 나타낸다.

배경 값이 255, 255, 255이므로 하얀색 배경이 생성되고

cv2.rectangle() 함수로 영상에 p1, p2로 정의된 사각형을 녹색, 두께 2만큼으로 그린다.

cv2.line() 함수로 원점에서 (500, 0)인 부분에 파란색 두께 5만큼인 선을 그리고

원점에서 (0, 500)인 부분에 빨간색으로 두께 5만큼 선을 그려준다.

 

 

2. 원, 타원 그리기

import cv2
import numpy as np

img = np.zeros(shape=(512, 512, 3), dtype==np.uint8) + 255

circle_x = img.shape[0] // 2
circle_y = img.shape[1] // 2

for r in range(200, 0, -100):
    cv2.circle(img, (circle_x, circle_y), r, color=(255, 0, 0))
    
cv2.circle(img, (circle_x, circle_y), radius=50, color=(0, 0, 255), thickness=-1)

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

circle_x, circle_y에서 영상의 중심을 정수로 계산한다.

첫 번째 cv2.circle 함수는 for 문을 이용해 r을 200 -> 100으로 줄여가며 원의 중심이 circle_x, circle_y이고 반지름이 r(200, 100), 파란원을 그린다.

두 번재 cv2.circle 함수는 반지름이 50이고 thickness=-1(색상으로 원을 가득 채움)인 빨간 원을 그린다.

 

 

3. 다각형 그리기

import cv2
import numpy as np

img = np.zeros(shape=(512, 512, 3), dtype=np.uint8) + 255

p1 = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
p2 = np.array([[300, 200], [400, 100], [400, 200]])

cv2.polylines(img, [p1, p2], isClosed=True, color=(255, 0, 0))

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

p1은 네 개의 좌표를 갖는 다각형을 만들고 p2는 세 개의 좌표를 갖는 다각형을 만든다.

isClosed가 True이면 닫힌 도형을 그리게 된다.

 

 

4. 문자열 출력

import cv2
import numpy as np

img = np.zeros(shape=(512, 512, 3), dtype=np.uint8) + 255

text = 'Hello world!'
org = (50, 100)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, text, org, font, 1, (255, 0, 0), 2)

size, baseline = cv2.getTextSize(text, font, 1, 2)

cv2.rectangle(img, org, (org[0] + size[0], org[1] - size[1]), (0, 0, 255))
cv2.circle(img, org, 3, (0, 255, 0), 2)

cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

img라는 하얀 배경을 생성해주고 text 변수에 넣고 싶은 문자열을 넣어준다.

cv2.putText 함수를 이용해 org 위치에서 text가 출력될 수 있게 지정해준다.

그 다음 cv2.rectangle 함수를 이용해 문자열 크기만큼을 같은 시작점에서 그려주고

cv2.circle을 이용해 org 부분을 표시해준다.

 

 

 


[참고 문헌]

 

1. OpenCV reference

2. 김동근(2018), "Python으로 배우는 Open CV 프로그래밍", 가메출판사

 

LIST