1.5 다각형
1.5.1 polylines()
polylines() 함수는 원하는 만큼의 좌표 점을 설정하여 선을 그을 수 있고 시작점과 끝점을 자동 또는 수동으로 연결하여 다각형을 그릴 수도 있습니다.
cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]]) → img
parameter |
내용 |
img |
이미지 파일 |
pts |
좌표 점들 (x, y) |
isClosed |
도형의 닫힘 유무 (True, False) |
color |
색상 (blue, green, red) 0 ~ 255 |
thickness |
선 두께 (default 1) |
lineType |
선 종류 (default cv.Line_8) - LINE_8 : 8-connected line - LINE_4 : 4-connecterd line - LINE_AA : antialiased line |
shift |
fractional bit (default 0) |
import numpy as np import cv2
# color 설정 blue_color = (255, 0, 0) green_color = (0, 255, 0) red_color = (0, 0, 255) white_color = (255, 255, 255) # 점 좌표 설정 points1 = np.array([[10, 10], [170, 10], [200, 230], [70, 70], [50, 150]], np.int32) points2 = np.array([[110, 110], [270, 110], [300, 330], [170, 170], [150, 250]], np.int32) # 모두 0으로 되어 있는 빈 Canvas(검정색) img = np.zeros((384, 384, 3), np.uint8) # 그리기 img = cv2.polylines(img, [points1], False, blue_color, 2) # 열린 도현 img = cv2.polylines(img, [points2], True, green_color, 2) #닫힌 도형
cv2.imshow('polylines',img) cv2.waitKey(0) cv2.destroyAllWindows() |
1.5.2 fillConvexPoly()
여러 점의 좌표를 이용 하여 채워진 볼록 다각형을 그립니다. 채워진 다각형이기 때문에 선 두께가 필요 없습니다.
cv2.fillConvexPoly(img, pts, color[, lineType[, shift]]) → img
parameter | 내용 |
img | 이미지 파일 |
pts | 좌표 점들 (x, y) |
color | 색상 (blue, green, red) 0 ~ 255 |
lineType | 선 종류 (default cv.Line_8) - LINE_8 : 8-connected line - LINE_4 : 4-connecterd line - LINE_AA : antialiased line |
shift | fractional bit (default 0) |
- 볼록 다각형 그리기
import numpy as np import cv2
# color 설정 blue_color = (255, 0, 0) green_color = (0, 255, 0) red_color = (0, 0, 255) white_color = (255, 255, 255)
# 모두 0으로 되어 있는 빈 Canvas(검정색) img = np.zeros((384, 384, 3), np.uint8) # 점 좌표 설정 pt1 = np.array([[110, 110], [270, 110], [300, 330], [170, 350], [100, 250], [50, 150]], np.int32) # 볼록 다각형 그리기 img = cv2.fillConvexPoly(img, pt1, white_color)
cv2.imshow('fillConvexPoly',img) cv2.waitKey(0) cv2.destroyAllWindows() |
- 오목 다각형 그리기
오목 다각형을 fillConvexPoly() 함수로 그리면 조금 다른 모양으로 나타납니다.
import numpy as np import cv2
# color 설정 blue_color = (255, 0, 0) green_color = (0, 255, 0) red_color = (0, 0, 255) white_color = (255, 255, 255)
# 모두 0으로 되어 있는 빈 Canvas(검정색) img = np.zeros((384, 384, 3), np.uint8) # 점 좌표 설정 pt1 = np.array([[110, 110], [270, 110], [300, 330], [170, 170], [150, 250]], np.int32) # 오목 다각형 그리기 img = cv2.fillConvexPoly(img, pt1, white_color) img = cv2.polylines(img, [points2], True, green_color, 2) #닫힌 도형
cv2.imshow('polylines',img) cv2.waitKey(0) cv2.destroyAllWindows() |
비교를 하기 위해 fillConvexPoly()를 흰색으로 그리고 그 위에 녹색으로 polylines()를 그려보았습니다.
1.5.3 fillPoly()
채워진 다각형을 그립니다. pts에 다각형 배열 값을 여러 개 입력할 수도 있습니다.
cv2.fillPoly(img, pts, color[, lineType[, shift[, offset]]]) → img
parameter | 내용 |
img | 이미지 파일 |
pts | 좌표 점들 (x, y) |
color | 색상 (blue, green, red) 0 ~ 255 |
lineType | 선 종류 (default cv.Line_8) - LINE_8 : 8-connected line - LINE_4 : 4-connecterd line - LINE_AA : antialiased line |
shift | fractional bit (default 0) |
offset | 모든 contour 점들의 offset |
- fillPoly()에 다각형 좌표 배열을 한 개만 적용한 경우
import numpy as np import cv2
# color 설정 blue_color = (255, 0, 0) green_color = (0, 255, 0) red_color = (0, 0, 255) white_color = (255, 255, 255)
# points 설정 points1 = np.array([[10, 10], [170, 10], [200, 230], [70, 70], [50, 150]], np.int32) points2 = np.array([[110, 110], [270, 110], [300, 330], [170, 170], [150, 250]], np.int32)
# 모두 0으로 되어 있는 빈 Canvas(검정색) img = np.zeros((384, 384, 3), np.uint8) # 그리기 img = cv2.fillPoly(img, [points1], blue_color) img = cv2.fillPoly(img, [points2], green_color)
cv2.imshow('fillPoly',img) cv2.waitKey(0) cv2.destroyAllWindows() |
- fillPoly()에 다각형 좌표 배열을 여러 개 적용한 경우 겹치는 부분이 사라집니다.
import numpy as np import cv2
# color 설정 blue_color = (255, 0, 0) green_color = (0, 255, 0) red_color = (0, 0, 255) white_color = (255, 255, 255)
# points 설정 points1 = np.array([[10, 10], [170, 10], [200, 230], [70, 70], [50, 150]], np.int32) points2 = np.array([[110, 110], [270, 110], [300, 330], [170, 170], [150, 250]], np.int32)
# 모두 0으로 되어 있는 빈 Canvas(검정색) img = np.zeros((384, 384, 3), np.uint8) # 그리기 img = cv2.fillPoly(img, [points1, points2], green_color) #img = cv2.fillPoly(img, [points2], green_color)
cv2.imshow('fillPoly',img) cv2.waitKey(0) cv2.destroyAllWindows() |
1.5.4 ellipse2Poly()
delta 각에 의하여 연결되는 선들을 이용하여 타원을 그리는 함수로 delta 값이 작을 수로 좀더 원에 가까운 다각형을 그릴 수 있습니다. ellipse2Poly() 함수의 파라미터 중 delta를 제외하고는 타원을 그리는 요소들 그대로 입니다. 즉 원을 면저 그리고 delta를 이용하여 그 원에 접하는 선들 의 좌표 값을 구하게 됩니다. delta 값이 작을 수로 원에 가까운 좌표들을 얻을 수 있습니다.
cv2.ellipse2Poly(center, axes, angle, arcStart, arcEnd, delta) → pts
parameter | 내용 |
center | 타원의 중심 좌표(x, y) |
axes | 축의 절반 길이(x, y) |
angle | 타원의 회전 각도 |
arcStart | 선의 좌표를 구하는 시작 각도 |
arcEnd | 선의 좌표를 구하는 종료 각도 |
delta | 타원의 회전 각도 |
pts | 타원에 접하는 선의 좌표 값들 |
import numpy as np import cv2
# color 설정 blue_color = (255, 0, 0) green_color = (0, 255, 0) red_color = (0, 0, 255) white_color = (255, 255, 255)
# 모두 0으로 되어 있는 빈 Canvas(검정색) img = np.zeros((384, 384, 3), np.uint8) pt1 = cv2.ellipse2Poly((200, 200), (100, 160), 0, 0, 360, 50) pt2 = cv2.ellipse2Poly((200, 200), (100, 160), 0, 0, 360, 30) img = cv2.ellipse(img, (200, 200), (100, 160), 0, 0, 360, white_color, 2) img = cv2.polylines(img, [pt1], False, green_color, 2) img = cv2.polylines(img, [pt2], False, red_color, 2)
print(pt1)
cv2.imshow('polylines',img) cv2.waitKey(0) cv2.destroyAllWindows() |
- pt1의 좌표 값만 출력해 보았습니다. 각도가 작아질 수록 개수가 많아집니다.
[[300 200] [264 323] [183 358] [113 280] [106 145] [166 50] [250 61] [298 172] [300 200]] |
- 시작, 종료 각도
타원의 내부에서 각도를 설정하여 일부분의 좌표 값들을 리턴 받을 수 있습니다.
pt1 = cv2.ellipse2Poly((200, 200), (100, 160), 0, 0, 180, 50) pt2 = cv2.ellipse2Poly((200, 200), (100, 160), 0, 180, 360, 30) |
- 타원의 회전
타원이 회전된 경우 내접하는 좌표를 구해 봅니다.
pt3 = cv2.ellipse2Poly((200, 200), (100, 160), 0, 0, 360, 50) pt1 = cv2.ellipse2Poly((200, 200), (100, 160), 45, 0, 360, 50) pt2 = cv2.ellipse2Poly((200, 200), (100, 160), 90, 0, 360, 30)
img = cv2.ellipse(img, (200, 200), (100, 160), 0, 0, 360, white_color, 2) img = cv2.polylines(img, [pt1], False, green_color, 2) img = cv2.polylines(img, [pt2], False, red_color, 2) img = cv2.polylines(img, [pt3], False, blue_color, 2) |
'Tensorflow > OpenCV' 카테고리의 다른 글
OpenCV 2. 이미지 입력 출력 (Python) (0) | 2019.04.02 |
---|---|
OpenCV 1. 도형 그리기 문자 (Python) (5) | 2019.04.01 |
OpenCV 1. 도형 그리기 원 타원 (Python) (0) | 2019.03.28 |
OpenCV 1. 도형 그리기 사각형 (Python) (1) | 2019.03.26 |
OpenCV 1. 도형 그리기 점 선 (Python) (3) | 2019.03.25 |