Python OpenCV - 도형, 문자

BANG·2020년 11월 28일
1

OpenCV

목록 보기
9/16

좌표를 튜플(tuple)로 나타냄 (x, y)

선과 사각형 그리기

import cv2
import numpy as np
 
# White 배경 생성
# 가로, 세로가 512인 3개의 channel을 모두 (0 + 255)로 가득찬 배열을 생성
img = np.zeros(shape=(512,512,3), dtype=np.uint8) + 255	# np.zeros : 0으로 가득 찬 array를 생성
# img = np.ones((512,512,3), np.uint8) * 255	
# img = np.full((512,512,3), (255, 255, 255), dtype= np.uint8)
 
#img = np.zeros((512,512, 3), np.uint8) # Black 배경
 
pt1 = 100, 100
pt2 = 400, 400
 
# 시작점 좌표(pt1)와 종료점 좌표(pt2)를 잇는 굵기가2인 초록 사각형 생성
cv2.rectangle(img, pt1, pt2, (0, 255, 0), 2)
 
# x축의 0부터 500까지 굵기 5인 파란 선 생성
cv2.line(img, (0, 0), (500, 0), (255, 0, 0), 5)
 
# y축의 0부터 500까지 굵기 5인 빨간 선 생성
cv2.line(img, (0, 0), (0, 500), (0,0,255), 5)
 
cv2.imshow('img', img)	# 이미지 보여주기
cv2.waitKey()
cv2.destroyAllWindows()

원 그리기

import cv2
import numpy as np
 
# 배경이 white인 512 * 512 크기 배열(창) 생성
img = np.zeros(shape=(512,512,3), dtype=np.uint8) + 255
 
# 창의 가장 가운데의 좌표 구하기
cx = img.shape[0]//2	# 창의 중심좌표의 높이 / 2
cy = img.shape[1]//2	# 창의 중심좌표의 넓이 / 2
 
for r in range(200, 0, -100):	# 200부터 0까지 -100간격(r = 200, 100)
    # 원의 중심점이(cx, cy)이고 반지름이 r인 파란 원 테두리 그리기
    cv2.circle(img, (cx, cy), r, color=(255, 0, 0))
 
# 원의 중심점이(cx, cy)이고 반지름이 50인 안이 채워진 빨간 원 그리기
cv2.circle(img, (cx, cy), radius=50, color=(0, 0, 255), thickness=-1)
 
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

타원 그리기

import cv2
import numpy as np
 
# 하얀 배경 생성
img = np.zeros(shape=(512,512,3), dtype=np.uint8) + 255
 
# 창의 가운데 중점 좌표 구하기
ptCenter = img.shape[0]//2, img.shape[1]//2
 
size = 200, 100  # tuple(튜플)
 
# 타원의 크기 : 타원의 x축 반지름(x radius)과 y축 반지름(y radius)
# 타원의 각도(기울기), 타원을 그리는 시작 각도, 타원을 그리는 종료 각도
# 중심점이 ptCenter이고 타원의 크기가 size인 타원 그리기
cv2.ellipse(img, ptCenter, size, 0, 0, 360, (255, 0, 0))	# 파란 타원 그리기
cv2.ellipse(img, ptCenter, size, 45, 0, 360, (0, 0, 255))	# 빨간 타원 그리기
 
# 사각형의 내부에서 타원 그리기
# box: (중심점, 크기(x, y), 기울기) 회전 사각형
box = (ptCenter, size, 0)	# tuple(튜플)
cv2.ellipse(img, box, (255, 0, 0), 5)	# 굵기가 5인 파란 타원 그리기
 
box = (ptCenter, size, 45)	# tuple(튜플)
cv2.ellipse(img, box, (0, 0, 255), 5)	# 굵기가 5인 빨간 타원 그리기
 
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

다각형 그리기(polylines)

  • 원하는 만큼의 좌표를 설정하여 선을 긋고, 시작점과 끝점을 자동/수동으로 연결 가능
import cv2
import numpy as np
 
img = np.zeros(shape=(512,512,3), dtype=np.uint8) + 255
 
pts1 = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
pts2 = np.array([[300, 200], [400, 100], [400, 200]])
 
# isClosed : 시작점과 끝점의 연결 여부
cv2.polylines(img, [pts1, pts2], isClosed=True, color=(255, 0, 0))
 
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

import cv2
import numpy as np
 
img = np.zeros(shape=(512,512,3), dtype=np.uint8) + 255
 
pts1 = np.array([[100, 100], [200, 100], [200, 200], [100, 200]])
pts2 = np.array([[300, 200], [400, 100], [400, 200]])
 
# 내부가 채워진 파란색 다각형 그리기
cv2.fillConvexPoly(img, pts1, color=(255, 0, 0))
 
# 내부가 채워진 빨간색 다각형 그리기
cv2.fillPoly(img, [pts2], color=(0, 0, 255))
#cv2.fillPoly(img, [pts1, pts2], color=(0, 0, 255))
 
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

문자열 출력하기

import numpy as np
import cv2
 
# 하얀 배경을 생성
img = np.zeros(shape=(512,512,3), dtype=np.uint8) + 255
 
text = 'OpenCV Programming'
org = (50, 100)	# 좌표
font = cv2.FONT_HERSHEY_SIMPLEX	# 글씨체
 
# text를 org좌표를 글자의 왼쪽 하단을 시작점으로 font에 지정한 글꼴로 굵기2인 파란색 문자열 출력
cv2.putText(img, text, org, font, 1, (255,0,0), 2)
 
# size : 문자열(text)을 font, 폰트 스케일 1, 두께 2로 출력하기 위한 사각형의 크기 반환
# baseLine : 출력될 사각형 아래 기준선의 상대적 y값을 반환
size, baseLine = cv2.getTextSize(text, font, 1, 2)
#print('size=', size)
#print('baseLine=', baseLine)
 
# 사각형 그리기(사각형 안에 Text를 넣기)
# org[1]에서 text의 크기만큼인 size[1]를 빼줘야 문자열 높이를 가진 사각형이 생성
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()
profile
Record Everything!!

0개의 댓글