728x90

1) 특징에 대해 이해하기 

 

- A, B 는 평평한 면이고 이 건 넓은 영역에 걸쳐져 있어서 찾기가 매우 어렵다.

- C, D는 빌딩의 엣지들이고 비슷한 위치를 찾을 수 있지만 정확한 위치는 추출하기 어렵다.

- E, F 는 어떤 빌딩의 코너다 이 코너는 찾기가 매우 쉽다  

-----> 그래서 앞으로 코너를 검출함으로써 특징을 탐지하고 추적하는 것을 공부 할 예정.

 

 - 어떻게 코너를 찾을 것인가?

-----> 직관적인 방법으로는 짧은 거리에서 최대한의 변화를 가진 이미지의 영역을 찾는다, 이를 Feature Detection이라고 한다


2) Harris Corner Detection

   2-1) cv2.cornerHarris (img, blockSize, ksize, k)   

  • img - 입력 이미지이고, 흑백스케일에 float32형태여야한다.
  • blockSize - 모서리 탐지를 위한 고려될 이웃 픽셀의 크기를 말한다.
  • ksize - 미분에 사용될 커널 사이즈
  • k - 방정식에서 나온 검출식에서의 k 

모서리가 모든 방향의 Variation 의 강도가 큰 이미지의 영역이다.

 

먼저 , 기본적으로(u,v) 변위(위치변화)에 대한 강도의 변화를 찾는다.

 

모든방향에 대해서 이는 아래와 같이 표현될 수 있다.

위 식은 테일러급수 확장에 의해 아래 식이 된다.

 

위와 같은 식을 행렬곱으로 나타낸다면, 아래 식이 된다 

위 식을 다시 정리하면  M은 아래 식과 같은데 Ix, Iy는 이미지의 x, y 방향으로의 미분값인데 sobel()필터 를 써서 쉽게 구할 수 있다.

최종적으로 얻어온 위치변화에 대한 강도 변화값은 다음과 같다

이렇게 얻어진 식을 가지고 이미지가 코너를 포함하고 있는지 아닌지에 대해 결정한다

(람다값은 행렬의 고유값을 나타낸다.)

 

- |R| 값이 작을경우 λ1, λ2 값이 둘 모두 작으므로  해당 영역은 평면이다.

- |R|<0 일 경우 λ1또는 λ2값 둘 중 하나가 압도적으로 큼으로 해당 영역은 edge다.

- |R|값이 매우 클 때 λ1, λ2 값 둘 모두 크다는 의미 이므로  λ1~ λ2 영역은 코너다!

import numpy as np
import cv2 
img = cv2.imread('checkerboard.jpg')
# img = cv2.imread('blox.jpg')

#cornerHarris()에 들어갈 입력 이미지는 GrayScale에 float32형태여야 한다.
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv2.cornerHarris(gray,2,3,0.04) #입력 영상, 
# img - 입력 이미지이고, 흑백스케일에 float32형태여야한다.
# blockSize - 모서리 탐지를 위한 고려될 이웃 픽셀의 크기를 말한다.
# ksize - 미분에 사용될 커널 사이즈
# k - 방정식에서 나온 검출식에서의 k 

#result is dilated for marking the corners, not important
dst = cv2.dilate(dst,None) 

# Threshold for an optimal value, it may vary depending on the image.
img[dst>0.01*dst.max()]=[0,0,255] #이미지에서 dst값이 최대 dst픽셀값 x 0.01보다 큰 부분은  빨간색으로 칠한다. 
cv2.imshow('dst',img)
if cv2.waitKey(0) & 0xff == 27:
    cv2.destroyAllWindows()

 

728x90

+ Recent posts