BFMatcher는 특징 디스크립터를 전수 조사하는 것이 특징이며, cv2.BFMatcher()를 사용할 때 상호 매칭까지 하게 되면 작업 속도가 느리다는 단점이 있다.

 

[OpenCV Programming] 디스크립터(Descriptor)

특징을 나타내는 값을 매칭하기 위해서는 회전이나 크기 등에 영향이 없어야 하며, 이를 위해서는 feature descriptor(특징 디스크립터)가 필요하다. 특징 디스크립터는 keypoint의 주변의 밝기나 색상

dsbook.tistory.com

 

이를 개선한 것이 FLANN(Fast Library for Approximate Nearest Neighbors Matching)이다. FLANN은 가장 가까운 이웃의 근사 값으로 매칭을 수행하며, Machine Learning의 KNN과 유사하다.

import cv2
import numpy as np

img1 = cv2.imread('lion.jpg')
img2 = cv2.imread('image.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

orb = cv2.ORB_create(50)

keypoint1, descriptor1 = orb.detectAndCompute(gray1, None)
keypoint2, descriptor2 = orb.detectAndCompute(gray2, None)

# INDEX PARAMETER 설정
# algorithm 6 : FLANN_INDEX_LSH
index = dict(algorithm = 6, table_number = 6, key_size = 12, multi_probe_level = 1)

# Search PARAMETER 설정
search = dict(checks = 32)

# FLANN matcher 생성
matcher = cv2.FlannBasedMatcher(index, search)
match = matcher.match(descriptor1, descriptor2)

draw = cv2.drawMatches(img1, keypoint1, img2, keypoint2, match, None, flags = cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS)

cv2.imshow('FLANN & ORB', draw)
cv2.waitKey()
cv2.destroyAllWindows()

cv2.FlannBasedMatcher()로 FLANN Matcher를 생성하며, 인자는 index parameter와 search parameter를 사용한다. 이전 함수와는 달리, 딕셔너리 형태로 인자를 사용해야 한다는 점에서 차이를 가진다. index parameter는 알고리즘 선택 키로, 선택한 알고리즘에 따라 종속 키가 결정된다. index parameter의 종류는 다음과 같다.

 

0 : FLANN_INDEX_LINEAR; 선형 indexing
1 : FLANN_INDEX_KDTREE; KD Tree indexing
  - trees = 4(default); tree 개수
2 : FLANN_INDEX_KMEANS; K 평균 Tree indexing
  - brancing = 32; tree 분기 개수
  - iterations = 11; 반복 횟수
  - centers_init = 0; 초기 중심점
3 : FLANN_INDEX_COMPOSITE; KD tree와 K 평균 mixed indexing
  - trees = 4
  - branching = 32
  - iterations = 11
  - centers_init = 0
6 : FLANN_INDEX_LSH; LSH indexing
  - table_number; hash table 수
  - key_size; key 비트 크기
  - multi_probe_level; 인접한 버킷 검색
25 : FLANN_INDEX_AUTOTUNED; 자동 index
  - target_precision = 0.9; 검색 백분율
  - build_weight = 0.01; 속도 우선순위
  - memory_weight = 0; memory 우선순위
  - sample_fraction = 0.1; sample 비율

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기