特征匹配

1、暴力匹配器

# coding=utf-8
import cv2
import numpy as np

img1 = cv2.imread('img/test1.png')
img2 = cv2.imread('img/test12.png')

#最大特征点数,可以根据需要设置,如5000或100。
orb = cv2.ORB_create(100)

kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

# 获得一个暴力匹配器的对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 利用匹配器 匹配两个描述符的相近
maches = bf.match(des1, des2)
# 按照相近程度 进行排序
maches = sorted(maches, key=lambda x: x.distance)
# 画出匹配项
img3 = cv2.drawMatches(img1, kp1, img2, kp2, maches[: 30], img2, flags=2)

cv2.imshow("matches", img3)
cv2.waitKey()
cv2.destroyAllWindows()

2、FLANN匹配器

FLANN 是快速最近邻搜索包(Fast_Library_for_Approximate_Nearest_Neighbors)的简称。它是一个对大数据集和高维特征进行最近邻搜索的算法的集合,而且这些算法都已经被优化过了。在面对大数据集时它的效果要好于BFMatcher。

mport cv2
from matplotlib import pyplot as plt

queryImage = cv2.imread('img/test1.jpg', 0)
trainingImage = cv2.imread('img/test2.jpg', 0)

#SIFT特征检测器

sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(queryImage, None)
kp2, des2 = sift.detectAndCompute(trainingImage, None)

#FLANN匹配器的两个参数,indexParams和searchParams

FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
searchParams = dict(checks=50)     #遍历次数

flann = cv2.FlannBasedMatcher(indexParams, searchParams)



matches = flann.knnMatch(des1, des2, k=2)

matchesMask = [[0, 0] for i in range(len(matches))]

for i, (m, n) in enumerate(matches):
    if m.distance < 0.7 * n.distance:
        matchesMask[i] = [1, 0]

drawParams = dict(matchColor=(0, 255, 0),
                  singlePointColor=(255, 0, 0),
                  matchesMask=matchesMask,
                  flags=0
                  )
resultImage = cv2.drawMatchesKnn(queryImage, kp1, trainingImage, kp2, matches, None, **drawParams)
plt.xticks([]), plt.yticks([])
plt.imshow(resultImage), plt.show()


 

猜你喜欢

转载自blog.csdn.net/niuniu0243111006/article/details/89388580