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()
'ComputerVision' 카테고리의 다른 글
OpenCV_week09 Feature Detection_SIFT(scale-invariant-feature transform) (0) | 2021.05.03 |
---|---|
OpenCV_week09 Feature Detection_Shi-Tomasi Corner Detection & Good Featur to Track (0) | 2021.05.03 |
OpenCV_week07(DFT, Tamplate Matching) (0) | 2021.04.15 |
OpenCV_week06(histogram, histBackProjection, DFT, FFT) (2) | 2021.04.13 |
OpenCV_week05(contours, image pyramid) (0) | 2021.04.13 |