파이썬으로 opencv를 간단하게 공부하기로 결심했다. 굳이 공부하는 이유를 들자면 그림인식이나
캡챠인식 문제가 이곳저곳 워게임에서 많이 나오는데, 그냥 풀고 싶어서이다. 또 코딩으로 풀면
실력도 적절히 늘어날것 같아서.(배워두면 언젠가는 쓰겠지. )
python opencv에 대해서는 저번에 글을 썼었는데, http://qkqhxla1.tistory.com/228
내 생각에 저 기본 예제 코드만 이해할수있으면 그림 인식이나 복잡한 숫자 인식도 가능하다고 생각한다. (아니면 뭐....) 그래서 저 예제 코드를 이해하는 방향으로 튜토리얼 에서 함수들을 하나하나 직접 실험해보면서 익힐 생각이다..
cv2.cvtColor(image, flag) 접기
cv2.cvtColor(image, flag)
이미지의 모드 를 flag에 따라서 바꿔주는 거라고 한다. BGR<->GRAY BGR<->HSV등으로 바꿔준다.
cv2.COLOR_BGR2GRAY 라는 flag를 쓰면 해석 그대로 BGR에서 GRAY로 바꿔준다. 다른 flag를 알아보려면
>>> import cv2
>>> flags = [ i for i in dir ( cv2 ) if i . startswith ( 'COLOR_' )]
>>> print flags 이 코드를 쓰면 된다고 한다. 그런데 BGR, HSV이런게 뭔가? 했더니 색조 관련된거라고한다.
http://blog.naver.com/tramper2/100058177432 솔직히 뭔소린지 모르겠다. 그냥 이런게 있구나...
접기
cv2.GaussianBlur() 접기
cv2.GaussianBlur()
가우시안 필터링을 해주는 함수라고 하는데, 가우시안 필터링은 이미지에서 가우시안 노이즈를 지우는데 매우 효과적이라고 한다. 가우시안 잡음이란 일반적인 이미지에서의 잡음이라고 한다.
아래의 blur = cv2.GaussianBlur(img,(1,1),0) 처럼 쓰는데 내부의 인자는 변경해봐도 무슨 차이가 있는지 모르겠다. 중간의 튜플은 값을 크거나 작게 하면 에러도 발생시킨다. 튜로리얼에서는 오차 범위? 라는데 그냥 저렇게 계속 써도 될것 같다. 아래 코드를 실행시켜보면 원래의 이미지에서 부드럽게 변화된걸 확인할수 있다.
#-*- coding: cp949 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('opencv_logo.png')
blur = cv2.GaussianBlur(img,(1,1),0)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(blur),plt.title('Blurred')
plt.xticks([]), plt.yticks([])
plt.show()
접기
cv2.adaptiveThreshold() 접기
cv2.adaptiveThreshold( )
인자로 바로 위의 GaussianBlur의 인스턴스가 들어가는데, 이걸 이용해서 적용하는것같다.
중간쯤에 스도쿠로 4가지 그림이 나오는데, 맨 마지막의 가우시안 쓰레스홀딩을 적용한것만 살펴봐도 될것같다. 나머지 인자는 건드리지 않아도 될것같다...
접기 cv2.findContours() 접기
cv2.findContours()
Contours란 물체의 윤곽선? 같은거라고 한다. 주의점으로 물체의 Contours(윤곽선)을 찾는 건 검은색의 바탕화면에서 흰색의 물체를 찾는거라고 한다. 검은색의 바탕화면과 흰색의 물체라는걸 꼭 지키라고 한다. 아직 내 레벨에서는 인자는 건드릴 필요가 없는거같다.
출력은 contours,hierarchy 인데, contours는 이미지의 윤곽선이 저장되어 있는 파이썬 리스트라고 하고, 각각의 contours는 물체의 경계선의 좌표(x,y) 라고 한다.(numpy array로 이루어졌다고함.)
hierarchy는 나중에 다룬다고 했는데 예제 소스에서도 hierarchy는 받기만 하고 쓰지는 않으므로 딱히 찾아가서 뭔지 알아보지는 않음.
접기
contourArea() 접기
contourArea()
이 함수는 인자로 위의 findContours()에서 반환된 Contours의 하나를 받으며, 범위를 보여주는거라고 한다. 자세한 설명이 없다.
접기
cv2.boundingRect() 접기
cv2.boundingRect()
x , y , w , h = cv2 . boundingRect ( cnt )
img = cv2 . rectangle ( img ,( x , y ),( x + w , y + h ),( 0 , 255 , 0 ), 2 ) 이 코드로 설명 되있는데, 인자로 받은 cnt가 Contours의 하나인걸 보면 윤곽선에 대해서 사각형을 매치시키는것같다. 자세한 설명이 없는걸로 보아 찾아낸 윤곽선에 대해서 사각형을 연결하고, 아래의 rectangle함수로 사각형을 그리는것 같다.
접기
cv2.resize()
말그대로 크기를 변경하는것 같다.
cv2.knearest() 접기
cv2.knearest()
찾아도 이것만 따로 설명된게 없는데, 어떤 Nearest Neighbour algorithm? 라는 알고리즘을 쓰는 것 같다. 무슨 탐색 알고리즘같은데.... 뭐 그냥 필요한거라고만 알고있어야지...
http://en.wikipedia.org/wiki/Nearest_neighbour_algorithm
접기