如何在OpenCV Python中实现基于FLANN的特征匹配?


我们使用尺度不变特征变换 (SIFT) 和FLANN (快速近似最近邻库) 来实现两幅图像之间的特征匹配。SIFT 用于查找特征关键点和描述符。基于FLANN 的knn匹配器用于匹配两幅图像中的描述符。我们使用cv2.FlannBasedMatcher() 作为基于FLANN 的匹配器。

步骤

要使用SIFT特征检测器和基于FLANN的匹配器实现两幅图像之间的特征匹配,您可以按照以下步骤操作:

  • 导入所需的库OpenCV、MatplotlibNumPy。确保您已安装它们。

  • 使用cv2.imread()方法读取两幅输入图像为灰度图像。指定图像的完整路径。

  • 使用sift=cv2.SIFT_create()初始化具有默认值的SIFT对象。

  • 使用sift.detectAndCompute()检测并计算两幅输入图像中的关键点'kp1'和'kp2'以及描述符'des1'和'des2'。

  • 创建一个基于FLANN的匹配器对象flann = cv2.FlannBasedMatcher(),并使用flann.knnMatch(des1,des2,k=2)匹配描述符。它返回匹配项。对匹配项应用比率测试以获得最佳匹配项。使用cv2.drawMatchesKnn()绘制匹配项。

  • 可视化关键点匹配。

让我们来看一些使用SIFT特征检测器和基于FLANN的匹配器匹配两幅图像的关键点的示例。

输入图像

我们在下面的示例中使用以下图像作为输入文件。



示例

在这个示例中,我们使用SIFT算法检测两幅输入图像的关键点和描述符,并使用带knn基于FLANN的匹配器匹配描述符。我们还应用比率测试来仅查找良好的匹配项。我们还绘制关键点和匹配项。

# import required libraries import numpy as np import cv2 from matplotlib import pyplot as plt # read two input images img1 = cv2.imread('car.jpg',0) img2 = cv2.imread('car-rotated-crop.jpg',0) # Initiate SIFT detector sift = cv2.SIFT_create() # find the keypoints and descriptors with SIFT kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) # FLANN parameters FLANN_INDEX_KDTREE = 0 index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5) search_params = dict(checks=50) # or pass empty dictionary # apply FLANN based matcher with knn flann = cv2.FlannBasedMatcher(index_params,search_params) matches = flann.knnMatch(des1,des2,k=2) # Need to draw only good matches, so create a mask matchesMask = [[0,0] for i in range(len(matches))] # ratio test as per Lowe's paper for i,(m,n) in enumerate(matches): if m.distance < 0.1*n.distance: matchesMask[i]=[1,0] draw_params = dict(matchColor = (0,255,0),singlePointColor = (255,0,0),matchesMask = matchesMask,flags = 0) img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,matches,None,**draw_params) plt.imshow(img3),plt.show()

输出

运行上述Python程序时,它将生成以下输出窗口:


更新于:2022年12月5日

4K+ 次浏览

启动您的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.