SIFT特征检测、最近邻近似匹配、2NN优化

import math
from matplotlib import pyplot as plt
import matplotlib
%matplotlib inline

book_l = cv2.imread('./images/book_l.png')
book_r = cv2.imread('./images/book_r.png')

# sift算子
gray1 = cv2.cvtColor(book_l, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(book_r, cv2.COLOR_BGR2GRAY)
maxcorners = 1000
# 特征点检测计算描述子
sift = cv2.xfeatures2d_SIFT.create(nfeatures=maxcorners)
kp1, descriptors1 = sift.detectAndCompute(gray1,None)
kp2, descriptors2 = sift.detectAndCompute(gray2,None)
# 最近邻近似匹配
FBMatcher = cv2.FlannBasedMatcher()
matches = FBMatcher.knnMatch(descriptors1, descriptors2, k=2)
# 2nn匹配优化
good = [[m] for m, n in matches if m.distance < 0.4 * n.distance]
img3 = cv2.drawMatchesKnn(book_l, kp1, book_r, kp2, good, None, flags=2)

plt.imshow(img3)
cv2.imshow('matched', img3)
cv2.waitKey(1000)
cv2.imwrite("./images/sift.png", img3)
cv2.destroyAllWindows()

效果


最近邻近似匹配FlannBasedMatcher的匹配速度要比暴力匹配BFMatcher的速度要快,但是匹配效果会比较低,因此使用2nn优化、根据最临近m和此临近n之间如果满足m

你可能感兴趣的:(计算机视觉,SIFT)