import cv2
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
img = cv2.imread('../DATA/internal_external.png',0)
plt.imshow(img,cmap='gray')
grayscale로 설정함. openCV의 윤곽 함수가 좋은 점은 내부 윤곽뿐만 아니라 얼굴이나 삼각형, 피자와 같은 외부 윤곽도 감지할 수 있음.
- cv2.RETR_EXTERNAL:외부 contour만 추출
- cv2.RETR_CCOMP: 두 개의 계층으로 구성된 내외부 contour 모두 추출
- cv2.RETR_TREE: 나무 그래프로 구성된 내외부 contour 모두 추출
- cv2.RETR_LIST: 내외부 관계 없이 모든 contour 추출
image, contours, hierarchy = cv2.findContours(img, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
approx-> 대상 몇 개가 반환
hierarchy -> 상하구조는 어떤 방식을 호출하느냐에 따라 다름, 안쪽, 바깥쪽 컨투어 모두 호출했으므로 상하구조값도 반환
contours의 type 은 list, length는 22
hierarchy의 type numpy, shape은 (1,22,4)
hierarchy
각각의 윤곽 위치를 나타내고 있고 매개변수는 안쪽에 위치하는지 아니면 바깥에 위치하는지 정의함
array([[[ 4, -1, 1, -1],
[ 2, -1, -1, 0],
[ 3, 1, -1, 0],
[-1, 2, -1, 0],
[21, 0, 5, -1],
[ 6, -1, -1, 4],
[ 7, 5, -1, 4],
[ 8, 6, -1, 4],
[ 9, 7, -1, 4],
[10, 8, -1, 4],
[11, 9, -1, 4],
[12, 10, -1, 4],
[13, 11, -1, 4],
[14, 12, -1, 4],
[15, 13, -1, 4],
[16, 14, -1, 4],
[17, 15, -1, 4],
[18, 16, -1, 4],
[19, 17, -1, 4],
[20, 18, -1, 4],
[-1, 19, -1, 4],
[-1, 4, -1, -1]]], dtype=int32)
맨끝 4번쨰 원소의 1은 외부 윤곽이고 여기 있는 3개의 0이 나타내는 건 웃는 얼굴의 눈과 입, 4는 페퍼로니 조각이다
외부 contour 그리기
external_contours = np.zeros(image.shape)
바깥쪽 윤곽이 원래 이미지와 같은 모양, 검은색
for i in range(len(contours)):
# last column in the array is -1 if an external contour (no contours inside of it)
if hierarchy[0][i][3] == -1: #i는 모든 행 인덱싱, -1이면 외부윤곽, 아니면 내부윤곽
#==4로 바꾸면 페퍼로니조각나옴 0으로 바꾸면 웃는얼굴
# We can now draw the external contours from the list of contours
cv2.drawContours(external_contours, contours, i, 255, -1)
상하구조가 1이고, 바깥쪽 윤곽을 감지함. 삼각형, 원, 한 조각 빠진 원 모두 외부 윤곽임. 왜냐하면 배경과 맞닿아 있는 경계이기 때문이다
plt.imshow(external_contours,cmap='gray')
내부 contour
internal_contours= np.zeros(image.shape)
# Iterate through list of contour arrays
for i in range(len(contours)):
# If third column value is NOT equal to -1 than its internal
if hierarchy[0][i][3] != -1:
# Draw the Contour
cv2.drawContours(image_internal, contours, i, 255, -1)
plt.imshow(internal_contours,cmap='gray')
상하구조가 작동하는 방식-> 페퍼로니와 웃는 얼굴을 나타내는 윤곽을 각각 다르게 정의
출처: KMOOC X Udemy OpenCV 및 딥러닝을 이용한 Computer Vision 파이썬
'Deep Learning > Computer Vision' 카테고리의 다른 글
얼굴 탐지 (0) | 2023.08.10 |
---|---|
feature matching (0) | 2023.08.10 |
그리드 검출 (1) | 2023.08.09 |
엣지 검출 (0) | 2023.08.09 |
코너 검출 (0) | 2023.08.08 |