BFMatcher는 특징 디스크립터를 전수 조사하는 것이 특징이며, cv2.BFMatcher()를 사용할 때 상호 매칭까지 하게 되면 작업 속도가 느리다는 단점이 있다.
이를 개선한 것이 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 비율
'데이터 분석 & 시각화 > OpenCV' 카테고리의 다른 글
[OpenCV Practice 09 - 2] 이미지 변형 (Rotation, Affine, Perspective) (2) | 2020.08.29 |
---|---|
[OpenCV Practice 09 - 1] 이미지 변형 (Scaling, Translation) (0) | 2020.08.29 |
[OpenCV Programming] 객체 추적 2 (0) | 2020.08.26 |
[OpenCV Practice 08] 이미지 임계값 처리 Image Thresholding (0) | 2020.08.21 |
[OpenCV Programming] 객체 추적 1 (0) | 2020.08.20 |
최근댓글