【图像处理】——特征匹配(SIFT特征检测器+FLANN特征匹配方法+KNN近邻最优匹配筛选)——cv.xfeatures2d.SIFT_create()&sift.detectAndCompute

本文详细介绍了在Python中使用OpenCV进行图像特征匹配的过程,包括SIFT特征检测器、FLANN特征匹配器和KNN近邻最优匹配筛选。通过图像预处理、特征点检测、特征描述符获取、匹配点选择和匹配线绘制,阐述了特征匹配的基本步骤,并探讨了匹配点优化的Lowe's算法。同时,文章提供了实际的Python代码示例,展示了KNNMATCH和DRAWKNNMATCH在特征匹配中的应用。

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

转载请注明地址

目录

1、特征检测和特征匹配方法

(1)特征检测算法

(2)特征匹配算法

(3)各种特征检测算法的比较

2、特征匹配的基本步骤(附带主要的函数)

(1)图像预处理——灰度化(模板——查询集queryImg,待匹配图像——训练集trainingImg)

(2)创建特征检测器——用于检测模板和图像上的特征点

(3)利用上述特征检测器获得特征点和特征描述符

特征点的解释:

特征描述符的解释:

(4)创建特征匹配器——用于对模板和待匹配图像间进行特征点之间的匹配

匹配的一般思路:

(5)选取优良的匹配点——Lowe's算法+KNN近邻算法

(6)绘制匹配对间的匹配线

3、Python代码实现和主要函数分析

(1)导入包

(2)kps,des = sift.detectAndCompute(IMg, None)函数

参数

返回值

(3)cv.FlannBasedMatcher(indexParams,searchParams)

(4)matches=flann.knnMatch(queryDescriptors, trainDescriptors, k, mask=None, compactResult=None)

参数:

返回值:

matches含有三个属性:queryIdx,trainIdx,distance(特征点描述符的欧式距离)

(5)drawMatchesKnn(img1, keypoints1, img2, keypoints2,**drawparams)

参数:

问题1:怎么提取出kps中关键点的坐标?

问题2:matches的shape是怎样的?

问题3:opencv中match与KnnMatch的区别

4、其他函数

(1)cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)

(2)dst = cv2.perspectiveTransform(pts, M)

5、OpenCV仿射变换、投影变换的重要函数

Q&A:

6、实际代码

(1)KNNMATCH+DRAWKNNMATCH+LOWE'S TEST

(2)match+drawmatch


 

      看了很多文章,比较杂乱,打算自己整理一下1特征匹配这方面的知识,主要思路是先抛出一个例子和代码,然后对代码逐步解析,和对关键代码的参数以及返回值作解析

1、特征检测和特征匹配方法

参考:

https://blog.youkuaiyun.com/m0_37598482/article/details/78846215

https://www.jianshu.com/p/14b92d3fd6f8

一幅图像中总存在着其独特的像素点,这些点我们可以认为就是这

### FLANN 特征匹配原理 FLANN(Fast Library for Approximate Nearest Neighbors)是一种用于高效查找最近邻方法,特别适用于大规模数据集中的相似度搜索。该库支持多种类型的特征描述符,包括但不限于 SIFT、SURF 和 ORB 描述符。 #### 工作机制 FLANN 的核心在于构建索引结构来加速查询过程。具体来说: - 对于基于浮点数的描述符(如 SIFT/SURF),FLANN 使用 kd-tree 或者 LSH (Locality-Sensitive Hashing) 来创建多级树形索引[^1]。 - 当处理二进制描述符(例如 ORB)时,则采用专门设计的数据结构来进行哈希表重建以适应这些特殊形式的信息编码方式[^3]。 一旦建立了合适的索引体系后,在执行实际匹配操作之前还需要完成如下准备工作: - **参数配置**:设置诸如最大迭代次数、分支因子等影响性能表现的关键属性值; - **训练阶段**:利用已知样本建立有效的检索模型; 最终,在给定待查目标的情况下,FLANN 可以快速定位最接近的目标候选集合,并按照它们之间的距离远近排序输出最佳配对结果[^4]。 ```python import cv2 as cv from matplotlib import pyplot as plt img1 = cv.imread('template.jpg',0) # 查询图像 img2 = cv.imread('original_image.png',0) # 训练(场景)图像 # 初始化ORB检测器 orb = cv.ORB_create() kp1, des1 = orb.detectAndCompute(img1,None) kp2, des2 = orb.detectAndCompute(img2,None) index_params= dict(algorithm = 6, table_number = 6, key_size = 12, multi_probe_level = 2) search_params=dict(checks=50) flann=cv.FlannBasedMatcher(index_params, search_params) matches = flann.knnMatch(des1,des2,k=2) good_matches = [] for m,n in matches: if m.distance < 0.7*n.distance: good_matches.append(m) result_img = cv.drawMatches(img1,kp1,img2,kp2,good_matches[:],None,flags=cv.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) plt.imshow(result_img,cmap='gray') plt.show() ``` 上述代码展示了如何使用 OpenCV 库实现基本的 FLANN 匹配流程,其中包括初始化 ORB 检测器获取关键点及其对应的描述子向量,定义适合二进制描述符使用的索引参数并调用 `FlannBasedMatcher` 进行两幅图片间特征点的最佳对应关系寻找[^5]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有情怀的机械男

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

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

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

打赏作者

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

抵扣说明:

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

余额充值