# Counting Objects(contours 윤곽선, hierarchy 계층구조)
# cv2.findContours(이진화 이미지(mask), 검색 방법, 근사화 방법)
contours, hierarchy = cv.findContours(dst.copy(), cv.RETR_EXTERNAL, \
cv.CHAIN_APPROX_SIMPLE)
# [contours[i]] = 윤곽선 표시
# cv.CHAIN_APPROX_SIMPLE 윤곽점들 단순화 수평, 수직 및 대각선 요소를 압축하고 끝점만 남김
print(contours) # 각 점으로 표시됨
print(hierarchy[0][1])
# cv2.drawContours(이미지, [윤곽선], 윤곽선 인덱스, (B, G, R), 두께, 선형 타입)
# 윤곽선 인덱스 -1 = 윤곽선 배열 모두를 의미
# [윤곽선], 0과 윤곽선, -1은 동일한 의미
for i in range(len(contours)):
cv.drawContours(img, [contours[i]], -1, (0,0,255), 3)
# cv.imshow('img', img)
# cv.waitKey() == ord('q')
text = f'i found {len(contours)}'
# cv.putText(img, text, '좌측 상단 모서리(org)', fontFace, fontScale, color, 굵기)
cv.putText(img, text, (20,25), cv.FONT_HERSHEY_SIMPLEX, 0.7,(240, 0, 159), 2)
cv.imshow('contours', img)
cv.waitKey()
# 계층 구조는 윤곽선을 포함 관계의 여부를 나타낸다
외곽 윤곽선, 내곽 윤곽선, 같은 계층 구조를 구별할 수 있다.
* hierarchy.shape = (1, 6, 4)
[[[ 1 -1 -1 -1]
[ 2 0 -1 -1] => hierarchy[0][1]
[ 3 1 -1 -1]
[ 4 2 -1 -1]
[ 5 3 -1 -1]
[-1 4 -1 -1]]]
[다음 윤곽선, 이전 윤곽선, 내곽 윤곽선, 외곽 윤곽선]
* 다음 윤곽, 이전 윤곽 = -1이 아니면 동등한 계층에 있다 <=> -1이면 동등한 계층 없다
* 내곽 윤곽 = 1은 도형 내부에 윤곽선이 있다(내부 도형이 있음)
* 외곽 윤곽 = 0은 내부 도형에서 외곽 윤곽이 있을 때
## cv2.findContours(이진화 이미지, 검색 방법, 근사화 방법)
# 검색 방법Permalink
cv2.RETR_EXTERNAL : 외곽 윤곽선만 검출하며, 계층 구조를 구성하지 x
cv2.RETR_LIST : 모든 윤곽선을 검출하며, 계층 구조를 구성하지 x
cv2.RETR_CCOMP : 모든 윤곽선을 검출하며, 계층 구조는 2단계로 구성
cv2.RETR_TREE : 모든 윤곽선을 검출하며, 계층 구조를 모두 형성. (Tree 구조)
# 근사화 방법Permalink
cv2.CHAIN_APPROX_NONE : 윤곽점들의 모든 점을 반환
cv2.CHAIN_APPROX_SIMPLE : 윤곽점들 단순화 수평, 수직 및 대각선 요소를 압축하고 끝점만 남김
cv2.CHAIN_APPROX_TC89_L1 : 프리먼 체인 코드에서의 윤곽선으로 적용
cv2.CHAIN_APPROX_TC89_KCOS : 프리먼 체인 코드에서의 윤곽선으로 적용
1. cv.imread
2. cv.cvtcolor
3. cv.threshold
4. cv.findcontours
5. 각 contours의 점 cv.drawContours
=> for i in range(len(contour))
'OpenCV > OpenCV-basic' 카테고리의 다른 글
이미지 연산, 배열 정합(addWeighted) (0) | 2021.12.12 |
---|---|
모폴로지 연산(Morphology) (0) | 2021.12.12 |
opencv-VideoCapture, VideoWriter (0) | 2021.12.11 |
opencv-HSV, YCrCb(특정 색 추출) (0) | 2021.12.11 |
opencv-basic (0) | 2021.12.11 |
댓글