1 분 소요

이번 포스팅은 CV 함수를 활용하여 다양한 도형을 그릴 계획입니다.

보통 matplotlib을 사용하는 경우가 많은데, 저는 OpenCV 함수와 친해지기 위해서 OpenCV 내에 있는 함수만을 사용하였습니다.

다른 라이브러리와 마찬가지로, OpenCV함수를 사용하기 위해서는 cv2를 임포르 해야 합니다

import cv2
import numpy as np

이렇게 총 2개의 라이브러리를 사용하겠습니다.

## 직선-사각형

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

pt1 = 100, 100
pt2 = 400, 400
cv2.rectangle(img, pt1, pt2, (0,255,0), 2)

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.destroyAllWindows()

np.zeros() + 255를 사용하면, 배경을 흰색으로 불러올 수 있고, (512,512,3)은 3채널 컬러영상을, np.uint8은 부호 없는 8비트 정수를 의미합니다.

rectangle()은 사각형 도형을 그릴때 사용하는데, pt1은 시작좌표, pt2는 끝좌표, 그리고 색상(녹색), 선 두께를 순서대로 의미합니다.

다른 도형 함수에서도 동일하기 때문에, 함수 순서는 익힐 필요가 있습니다.

추가로 cv2내부의 함수로 여러 도형을 불러 올 수 있는데, line( )은 직선, circle( )은 원, ellipse( )는 타원, 그리고 ellipse2Poly( ) 함수는 타원 위에 또 다른 도형을 넣고 싶을때 사용합니다.

## 타원 위 또 다른 도형
img = np.zeros(shape = (512, 512, 3), dtype = np.uint8) + 255

ptCenter = img.shape[1]//2, img.shape[0] //2 
size = 200, 100

cv2.ellipse(img, ptCenter, size, 0, 0, 360, (255,0,0))
pts1 = cv2.ellipse2Poly(ptCenter, size, 0, 0,360, delta = 45)

cv2.ellipse(img, ptCenter, size, 45, 0, 360, (255,0,0))
pts2 = cv2.ellipse2Poly(ptCenter, size, 45, 0,360, delta = 45)

cv2.polylines(img, [pts1, pts2], isClosed= True, color = (0,0,255)) # (0,0,255)는 빨강


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

위에서 언급했던 것 처럼, ellipse()는 타원을 그립니다. 추가로 polylines()라는 함수가 보이는데, 이는 다각형을 그리는 함수 입니다.

조금 특이하게, ptCenter 부분은 도형의 중심값을 정수값으로 계산하기 위해 따로 지정해주었습니다.

ellipse() 함수 내부의 순서는 중심점, size는 말 그대로 크기, 각도는 0 혹은 45, 색상(파랑)순 입니다.

ellipse2Poly()함수에서 delta로 도형 간격을 지정할 수 있는데, 저는 각도와 동일하게 45로 지정했습니다.

참고로 다각형을 그릴땐, isClosed를 True로 지정해야 완벽한 도형이 생성되는데, 이를 False로 지정하게 되면, 변 하나가 없는 모양이 됩니다.

후기: 좌표값을 모두 설정해 주어야 하고, 무엇보다 matplotlib과는 다른 함수를 사용해서, 굉장히 머리 아프고 어렵게 다가왔던 것 같습니다.

그래도 코드 한줄 한줄 분석하며, 익숙해지다보면 어렵지 않게 사용할 수 있을 것 같습니다.

업데이트: