ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化

简介: ML之SIFT_FLANN:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化

目录

FLANN算法

1、建立索引

2、进行搜索

输出结果

实现代码


 

FLANN算法

         FLANN库全称是Fast Library for Approximate Nearest Neighbors,它是目前最完整的(近似)最近邻开源库。不但实现了一系列查找算法,还包含了一种自动选取最快算法的机制。

         使用flann的搜索,整体来说分为两步,一是建立索引,二是搜索。

  • 使用SIFT特征提取关键点;
  • 计算SIFT特征描述子;
  • 使用FLANN匹配器进行描述子向量匹配。

 

1、建立索引

       其实就是要两部分参数,一是数据也就是mat矩阵,二是一些具体参数,这个参数要根据建立的索引类型来设置。而有哪些索引类型呢?  共有:线性索引、KD-Tree索引、K均值索引、复合索引、LSH方法索引、自动索引 六种。

 

2、进行搜索

有两种搜索方式 :knnSearch //搜索k邻近 、radiusSearch //搜索半径最近

从返回结果考虑两者的不同之处在于:

knnSearch返回最近邻的点(具体点的个数由用户设定,设n个就一定返回n个);

radiusSearch返回搜索半径内所有点(即可能不存在符合条件的点,则返回空的)。

 

输出结果

 

实现代码

ML之SIFT:对图片提取SIFT特征并利用FLANN方法判别图像的相似度并可视化

1.     sift = cv2.xfeatures2d.SIFT_create()   
2. # 查找监测点和匹配符
3.     kp1, des1 = sift.detectAndCompute(img1, None)
4.     kp2, des2 = sift.detectAndCompute(img2, None)
5. print(len(kp1), len(des1) )   # 1402, 1402
6. 
7. 
8.     FLANN_INDEX_KDTREE = 0
9.     indexParams = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
10.     searchParams = dict(checks=50)
11.     flann = cv2.FlannBasedMatcher(indexParams, searchParams)
12. # 进行匹配
13.     matches = flann.knnMatch(des1, des2, k=2)
14. # 准备空的掩膜 画好的匹配项
15.     matchesMask = [[0, 0] for i in range(len(matches))]
16. 
17. for i, (m, n) in enumerate(matches):
18. if m.distance < 0.7*n.distance:
19.             matchesMask[i] = [1, 0]
20. 
21.     drawPrams = dict(matchColor=(0, 255, 0),
22.                      singlePointColor=(255, 0, 0),
23.                      matchesMask=matchesMask,
24.                      flags=0)
25.     img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, matches, None, **drawPrams)
26.     img_PutText = cv2.putText(img3, "SIFT+kNNMatch: Image Similarity Comparisonn", (40, 40),cv2.FONT_HERSHEY_COMPLEX, 1.5, (0, 0, 255), 3,)
27.     img4 = cv2.resize(img_PutText, (0, 0), fx=0.5, fy=0.5, interpolation=cv2.INTER_NEAREST)  #缩小1/2
28. 
29.     cv2.imshow("matches", img4)
30.     cv2.waitKey(7000)
31.     cv2.destroyAllWindows()

 

相关文章
|
算法 计算机视觉 索引
OpenCV(四十六):特征点匹配
OpenCV(四十六):特征点匹配
844 0
|
7月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
1207 0
|
编解码 前端开发 算法
基于OpenCV的双目摄像头测距(误差小)
首先进行双目摄像头定标,获取双目摄像头内部的参数后,进行测距;本文的双目视觉测距是基于BM算法。注意:双目定标的效果会影响测距的精准度,建议大家在做双目定标时,做好一些(尽量让误差小)。
12608 3
基于OpenCV的双目摄像头测距(误差小)
|
7月前
|
弹性计算 关系型数据库 数据库
阿里云服务器ECS是什么?ECS应用场景、租用流程及使用教程整理
阿里云ECS(弹性计算服务)是性能稳定、弹性扩展的云计算服务,支持多种处理器架构和实例类型,适用于网站托管、开发测试、数据存储、企业服务、游戏多媒体及微服务架构等场景。提供从注册、配置到部署、运维的完整使用流程,助力用户高效上云。
|
4月前
|
传感器 编解码 数据挖掘
ASTER 全球数字高程模型 V003
ASTER全球数字高程模型V003(ASTGTM)由NASA与日本METI合作生成,覆盖北纬83°至南纬83°,空间分辨率约30米。基于2000–2013年ASTER立体影像自动处理,融合超188万场景,优化水体与地形精度,提供DEM与场景数量图层,数据无显著空隙,适用于多领域地形分析。
397 7
|
8月前
|
机器学习/深度学习 存储 算法
如何判断两张图片的相似度?原来图片对比也可以如此简单!
本文介绍了图片对比技术在多个场景中的应用,如图片去重、内容审核、版权维权及相似图片搜索,并详细解析了两种主流的图片对比方法。第一种是**MD5指纹对比**,适合精确匹配完全相同的图片,具有速度快、简单易用的特点,但对稍作修改的图片无能为力。第二种是**图像哈希对比**,包括平均哈希、感知哈希等算法,能够判断图片的相似程度,适用于处理缩放、旋转或亮度调整后的图片,但在语义相似性上仍有局限。最后提到,随着机器学习和深度神经网络的发展,图片相似度判断技术将有更多可能性,值得进一步探索。
3015 6
如何判断两张图片的相似度?原来图片对比也可以如此简单!
|
存储 算法 数据可视化
基于 MATLAB的GUI信号处理界面设计 源码+运行截图
基于 MATLAB的GUI信号处理界面设计 源码+运行截图
491 2
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
24121 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
机器学习/深度学习 并行计算 PyTorch
【已解决】RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors might be asynchronous
【已解决】RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors might be asynchronous
11238 2