【Python+OpenCV】特征点匹配之cv2.FlannBasedMatcher

本文详细介绍了FLANN(Fast Library for Approximate Nearest Neighbors)匹配器的基本概念、使用方法及参数设置,并通过实例展示了如何利用FLANN进行图像特征点匹配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

广告位:

图像拼接论文精读专栏 —— 图像拼接领域论文全覆盖(包含数据集),省时省力读论文,带你理解晦涩难懂的论文算法,学习零散的知识和数学原理,并学会写图像拼接领域的论文(介绍、相关工作、算法、实验、结论、并附有参考文献,不用一篇一篇文章再找)

图像拼接论文源码精读专栏 —— 图像拼接有源码的论文全覆盖(有的自己复现),帮助你通过源码进一步理解论文算法,助你做实验,跑出拼接结果,得到评价指标RMSE、SSIM、PSNR等,并寻找潜在创新点和改进提升思路。

超分辨率重建专栏 —— 从SRCNN开始,带你读论文,写代码,复现结果,找创新点,完成论文。手把手教,保姆级攻略。帮助你顺利毕业,熟练掌握超分技术。

图像去噪专栏 —— 从DnCNN开始,100个经典的基于深度学习的图像去噪算法。读懂论文,看懂代码,复现结果,寻找创新,新手小白入门,保姆级攻略。帮助你顺利毕业,实现目标。

关注文章最底部微信公众号【十小大的底层视觉工坊】,获取最精炼版论文解读!

有需要的同学可以点上面链接看看。



Flann简介

Flann(Fast_Library_for_Approximate_Nearest_Neighbors):快速最近邻搜索库,应该是目前OpenCV中封装的用于特征匹配的最好的匹配器了。

函数原型

import cv2

flann = cv2.FlannBasedMatcher(index_params, search_params)

参数及返回值说明:

  • index_params:字典类型,字典中的值是所选算法参数。如:选择随机kd树,平行搜索
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)

可选算法如下:

FLANN_INDEX_LINEAR = 0
FLANN_INDEX_KDTREE = 1
FLANN_INDEX_KMEANS = 2
FLANN_INDEX_COMPOSITE = 3
FLANN_INDEX_KDTREE_SINGLE = 4
FLANN_INDEX_HIERARCHICAL = 5
FLANN_INDEX_LSH = 6
FLANN_INDEX_SAVED = 254
FLANN_INDEX_AUTOTUNED = 255

由算法参数都是大写可知,传入的是常数,上面就是不同算法对应的常数。

算法参数含义解释
FLANN_INDEX_LINEAR = 0线性暴力(brute-force)搜索
FLANN_INDEX_KDTREE = 1随机kd树,平行搜索。默认trees=4
FLANN_INDEX_KMEANS = 2层次k均值树。默认branching=32,iterations=11,centers_init = CENTERS_RANDOM, cb_index =0.2
FLANN_INDEX_COMPOSITE = 3随机kd树和层次k均值树来构建索引。默认trees =4,branching =32,iterations =11,centers_init = CENTERS_RANDOM,cb_index =0.2
FLANN_INDEX_LSH = 6multi-probe LSH方法

注:有的文章里算法名和常数值对应是错误的,虽然也能运行但是是错误的。

  • 字典类型,默认dict(checks=32, eps=0, sorted=True)
    其中,checks为int型,是遍历的次数,一般只改变这个参数。

  • 返回值:返回一个匹配器对象,进而调用match方法完成特征点匹配。<FlannBasedMatcher 000002A2F133C510>

代码举例

import numpy as np
import cv2
import matplotlib.pyplot as plt
 
img1 = cv2.imread(r'D:/apap/temple/2.jpg')
img2 = cv2.imread(r'D:/apap/temple/3.jpg')

#可以添加nfeatures参数限定点的个数 
sift = cv2.xfeatures2d.SIFT_create()
 
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
 
FLANN_INDEX_KDTREE = 1 # kd树
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)   # or pass empty dictionary
 
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.7*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.figure(figsize=(20,20)); 
plt.imshow(img3, cmap='gray'), plt.title('Matched Result'), plt.axis('off')
plt.show()

实验结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十小大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值