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로 변환합니다.
gray로 변환된 이미지를 다시 binary로 변환해서 배경을 검은색으로 바꾸어 줍니다.
cv2.RETR_EXTERNAL mode를 이용해서 바깥쪽 외각선만 추출해서 그려준 경우 입니다.
cv2.RETR_TREE mode를 이용해서 전체 외각선을 찾아서 그려준 경우 입니다.
이런식으로 mode를 변경해가며 테스트를 진행하여 필요한 기능을 찾아내서 사용하면 됩니다.
- copy coding -
'Tensorflow > OpenCV' 카테고리의 다른 글
[OpenCV] Android + SDK + Java 카메라 및 Canny 함수 사용 (2) | 2023.07.02 |
---|---|
[OpenCV] Android Studio에서 OpenCV 개발 환경 설정 (0) | 2023.06.06 |
OpenCV threshold 설명 (0) | 2020.11.23 |
OpenCV 6. 히스토그램 (Python) (1) | 2020.10.03 |
OpenCV 이미지 붙이기 (1) | 2019.04.08 |