Contours는 이미지에서 동일한 강도의 색을 가진 경계선을 연결한 line을 찾아내는 기능입니다동일한 강도의 이미지를 찾기 위한 방법으로 먼저 배경을 binary로 검게 만들고 물체의 경계를 하얀색으로 하여 경계 line들을 찾아냅니다.  

 

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset]]]) → image, contours, hierarchy


 

Parameter

설명

image

이미지 파일

mode

cv2.RETR_EXTERNAL : 가장 바깥쪽 컨투어만 검색

cv2.RETR_LIST : hierarchy 관계 없이 모든 컨투어 검색

cv2.RETR_CCOMP : 모든 컨투어를 검색하여 2-level hierarchy 구성

cv2.RETR_TREE : 모든 컨투어를 검색하여 full hierarchy 구성

method

cv2.CHAIN_APPROX_NONE : 모든 컨투어 좌표를 저장

cv2.CHAIN_APPROX_SIMPLE : 수평, 수직의 끝점만 남기고 생략

cv2.CHAIN_APPROX_TC89_L1, cv2.CHAIN_APPROX_TC89_KCOS :

 Teh-Chin 체인 근사 알고리즘 적용

contours

발견된 contour

hierarchy

이미지의 hierarchy

offset

shift

 

이미지에서 어떤 line을 찾을 것인가는 mode를 통해서 설정하고 필요한 line을 선별하여 찾아내고 찾은 line 정보는 method를 이용해 어떤 값을 저장할 것인가 설정하게 됩니다.   findContours() 함수가 실행되면 3개의 리턴 값을 넘겨 주게 됩니다.


findContours()는 버전에 따라 리턴 값이 변경이 되었습니다. 3.x는 3개를 리턴하고 4.x는  contours, hierarchy 2개를 리턴 합니다.  오랜만에 예전에 만들어놓은 소스를 돌렸더니 오류가 나서 놀랬네요.

 

저장된 선들을 그리는 작업은 drawContours() 함수를 이용 합니다.

 

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]]) → image


Parameter

설명

image

이미지 파일

contours

이미지에서 구한 모든 contours 정보

contourIdx

contours index로 몇 번째 contours line을 그리는지 설정 한다. 음수이면 모든 contours를 그린다.

color

contours를 그리는 선의 색상 설정

thickness

contours의 선을 그리는 굵기 설정

lineType

선의 형태 설정

cv.FILLED

cv.LINE_4

cv.LINE_8

cv.LINE_AA

hierarchy

contours의 일부만 그리는 경우 사용(maxLevel과 함께 사용)

maxLevel

hierarchy가 있는 경우 0, 1, 2의 조건으로 그린다.

offset

shift

 

findContours()에서 리턴되어 저장된 line들은 drawContours() 함수를 이용하여 어떤 line을 어떤 조건으로 설정하여 그릴 것인가 결정 해주기만 하면 저장된 line을 시각적으로 볼 수 있습니다.

 


import numpy as np

import cv2

from matplotlib import pyplot as plt

 

imgFile1 = 'D:/tensorflow/images/contour001.jpg'

 

# image read

img1 = cv2.imread(imgFile1)

img1_gray = cv2.cvtColor(img1, cv2.COLOR_RGB2GRAY)

rtn, img1_thr = cv2.threshold(img1_gray, 127, 255, cv2.THRESH_BINARY)

img_binary = cv2.bitwise_not(img1_thr)

img2 = img1.copy()

 

contours, hierarcy = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

img_ext = cv2.drawContours(img1, contours, -1, (0, 255, 0), 5)

 

contours, hierarcy = cv2.findContours(img_binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

img_list = cv2.drawContours(img2, contours, -1, (0, 255, 0), 5)

 

plt.imshow(img1_gray, 'gray')

plt.title('img1_gray')

plt.show()

plt.imshow(img_binary, 'gray')

plt.title('img_binary')

plt.show()

 

plt.imshow(img1, 'gray')

plt.title('img_ext')

plt.show()

 

plt.imshow(img2, 'gray')

plt.title('img_list')

plt.show() 


프로그램을 간략하게 설명하면

원본 이미지를 gray로 변환합니다.


opencv contours


gray로 변환된 이미지를 다시 binary로 변환해서 배경을 검은색으로 바꾸어 줍니다.


opencv contours



cv2.RETR_EXTERNAL mode를 이용해서 바깥쪽 외각선만 추출해서 그려준 경우 입니다.

opencv contours



 cv2.RETR_TREE mode를 이용해서 전체 외각선을 찾아서 그려준 경우 입니다.

opencv contours


이런식으로  mode를 변경해가며 테스트를 진행하여 필요한 기능을 찾아내서 사용하면 됩니다.


- copy coding -


+ Recent posts