OpenCV에서는 객체나 얼굴을 인식해서 해당하는 영역을 사각형으로 표시하는 것이 자주 사용된다. 여기서는 직선, 사각형을 포함한 다각형, 그리고 원 등의 도형을 그리는 방법에 대해 다루고자 한다.

 

1. 직선 그리기

이미지에 직선을 그리는 함수로 cv2.line()을 사용한다.

import cv2
import numpy as np

img = np.full((350,350,3), 255, dtype = np.uint8) # 350 x 350 크기의 흰 이미지

cv2.line(img, (50,50), (100,50), (0,0,255)) # Red
cv2.line(img, (150,50), (200,50), (0,255,0)) # Green
cv2.line(img, (250,50), (300,50), (255,0,0)) # Blue

cv2.line(img, (50,100), (300,100), (0,255,255), 5) # Yellow = Red + Green / 두께 5
cv2.line(img, (50,150), (300,150), (255,0,255), 5) # Pink = Red + Blue
cv2.line(img, (50,200), (300,200), (255,255,0), 5) # Skyblue = Green + Blue

cv2.line(img, (50,250), (300,300), (0,0,0), 10, cv2.LINE_8) # Black / 두께 10 / 계단 현상
cv2.line(img, (50,300), (300,250), (0,0,0), 10, cv2.LINE_AA) # 계단 현상 없이 매끄럽게 출력

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

이미지를 생성하는 img는 350 x 350크기의 흰 바탕으로 unit8의 데이터 타입으로 생성한다. uint8이란 unsigned int로 2의 8제곱 만큼의 범위를 의미하며, 0부터 255까지의 정수 표현만 가능하다. 이미지의 pixel은 음수인 경우가 없고 최댓값이 255이므로 uint를 데이터 타입으로 사용한다. 각 직선을 생성하는 함수의 cv2.line()은 이미지, 시작 좌표, 끝 좌표, 색상, [두께, 그리는 방식]을 인수로 갖는다. 두께는 default 값으로 1을 가지며, 그리는 방식은 사선이나 두꺼운 선의 끝 부분을 표현할 때 계단 현상을 최소화하도록 선택하는 것이다. 종류는 cv2.LINE_4, cv2.LINE_8, cv2.LINE_AA가 있다. LINE_4와 LINE_8은 계단 현상이 발생하지만, LINE_AA는 계단 현상이 발생하지 않는다.

 

2. 사각형 그리기

이미지에 사각형을 그리는 함수로 cv2.rectangle()을 사용한다.

import cv2
import numpy as np

img = np.full((450,450,3), 255, dtype = np.uint8)


cv2.rectangle(img, (50,50), (150,150), (0,0,255))
cv2.rectangle(img, (100,100), (250,250), (0,255,0), 5)
cv2.rectangle(img, (200,200), (400,400), (255,0,0), -1) # Blue로 채우기

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

cv2.rectangle()은 이미지, 사각형 시작 좌표, 사각형 끝 좌표, 색상, [두께, 그리는 방식]을 인수로 가지기에 직선을 그리는 것과 방법은 유사하다. 사각형을 그릴 때 두께에 -1을 지정하면 면 자체를 해당 색으로 채울 수 있다는 것이 직선을 그릴 때와는 다르다.

 

3. 다각형 그리기

이미지에 다각형을 그리는 함수는 cv2.polylines()이다.

import cv2
import numpy as np

img = np.full((500,500,3), 255, dtype = np.uint8)

poly1 = np.array([[50,50],[200,200]]) # 직선
poly2 = np.array([[350,50], [250,200],[450,200]]) # 삼각형
poly3 = np.array([[50,300],[200,300],[200,450],[50,450]]) # 사각형
poly4 = np.array([[350,250],[450,350],[400,450],[300,450],[250,350]]) # 오각형


cv2.polylines(img, [poly1], True, (0,0,255))
cv2.polylines(img, [poly2], True, (0,255,0))
cv2.polylines(img, [poly3], True, (255,0,0))
cv2.polylines(img, [poly4], False, (0,0,0)) # 열린 형태

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

cv2.polylines()은 이미지, 다각형 좌표, 닫힌 도형의 여부, 색상, [두께, 그리는 방식]을 인수로 가진다. 직선과 사각형을 그릴 때와는 달리 좌표가 NumPy의 배열 형식으로 전달된다. 그리고 닫힌 도형의 여부에서 True를 지정하면 poly2와 poly3에서 완벽히 감싼 형태가 나타나고, False를 지정하면 poly4처럼 마지막 좌표는 선으로 연결되지 않는다. cv2.polylines()에서도 직선과 사각형을 그릴 수는 있지만, 두께에 -1을 지정해서 색을 채우는 효과는 지원되지 않는다.

4. 원 그리기

이미지에 원을 그리는 함수는 cv2.circle(), 타원이나 호를 그리는 함수는 cv2.ellipse()이다.

import cv2
import numpy as np

img = np.full((500,450,3), 255, dtype = np.uint8)

cv2.circle(img, (100,150), 50, (0,0,255)) # 원
cv2.circle(img, (200,150), 75, (0,255, 0), 5)
cv2.circle(img, (300,150), 100, (255,0,0), -1)

cv2.ellipse(img, (100,300),(50,50), 0,0,360,(0,0,255)) # 원
cv2.ellipse(img, (225,300),(50,50),0,0,180,(0,255,0)) # 호
cv2.ellipse(img, (350,300),(50,50),0,181,360,(255,0,0),-1) # 호

cv2.ellipse(img, (150,400),(50,30),0,0,360,(0,0,0)) # 타원
cv2.ellipse(img, (300,400),(30,50),45,0,360,(0,0,0),-1)

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

cv2.circle()은 이미지, 원점 좌표, 반지름 크기, 색상, [두께, 그리는 방식]을 인수로 가진다. 이 함수로는 타원과 호를 그릴 수 없으며, cv2.ellipse()를 사용해야 한다. 물론, 원은 cv2.ellipse()로도 표현 가능하다. cv2.ellipse() 함수는 이미지, 원점 좌표, 반지름 크기, 회전 각도, 시작 각도, 끝 각도, 색상, [두께, 그리는 방식]을 인수로 갖는다. cv2.circle()과 cv2.ellipse() 모두 두께에 -1을 지정해서 색을 채우는 것이 가능하다.

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기