OpenCV in colab – 도형 그리기

안녕하세요. 언제나휴일입니다.

이번에는 OpenCV 기술 중에 도형 그리기를 해 볼게요.

1. 라인 그리기

OpenCV를 사용하기 위해 cv2를 임포트합니다.

Google Colab 환경에서 이미지를 시각화하기 위해 cv2_imshow를 임포트합니다.

배열로 이미지를 표현하기 위해 numpy를 임포트합니다.\

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

높이와 너비가 512이고 3채널(칼라 이미지)이고 값은 0~255(uint8)인 이미지를 배열로 표현할게요.

초기 값은 0인 배열로 만들게요.

image = np.zeros((512,512,3),np.uint8)

참고로 3가지 채널의 모든 값이 0일 때 검정색입니다.

라인을 그릴 때 cv2.line 메서드를 사용합니다.

cv2.line(image, pt1, pt2, color [, thickness [,linetype [, shift]]])

image – 이미지

pt1, pt2 – 시작점과 끝 점 좌표

color – 색상 (BGR)

thickness – 두께

linetype – 선 종류(cv2.LINE_8, cv2.LINE_4, cv2.LINE_AA)

shift – fractional bit

라인을 그릴 때 이미지와 시작 좌표, 끝 좌표와 색상을 기본적으로 전달합니다.

좌표는 x,y로 구성합니다.

색상은 Blue, Green, Red 값으로 0~255 사이의 값으로 구성합니다.

다음은 Blue, Green, Red 색상의 선을 그리는 코드입니다.

cv2.line(image,(0,50),(512,50),(255,0,0))
cv2.line(image,(0,100),(512,100),(0,255,0))
cv2.line(image,(0,150),(512,150),(0,0,255))

라인을 그릴 때 색상 뒤에 두께를 표시할 수도 있습니다.

다음은 보라색으로 서로 다른 두께로 라인을 그리는 코드입니다.

cv2.line(image,(50,0),(50,512),(255,0,255),1)
cv2.line(image,(100,0),(100,512),(255,0,255),2)
cv2.line(image,(150,0),(150,512),(255,0,255),3)
cv2.line(image,(200,0),(200,512),(255,0,255),4)

이 외에도 linetype과 shift를 옵션으로 전달할 수도 있습니다.

다음은 세 가지 라인 타입으로 그리는 예입니다.

cv2.line(image,(0,0),(200,512),(255,255,255),10,cv2.LINE_4)
cv2.line(image,(50,0),(250,512),(255,255,255),10,cv2.LINE_8)
cv2.line(image,(100,0),(300,512),(255,255,255),10,cv2.LINE_AA)

전체 코드

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((512,512,3),np.uint8)

cv2.line(image,(0,50),(512,50),(255,0,0))
cv2.line(image,(0,100),(512,100),(0,255,0))
cv2.line(image,(0,150),(512,150),(0,0,255))

cv2.line(image,(50,0),(50,512),(255,0,255),1)
cv2.line(image,(100,0),(100,512),(255,0,255),2)
cv2.line(image,(150,0),(150,512),(255,0,255),3)
cv2.line(image,(200,0),(200,512),(255,0,255),4)

cv2.line(image,(0,0),(200,512),(255,255,255),10,cv2.LINE_4)
cv2.line(image,(50,0),(250,512),(255,255,255),10,cv2.LINE_8)
cv2.line(image,(100,0),(300,512),(255,255,255),10,cv2.LINE_AA)

cv2_imshow(image)
라인 그리기 결과

2. 사각형 그리기

이어서 사각형 그리기를 해 봅시다.

Colab에서는 새 노트로 여는 것이 아니라면 이미 실행한 부분은 계속 적용 상태입니다.

따라서 앞에서 작성한 import 문을 다시 작성할 필요는 없습니다. 새 노트라면 당연히 필요하겠죠.

import cv2 
import numpy as np 
from google.colab.patches import cv2_imshow

이미지를 만들고 출발합시다.

200X200 크기의 3채널(칼라 이미지)이고 값은 0~255(uint8)인 배열을 생성합니다.

image = np.zeros((200,200,3),np.uint8)

사각형을 그릴 때는 cv2.rectagle 메서드를 이용합니다.cv2.rectangle(image, pt1, pt2, color [, thickness [, linetype [,shift]]])image – 이미지pt1, pt2 – 시작점과 끝 점 좌표color – 색상 (BGR)thickness – 두께(-1일 때 내부를 채움)linetype – 선 종류(cv2.LINE_8, cv2.LINE_4, cv2.LINE_AA)shift – fractional bit좌표(10,10)와 (50,50)을 대각선의 꼭지점인 파란색 사각형을 그려봅시다.

cv2.rectangle(image,(10,10),(50,50),(255,0,0))

두께가 4이고 녹색인 사각형을 그려봅시다.

cv2.rectangle(image,(10,70),(50,110),(0,255,0),4)

사각형 내부를 채울 때는 두께 부분에 -1을 전달합니다.

cv2.rectangle(image,(10,130),(50,170),(0,0,255),-1)

이미지를 시각화합시다.

cv2_imshow(image)

전체 코드

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((200,200,3),np.uint8)

cv2.rectangle(image,(10,10),(50,50),(255,0,0))
cv2.rectangle(image,(10,70),(50,110),(0,255,0),4)
cv2.rectangle(image,(10,130),(50,170),(0,0,255),-1)
cv2_imshow(image)

사각형 그리기

3. 타원 그리기

이번에는 타원과 원을 그리기 해 봅시다.

높이가 100이고 너비가 300, 3채널(칼러 이미지)인 이미지를 생성합시다.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((100,300,3),np.uint8)

cv2.circle(image, center, radian, color, thickness)

image – 이미지

center –  중심 좌표

radian – 반지름

color – 색상

thickness –  두께(-1일 때 내부를 채움)

중심점(50,50)에서 반지름이 45인 원을 그립시다.(내부는 빨간색으로 채우고 외부는 두께 4인 파란색 원)

cv2.circle(image,(50,50),45,(0,0,255),-1)
cv2.circle(image,(50,50),45,(255,0,0),4)

타원을 그릴 때는 cv2.ellipse 메서드를 사용합니다.

cv2.ellipse(image, center, distances, angle, start_angle, end_enagle, color [, thickness [, linetype [, shift]]])

image – 이미지

center – 중심

distances – 중심에서의 거리(긴 거리와 짧은 거리)

angle – 타원의 기울기 각도

start_angle – 타원의 시작 각도

end_angle – 타원의 끝 각도

color – 색상

thickness – 두께 (-1이면 내부를 채움)

linetype – 선 종류(cv2.LINE_8, cv2.LINE_4, cv2.LINE_AA)shift – fractional bit중심점 (150,50)에서 거리가 (40, 25)인 타원을 260도 그립시다. (내부는 빨간색으로 채우고 두께가 3인 파란색인 타원)

cv2.ellipse(image,(150,50),(40,25),0,0,260,(255,0,0),3)
cv2.ellipse(image,(150,50),(40,25),0,0,260,(0,0,255),-1)

전체 코드

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((100,300,3),np.uint8)
cv2.circle(image,(50,50),45,(0,0,255),-1)
cv2.circle(image,(50,50),45,(255,0,0),4)

cv2.ellipse(image,(150,50),(40,25),0,0,260,(255,0,0),3)
cv2.ellipse(image,(150,50),(40,25),0,0,260,(0,0,255),-1)
cv2_imshow(image)
타원 그리기 결과

4. 다각형 그리기

이번에는 다각형 그리기를 해 봅시다.

먼저 높이 150, 너비 500인 3채널(칼라 이미지)인 이미지를 생성합시다.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((150,500,3),np.uint8)

다각형의 꼭지점으로 사용할 배열을 선언합니다.

각자가 원하는 꼭지점을 배열로 나타내 보세요.

pts1 = np.array([[10,10],[90,60],[120,76],[60,90],[70,120]],dtype=np.int32)

다각형을 그릴 때는 cv2.polylines 메서드를 이용합니다.

cv2.polylines(image, pts, is_closed, color [, thickness [, linetype [,shift]]])

image – 이미지

pts – 다각형을 구성하는 꼭지점 배열

is_closed – 닫힘 여부( True, False)

color – 색상

thickness – 두께 (-1이면 내부를 채움)

linetype – 선 종류(cv2.LINE_8, cv2.LINE_4, cv2.LINE_AA)shift – fractional bitpts1을 꼭지점으로 하는 다각형을 그려봅시다. is_closed 부분을 True로 지정할게요.

cv2.polylines(image,[pts1],True,(255,255,255),4)

비교하기 위해 is_closed부분이 False인 다각형도 하나 그려봅시다.

pts2 = np.array([[310,10],[390,60],[420,76],[360,90],[370,120]],dtype=np.int32)
cv2.polylines(image,[pts2],False,(0,255,0),4)

전체 코드

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((150,500,3),np.uint8)

pts1 = np.array([[10,10],[90,60],[120,76],[60,90],[70,120]],dtype=np.int32)
cv2.polylines(image,[pts1],True,(255,255,255),4)
pts2 = np.array([[310,10],[390,60],[420,76],[360,90],[370,120]],dtype=np.int32)
cv2.polylines(image,[pts2],False,(0,255,0),4)
cv2_imshow(image)
다각형 그리기 결과

5. 글씨 쓰기

마지막으로 글씨 쓰기를 해 봅시다.

높이가 330, 너비가 512, 3채널인 이미지를 생성합시다.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((330,512,3),np.uint8)

글씨를 쓸 때 cv2.putText 메서드를 사용합니다.

cv2.putText(image, text, pt, face, scale, color [,thickness [,linetype [,align]]])

image – 이미지

text – 출력 문자

pt – 출력 좌표(좌측 하단)

face – 폰트 face

cv2.FONT_HERSHEY_SIMPLE,

cv2.FONT_HERSHEY_PLAIN,

cv2.FONT_HERSHEY_DUPLEX,

cv2.FONT_HERSHEY_COMPLEX,

cv2.FONT_HERSHEY_TRIPLEX,

cv2.FONT_HERSHEY_COMPLEX_SMALL,

cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,

cv2.FONT_HERSHEY_SCRIPT_COMPLEX

scale –  크기

color – 색상

thickness –  두께

linetype – 선 종류(cv2.LINE_8, cv2.LINE_4, cv2.LINE_AA)align – pt 옵션( True – 좌측 하단, False – 좌측 상단) face에 따른 폰트를 그려보기로 합시다.

import cv2
import numpy as np
from google.colab.patches import cv2_imshow

image = np.zeros((330,512,3),np.uint8)

cv2.putText(image,"FONT_HERSHEY_COMPLEX",(30,30),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255))
cv2.putText(image,"FONT_HERSHEY_COMPLEX_SMALL",(30,70),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(255,255,255))
cv2.putText(image,"FONT_HERSHEY_DUPLEX",(30,110),cv2.FONT_HERSHEY_DUPLEX,1,(255,255,255))
cv2.putText(image,"FONT_HERSHEY_PLAIN",(30,150),cv2.FONT_HERSHEY_PLAIN,1,(255,255,255))#white,plain
cv2.putText(image,"FONT_HERSHEY_SCRIPT_COMPLEX",(30,190),cv2.FONT_HERSHEY_SCRIPT_COMPLEX,1,(255,255,255))#white,script_complex
cv2.putText(image,"FONT_HERSHEY_SCRIPT_SIMPLEX",(30,230),cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,1,(255,255,255))#white,script_simple
cv2.putText(image,"FONT_HERSHEY_SIMPLEX",(30,270),cv2.FONT_HERSHEY_SIMPLEX,1,(255,255,255))#white,simlex
cv2.putText(image,"FONT_HERSHEY_TRIPLEX",(30,310),cv2.FONT_HERSHEY_TRIPLEX,1,(255,255,255))#white,triplex
cv2_imshow(image)
폰트 그리기 결과