개발 공부
11강 본문
#이미지의 경계선을 찾아보자
# Import the necessary packages
import numpy as np
import argparse
import cv2
image = cv2.imread('coin.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (11, 11), 0)
cv2.imshow("Image", image)
# The first thing we are going to do is apply edge detection to
# the image to reveal the outlines of the coins
edged = cv2.Canny(blurred, 30, 150)
cv2.imshow("Edges", edged)
# Contours란 동일한 색 또는 동일한 강도를 가지고 있는 영역의 경계선을 연결한 선입니다. 우리가 자주 보는 것으로는 등고선이나 일기예보에서 볼 수 있습니다.
# cv2.findContours는 이런 경계선을 찾는 함수입니다.
#edged.copy()는 원복이미지를 복사해서 쓴다는 의미입니다. 이 함수는 원본 이미지를 변경시켜 버립니다. 다시 사용할 이미지라면 이렇게 복사해서 사용합니다.
# 두번째는 경계선 찾는 방법입니다.
# cv2.RETR_EXTERNAL : contours line중 가장 바같쪽 Line만 찾음.
# cv2.RETR_LIST : 모든 contours line을 찾지만, hierachy 관계를 구성하지 않음.
# cv2.RETR_CCOMP : 모든 contours line을 찾으며, hieracy관계는 2-level로 구성함.
# cv2.RETR_TREE : 모든 contours line을 찾으며, 모든 hieracy관계를 구성함.
#세번째는 근사치를 찾는 방법입니다,.
# cv2.CHAIN_APPROX_NONE : 모든 contours point를 저장.
# cv2.CHAIN_APPROX_SIMPLE : contours line을 그릴 수 있는 point 만 저장. (ex; 사각형이면 4개 point)
# cv2.CHAIN_APPROX_TC89_L1 : contours point를 찾는 algorithm
# cv2.CHAIN_APPROX_TC89_KCOS : contours point를 찾는 algorithm
#contours, hierachy 두가지 정보를 출력하는데 cnts는 경계선 정보를 담고 있다.
#(cnts, _)보면 3가지 값이 나와야 하는데 cnts만 받았다. 두번째 _는 다른 값은 무시하라는 파이션 표기 방법이다.
(_,cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# How many contours did we find?
print ("I count %d coins in this image" % (len(cnts)))
# cv2.drawContours는 그려진 결과값입니다.
#(이미지, 경게선 정보-위의 cnts, 몇번째 경계선을 그릴 것인지이며 -1은 전체다, 경계선색, 두께)
coins = image.copy()
cv2.drawContours(coins, cnts, -1, (0, 255, 0), 2)
cv2.imshow("Coins", coins)
cv2.waitKey(0)
# 이제 한번 경게선 수만큼 돌려 보자
#enumerate는 for문과 함께 자주 사용되며 순서가 있는 자료형(리스트, 튜플, 문자열)을 입력으로 받아 인덱스 값을 포함하는 enumerate 객체를 리턴한다.
for (i, c) in enumerate(cnts):
# cv2.boundingRect는 가로 세로 크기를 구합니다.
(x, y, w, h) = cv2.boundingRect(c)
# Now that we have the contour, let's extract it using array
# slices
print ("Coin #%d" % (i + 1))
coin = image[y:y + h, x:x + w]
cv2.imshow("Coin", coin)
cv2.waitKey(0)