개발 공부

11강 본문

AI/AI_Python_OPENCV 기초

11강

아이셩짱셩 2018. 8. 9. 13:31

#이미지의 경계선을 찾아보자

# 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)


'AI > AI_Python_OPENCV 기초' 카테고리의 다른 글

10강  (0) 2018.08.09
9강  (0) 2018.08.09
8강  (0) 2018.08.09
7강  (0) 2018.08.09
6강  (0) 2018.08.07
Comments