윈도우(일정 범위)를 모든 방향으로 이동시키며 픽셀의 강도 변화를 측정함으로써 윈도우 내의 특징을 발견할 수 있다.
평평한 영역에서는 모든 방향으로 픽셀 강도 변화가 없다.
에지에서는 에지의 방향따라 픽셀 강도 변화가 없고 에지와 수직방향으로 픽셀 강도 변화가 있다.
코너에서는 모든 방향에 대해 강한 픽셀 강도 변화가 존재한다.
윈도우내의 좌표(x,y)에 있는 픽셀 강도와 (u,v)만큼 윈도우를 시프트 시켰을때 픽셀 강도의 변화량은 다음 식으로 측정한다.
Window function은 직사각형 윈도우이거나 가우시안 윈도우를 사용하며 윈도우 아래의 픽셀들에 가중치를 주는 용도로 사용되어 진다.
평평한 영역에서는 강도 변화가 거의 없기 때문에 위 식은 0에 가까울 것이다.
특징을 추출할 수 있는 것들이 많은 영역에서는 강도 변화가 크기 때문에 위 식은 매우 큰 값을 가지게 될것이다.
따라서 코너를 검출하기 위해 E( u, v )를 최대화하는 영역을 찾으면 된다.
위 식에 테일러 전개를 적용하면 아래 식과 같아진다.
Ix와 Iy는 각각 x와 y방향으로 소벨에지를 구하여 얻어지며 IxIx는 같은 좌표의 픽셀값끼리 곱하여
해당 위치에 값을 기록함으로써 얻어진다.
IxIx는 x방향으로 강도 변화를 크게하고 IyIy는 y방향의 강도변화를 크게하고 IxIy는 x,y방향으로의 강도변화를 크게한다.
아래 이미지는 전체 이미지에 대해 각각 Ix, Iy를 구하여 곱을 구한 결과물이다.
아래 식은 코너가 윈도우에 포함되어 있는지 판단하기 위해 사용되어 진다.
M에 대한 고유값에의해서 R값이 달라지며 코너,에지,평면인지 여부를 결정하게 된다.
R이 threshold값보다 크면 코너로 판단하게 된다.
Harris Corner Detector in OpenCV
- import cv2
- import numpy as np
- image = cv2.imread('line.jpg')
- img_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
- img_gray = np.float32(img_gray)
- dst = cv2.cornerHarris( img_gray, 2, 3, 0.04 )
- image[dst>0.01*dst.max()] = [0,0,255]
- cv2.imshow('dst', image)
- cv2.waitKey(0)
'OpenCV > OpenCV 강좌' 카테고리의 다른 글
openCV 라벨링 예제 ( connectedComponentsWithStats ) (65) | 2015.11.19 |
---|---|
opencv 튜토리얼 - hough line transform (3) | 2015.11.16 |
opencv python - K-Means Clustering (3) | 2015.11.10 |
opencv python - 극좌표를 이용하여 방사형으로 라인 그리기 (0) | 2015.11.07 |
허프라인(HoughLine) 태스트 (9) | 2015.10.23 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!