万事找到入门很重要,图像识别也不例外,不过这个例子的drawMatchesKnn就像是封装好的一样,Python语言和C#等其它语言是一样的。
import cv2 from matplotlib import pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 """ FLANN是类似最近邻的快速匹配库 它会根据数据本身选择最合适的算法来处理数据 比其他搜索算法快10倍 """ # 按照灰度图片读入 img1 = cv2.imread("biaoge.jpg",cv2.IMREAD_GRAYSCALE)#导入灰度图像 img2 = cv2.imread("yinzhang.jpg",cv2.IMREAD_GRAYSCALE) # 创建sift检测器 sift = cv2.SIFT_create()#.xfeatures2d # 查找监测点和匹配符 kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) """ keypoint是检测到的特征点的列表 descriptor是检测到特征的局部图像的列表 """ # 获取flann匹配器 FLANN_INDEX_KDTREE = 0 # 参数1:indexParams # 对于SIFT和SURF,可以传入参数index_params=dict(algorithm=FLANN_INDEX_KDTREE, trees=5)。 # 对于ORB,可以传入参数index_params=dict(algorithm=FLANN_INDEX_LSH, table_number=6, key_size=12)。 indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5) # 参数2:searchParams 指定递归遍历的次数,值越高结果越准确,但是消耗的时间也越多。 searchParams = dict(checks=50) # 使用FlannBasedMatcher 寻找最近邻近似匹配 flann = cv2.FlannBasedMatcher(indexParams, searchParams) # 使用knnMatch匹配处理,并返回匹配matches 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.4*n.distance: # 通过0.7系数来决定匹配的有效关键点数量 matchesMask[i] = [1, 0] drawPrams = dict(matchColor=(0, 255, 0), singlePointColor=(255, 0, 0), matchesMask=matchesMask, flags=0) # 匹配结果图片 img33 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams) plt.figure(figsize=(10,10)) plt.title('FLANN法',fontsize=12,color='r') plt.imshow(img33) plt.axis('off') plt.show() cv2.waitKey(0) cv2.destroyAllWindows()