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


opencv_polyline


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


opencv_polyline


 

- 오목 다각형 그리기


오목 다각형을 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() 그려보았습니다.


opencv_polyline


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


opencv_polyline


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


opencv_polyline



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]]


opencv_polyline


- 시작, 종료 각도


타원의 내부에서 각도를 설정하여 일부분의 좌표 값들을 리턴 받을 수 있습니다.


pt1 = cv2.ellipse2Poly((200, 200), (100, 160), 0,   0, 180, 50)

pt2 = cv2.ellipse2Poly((200, 200), (100, 160), 0, 180, 360, 30)


opencv_polyline


- 타원의 회전


타원이 회전된 경우 내접하는 좌표를 구해 봅니다.


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)


opencv_polyline


+ Recent posts