기본 콘텐츠로 건너뛰기

6장

고찰(2)
주 성분의 방향성분이 본 특징 지표의 회전 불변성에 미치는 영향을 서술하시오.
-> 주 성분을 0으로 놓고 주 성분을 기준으로 다시 재정렬
디스크립터의 내용을 분석하는 프로그램을 작성하시오.
-> 안 해도 됨.

FAST

- HST : 주변 데이터 4개를 봐서 극점, Corner를 찾는다.
- FST : HST에서 통과된 점에 대해서 주변 데이터 4~16개
- NMS : 가장 큰 것만 남기고 키포인트를 제거한다.

- SLAM : 임베디드에서 사용

-단점
 코너만을 찾지 않기 때문에 에지가 포함될 수도 있다.
 영상을 멀티 스케일로 해석하지 않는다.



HST : 1,5,9,13번 4개 중에 3포인트가 threshold보다 모두 높거나 낮으면..
FST : 점점 늘려가면서..
NMS : 가장 큰 점만..

- cv2.FAST_FEATURE_DETECTOR_TYPE
5_8=62.5%, 7_12=58.3%, 9_16=56% -> 통과될 확률이 아닌 threshold.
(반대로 생각할 것)
9_16 = 56% 대가 임계점. 그래서 키포인트가 가장 많이 나옴.



SURF

- 스케일 변환에 견인하다. 그러나 영상을 스케일링하는 것은 아니고 필터가 커진다.
- 적분 영상을 쓰기 때문에 필터가 커져도 시간 소비가 일어나지 않는다.

- LoG = Laplacian of Gaussian 를 이용한 극점 추출
           (2차 미분)
- 영상 -> Gaussian -> Laplacian -> Log (느림)

2차 미분을 한 가우시안 영상

● 고속화 구현 (Haar Wavelet = Haar like feature)
- 영상 -> LoG filter -> LoG (적분 영상을 이용)
                                     (filter가 커져도 시간 소비가 일어나지 않음)

- LoG 필터로 구성한 Hessian Matrix


어두운 부분은 내려가는 부분, 밝은 부분은 올라가는 부분

↓ 근사화


-영상에 LoG 필터를 적용하는 것이 아니라 LoG 필터를 적분영상에 사용하기 유리하도록 [2x2] 형태로 근사화한 Hessian Blob Detector를 사용한다.

- 키포인트 결정 방법 순서
1) 적분 영상을 이용한 LoG Hessian Matrix 원소의 근사화 연산
2) Blob Response로 판단한다.
3) Scaling 을 변환하여 키 포인트를 검출한다. 
4) Non-Maximum Suppression 

- 적분 영상이 2번(LoG, 방향성분) 쓰인다.

- SIFT와 유사하게 방향성분을 누적하여 주 방향 성분을 결정하고 키포인트의 주 방향을 기본 축으로 고정한 후 이를 중심으로 20x20 영 역을 4x4 개의 서브 영역으로 나누고 각 서브 영역에 대한 Haar Wavelet 의 4개의 주변 방향성분 정보를 저장하는 디스크립터를 생성한다. (적분 영상 사용 불가)

Response = Blob Response
파란색은 임계점을 넘은 것 중 제일 큰 것, 연두색은 임계점을 넘은 것 중 제일 작은 것.


동그라미가 크다는 것은 상층부(옥타브가 높다)에서 검출되었다는 말이다.
동그라미가 작을 수록 하층부(옥타브가 낮다)


ORB(Oriented FAST and Rotated BRIEF)

구성 : Oriented FAST + Rotation of BRIEF

Oriented FAST
- FAST에서는 없는 회전 불변 특징을 지원.
- 방향 성분 검출 : FAST로 발견된 코너를 중심으로 하는 패치에 대해 intensity weighted centroid를 계산한다. 이 코너로부터 centroid(FAST로 검출된 코너)로 향한 방향을 구한다.
ex) 검은색 blob에서 하얀색 blob
- 회전 강인성 : 반지름 r에 있는 원형 패치 영역에 대해 모멘트를 계산한다.

Rotation of BRIEF
- 키포인트의 0차, 1차 모멘트를 이용한 방향성분을 이용해 영상을 회전



Feature Matching


FLANN
대용량 데이터 셋과 고차원의 특징들의 근접값 들을 고속으로 찾아주는 알고리즘 BFMatcher 보다 고속. 10배 이상으로 알려져 있음. 

Homography
한 사진의 한 점이 다른 사진의 한 점에 해당하고 그 반대가 성립하는 두 사진 간의 관계

Homography matrix -> Correlation Coefficient (조도 영향 X)



댓글

이 블로그의 인기 게시물

11004 : K번째 수 [C++]

# include < iostream > # include < cstdio > # include < algorithm > int main ( ) { int * Number = new int [ 5000000 ] ; int N , K ; scanf ( " %d %d " , & N , & K ) ; for ( int i = 0 ; i < N ; i + + ) scanf ( " %d " , Number [ i ] ) ; std :: sort ( Number , Number + N ) ; printf ( " %d " , Number [ K - 1 ] ) ; return 0 ; }

1149 : RGB Street Coloring (Dynamic Programming) [C,C++]

The key to this problem lies in understanding the principles. Let me explain the algorithm to solve the problem by using DP. First, you need the same storage space like input data's size. When you draw any color of the nth house, the space will contain the minimum value. If you paint the red in the second house, this value is sum of blue or green of the first house.  You must use DP because you must use the previous value.  Of course, you can also use the recursive algorithm to solve it. But if it gets bigger, it will take a lot of time.  If you paint the red in the nth house in the same way, you should add the lower value of the blue and green of the n-1th house.  Therefore, the minimum value can be found in the value of the storage space (n-1) index. <pesudo code> *Source of the problem =  https://www.acmicpc.net/problem/1149 *문제 출처 : BAEKJOON ONLINE JUDGE

11478 : 서로 다른 부분 문자열의 개수 (미제) [C++]

# include < iostream > # include < vector > # include < string > using namespace std ; int main ( ) { string sInput ; getline ( cin , sInput , '\n' ) ; int Time = 1 ; int Count = 0 ; vector < string > Storage ; for ( int i = 0 ; i < sInput . size ( ) ; i + + ) { for ( int j = 0 ; ( j + Time - 1 ) < sInput . size ( ) ; j + + ) Storage . push_back ( sInput . substr ( j , Time ) ) ; Time + + ; } bool * Visited = new bool [ Storage . size ( ) * sizeof ( bool ) ] ; for ( int i = 0 ; i < Storage . size ( ) ; i + + ) { Visited [ i ] = true ; for ( int j = 0 ; j < Storage . size ( ) ; j + + ) { if ( i ! = j & & Storage [ i ] = = Storage [ j ] ) { Visited [ i ] = false ; Visited [ j ] = true ; break ; } } } for ( int i = 0 ; i < Storage . size ( ) ; i + + ) if ( Visited [ i ] ) Count ...