[OpenCV-python] Contour 응용하기 1

2018. 6. 7. 14:05Python-이론/python-opencv

Contour 응용 1



이번 시간에는 contour의 호, 둘레와 근사법 등등의 폐곡선 Contour의 특성에 대해 알아보겠습니다.


이미지 모멘트 


폐곡선 객체의 무게중심, 객체의 면적등의 특성을 계산할 때 유용합니다. 

cv2.moments는 이미지 모멘트를 계산하고 이를 사전형 자료에 담아 리턴합니다. 



공간 모멘트 

m00, m01, m10, m11, m20, m02, m30, m21, m12, m03


중심 모멘트

mu20, mu11, mu02, mu30, mu21, mu12, mu03


평준화된 중심 모멘트 

nu20, nu11, nu02, nu30, nu21, nu03


여기서 m00은 폐곡선의 면적을 뜻한다.


cv2.moments의 인자는 numpy array 1xN 또는 Nx1의 형태이다. 


import cv2 img = cv2.imread('images/ahffk.PNG') img2 = cv2.imread('images/ahffk.PNG') imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret ,thr1 = cv2.threshold(imgray, 127, 255, cv2.THRESH_BINARY) _, contours, _ = cv2.findContours(thr1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnt = contours[0] mmt = cv2.moments(cnt) for key, value in mmt.items(): print(key," : ",value) cx = int(mmt['m10']/mmt['m00']) cy = int(mmt['m01']/mmt['m00']) print( 'x 무게중심', cx, 'y 무게중심', cy )


앞서 했던 코드들과 비슷한데 바뀐 코드는 

mmt = cv2.moments(cnt) for key, value in mmt.items(): print(key," : ",value) cx = int(mmt['m10']/mmt['m00']) cy = int(mmt['m01']/mmt['m00']) print( 'x 무게중심', cx, 'y 무게중심', cy )

이것 이다. 


mmt = cv2.moments(cnt)

공간, 중심 등의 정보를 가져올 수 있다. 


cx = int(mmt['m10']/mmt['m00']) cy = int(mmt['m01']/mmt['m00'])


이코드를 사용하면 우리가 사용할 폐곡선의 무게 중심을 구할 수 있다.


결과를 보면


이번에는 contours의 근사법을 사용해보겠다. 


이미지의 꼭지점이 원래보다 조금 더 적게 만들필요가 있을 때가 있습니다. 이럴 때를 이용하는 것이 근사법이라는 방법입니다. 


밑의 사진은 단순히 controus만 사용된 결과입니다. 






예제 코드 

import cv2

img = cv2.imread('images/ahffk.PNG')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret ,thr1 = cv2.threshold(imgray, 127, 255, cv2.THRESH_BINARY)

_, contours, _ = cv2.findContours(thr1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[0]

epsilon1 = cv2.arcLength(cnt, True) * 0.1
approx1 = cv2.approxPolyDP(cnt, epsilon1, True)

cv2.drawContours(img, [approx1], -1, (255, 0, 0), 2)
cv2.imshow('nene', img)


cv2.approxPolyDP(cnt, epsilon1, True)

함수는 곡선 또는 다각형을 epsilon의 값을 통해 꼭지점수를 줄여 새로운 곡선이나 다각형을 생성하여 리턴합니다. 


cnt: numpy 형식의 곡선 또는 다각형 

epsilon: 근사 정확도를 위한값 이 값은 오리지널 커브값과 근사 커브간 거리의 최대값으로 사용

세번째 인자: True이면 폐곡선 False이면 열린 곡선 


epsilon의 값이 크면 원래의 contour와 차이가 나게 나오고 작으면 차이가 적게 나옵니다. 


결과물