특징점 매칭은 특징점을 검출하고 특징점 주변의 정보(기술자)를 통해서 매칭한다.
기술자는 서로 다른 영상에서 특징점이 어떤 연관성을 가졌는지 구분하게 하는 역할을 한다.
기술자는 검출된 특징점 근방의 영상을 표현하는 실수 또는 이진 벡터이다. 영상의 방향, 밝기, 크기, 색상 등을 표현한다.
기술자는 특징 벡터로 표현하는데 행은 특징점의 개수, 열은 특징점 알고리즘에 의해 다르게 정의된다.
위의 경우 KAZE 특징 검출 방법으로 3159개의 특징점을 검출하였고 64개로 특징점을 표현하였다. 특징점의 자료형은 float32이다.
이러한 특징점을 표현하는 기술자는 2가지 방식이 있는데 실수 기술자와 이진 기술자가 있다.
실수 기술자는 실수값으로 기술자를 표현하며 실수 자료형을 사용하여 특징점 주변의 정보를 저장한다.
실수 기술자를 사용하는 알고리즘은 SIFT, SURF, KAZE 등이 있으며 보통 NORM_L2 를 사용하여 유사도를 판단한다.
특징점 부근의 적절한 크기의 부분 영상을 추출한다. 이 부분 영상을 16 x 16으로 분할하고 그레디언트 방향 성분에 대한 히스토그램을 계산한다.
방향 히스토그램을 4 x 4 단위로 모아서 8개 방향으로 표현한다.
이진 기술자는 보통 uint8 자료형을 이용하여 비트 단위로 영상 특징 정보를 저장한다.
이진 기술자를 사용하는 알고리즘은 AKAZE, ORB, BRIEF 등이 있으며 NORM_HAMMING 를 사용하여 유사도를 판단한다.
특징점 주변 부분 영상에 미리 정의해둔 점을 비교한다.
1번 2번 3번 점의 영상 밝기를 비교해서 0과 1로 표현한다. ( ex) [ 1 0 1 ] )
- BFMatcher ( Brute-Force Matcher )
- FLannBasedMatcher ( Fast Library for Approximate Nearest Neighbors Matching )
특징 매칭이란
서로 다른 두 이미지에서 특징점과 특징 디스크럽터를 비교해서 비슷한 객체끼리 짝짓는 것이다.
특징 매칭기는 두 개의 디스크립터를 서로 비교하여 매칭해주는 함수를 갖는다. 3개의 함수가 있는데 match, knnMatch, radiusMatch 이다. 이 함수들은 첫번째 파라미터인 queryDescriptors를 기준으로 두번째 파라미터인 trainDescriptors에 맞는 매칭을 찾아서 반환한다.
match는 queryDescriptors 한개당 최적의 매칭을 이루는 trainDescriptors를 찾아 결과로 반환한다. 그러나 최적 매칭을 찾지 못하는 경우도 있기 때문에 반환되는 매칭 결과 개수가 queryDescriptors의 개수보다 적을 수도 있다.
knnMatch 는 queryDescriptors 한 개당 k개의 최근접 이웃 개수만큼 trainDescriptors에서 찾아 반환한다. k 개의 최근접 이웃 개수만큼이란 가장 비슷한 k개만큼 매칭값을 반환한다는 뜻이다.
위 함수의 반환 결과는 DMatch 객체로 매칭 결과를 표현한다.
queryIdx : queryDecriptors의 인덱스
trainIdx : trainDescriptors의 인덱스
imgIdx : trainDescriptor의 이미지 인덱스
distance : 유사도 거리
queryIdx와 trainIdx로 두 이미지의 어느 지점이 서로 매칭되었는지 알 수 있다. 또한 distance로 얼마나 가까운 거리인지도 알 수 있다.
거리측정 알고리즘
세가지 유클리드 거리 측정법과 두가지 해밍 거리 측정법 중에 선택할 수 있다.
SIFT와 SURF 디스크립터 검출기의 경우 NORM_L1, NORM_L2가 적합하고
ORB 디스크럽터 검출기의 경우 NORM_HAMMING이 적합하다. NORM_HAMMING2의 경우ORB의 WTA_K가 3 혹은 4일 때 적합하다.
기준 이미지의 특징점 하나와 또 다른 이미지의 특징점들을 모두 비교해 가장 유사한 것이 동일한 특징점이라고 판별한다.
BFMatcher는 모든 디스크럽터를 전수 조사하므로 이미지 사이즈가 클 경우 속도가 굉장히 느리다. 하지만 FLANN은 모든 디스크럽터를 전수 조사하기 보다 이웃하는 디스크럽터끼리 비교한다. 이웃하는 디스크럽터를 찾기 위해 FLANN 알고리즘 함수에 인덱스 파라미터와 검색 파라미터를 전달해 줘야한다.
인덱스 파라미터로 indexParams를, 검색파라미터로 searchParams를 전달받는다.
인덱스 파라미터
FLANN_INDEX_LINEAR : 선형 인덱싱, BFMatcher와 동일
FLANN_INDEX_KDTREE : KD - 트리 인덱싱 ( tree=4 : 트리의 개수 ( 16을 권장 ) )
FLANN_INDEX_KMEANS : K - 평균 트리 인덱싱 ( branching=32 : 트리 분기 개수, iterations=11: 반복 횟수, centers_init=0: 초기 중심점 방식 )
FLANN_INDEX_COMPOSITE=3: KD-트리, K-평균 혼합 인덱싱 ( trees=4: 트리 개수, branching=32: 트리 분기 새수, iterations=11: 반복 횟수, centers_init=0: 초기 중심점 방식 )
FLANN_INDEX_LSH=6: LSH 인덱싱 (t able_number: 해시 테이블 수, key_size: 키 비트 크기, multi_probe_level: 인접 버킷 검색 )
FLANN_INDEX_AUTOTUNED=255:자동 인덱스 ( target_precision=0.9: 검색 백분율, build_weight=0.01: 속도 우선순위, memory_weight=0.0: 메모리 우선순위, sample_fraction=0.1: 샘플 비율 )
검색파라미터