手把手教你快速实现SIFT特征匹配(含源码)

简介: 手把手教你快速实现SIFT特征匹配(含源码)

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主

🍻本文由virobotics(仪酷智能)原创首发

🥳欢迎大家关注✌点赞👍收藏⭐留言📝

前言

Hello,大家好,我是virobotics(仪酷智能),一个深耕于LabVIEW和人工智能领域的开发工程师。

上一篇博文给大家介绍了LabVIEW实现SIFT特征检测,本文给大家介绍LabVIEW及python实现SIFT特征匹配。


一、环境搭建

1.1 部署本项目时所用环境

  • 操作系统:Windows10
  • python:3.6及以上
  • LabVIEW:2018及以上 64位版本
  • AI视觉工具包:techforce_lib_opencv_cpu-1.0.0.98.vip

1.2 LabVIEW工具包下载及安装


二、SIFT特征匹配具体步骤

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),计算关键点的大小、方向、尺度信息,利用这些信息组成关键点对特征点进行描述的问题。Sift所查找的关键点都是一些十分突出,不会因光照,仿射便函和噪声等因素而变换的“稳定”特征点,如角点、边缘点、暗区的亮点以及亮区的暗点等。匹配的过程就是对比这些特征点的过程,这个流程可以用下图表述:

image.png

三、SIFT匹配方法的提出

为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式:

取一幅图像中的一个SIFT关键点,并找出其与另一幅图像中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离得到的比率ratio少于某个阈值T,则接受这一对匹配点。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。显然降低这个比例阈值T,SIFT匹配点数目会减少,但更加稳定,反之亦然。

Lowe推荐ratio的阈值为0.8,也可以试试其他阈值,测试过程中发现阈值小于0.4的很少有匹配点,大于0.6的则存在大量错误匹配点,所以建议ratio的取值原则如下:

  • ratio=0.4:对于准确度要求高的匹配;
  • ratio=0.6:对于匹配点数目要求比较多的匹配;
  • ratio=0.5:一般情况下。

四、SIFT特征匹配实战

4.1 LabVIEW实现SIFT特征匹配

0️⃣相关VI及参数介绍

SIFT_Compute:根据关键点计算描述符,描述符是一个矩阵 image.png

DescriptorMatcher.new.vi:创建匹配器;image.png

matcher_knnMatch.vi:找到最好的k个匹配
image.png

参数说明:

  • d1,d2:表示两幅图的描述符;
  • k:表示取欧式距离最近的前k个关键点,就是计算第一组每个描述符和第二组所有描述符之间的欧式距离,然后取距离最小的前k对,当k=1就和match方法的结果一样;
  • Array:由类(包含DMatches和size)组成的数组,DMatches包含了:queryIdx,表示第一个图像的描述符的索引值,query就是查找,就是用哪幅图去查找;trainIdx,表示第二幅图像的描述符的索引值;distance, 描述子之间的距离,值越低越好,越低表示近似度越高,或者说匹配度越高;

1️⃣实现SIFT特征匹配

实现步骤如下:

  • 读取图片
    image.png
  • 实例化sift并检测两幅图的关键点
    image.png
  • 绘制关键点,并根据关键点计算描述符
    image.png
  • 对匹配特征向量的类进行实例化,使用knnmatch进行最近邻匹配
    image.png
  • 使用SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式筛选匹配点
    image.png
  • 使用事件结构绘制匹配结果
    image.png

完成程序VI如下:
image.png

2️⃣运行结果

修改id,可查看单一匹配结果
image.png

4.2 python实现SIFT特征匹配

1️⃣实现SIFT特征匹配

import cv2

# 1 读取图像
img1 = cv2.imread("left.jpg")
img2 = cv2.imread("right.jpg")
g1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
g2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 2 sift关键点检测及匹配
# 2.1 实例化sift对象
sift = cv2.SIFT_create()
# 2.2 关键点检测:kp关键点信息包括方向,尺度,位置信息,de是关键点的描述符
kp1, des1 = sift.detectAndCompute(g1,None)
kp2, des2 = sift.detectAndCompute(g2,None)
### 2.3 特征匹配
# 使用默认参数的 BFMatcher
bf = cv2.BFMatcher()
# K近邻算法求取在空间中距离最近的K个数据点,并将这些数据点归为一类
matches = bf.knnMatch(des1,des2,k=2)
goodMatch = []  # goodMatch是经过筛选的优质配对
threshold = 0.8
for m,n in matches:

##    如果2个配对中第一匹配的距离除以次近的距离得到的比率小于于某个阈值T,
##    基本可以说明这个第一配对是两幅图像中独特的,不重复的特征点,可以保留。
    if m.distance/n.distance < threshold:
        goodMatch.append([m])
print("goodMatch:",len(goodMatch))        
# 2.4 在图像上绘制匹配结果
img_out = cv2.drawMatchesKnn(img1,
                             kp1,
                             img2,
                             kp2,
                             goodMatch,
                             None,
                             flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('image_match', img_out)#展示图片
cv2.waitKey(0)#等待按键按下
cv2.destroyAllWindows()#清除所有窗口

2️⃣运行结果

image.png


五、项目源码

项目源码下载:https://download.csdn.net/download/virobotics/87808362

更多资源,可关注微信公众号:VITRobotics

总结

以上就是今天要给大家分享的内容,希望对大家有用。如有笔误,还请各位及时指正。后续还会继续给各位朋友分享其他案例,欢迎大家关注博主。我是virobotics(仪酷智能),我们下篇文章见~

如果有问题可以在评论区里讨论,提问前请先点赞支持一下博主哦,如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们的技术交流群:705637299。进群请备注:LabVIEW机器视觉

**如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏

目录
相关文章
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
1125 0
|
传感器 C++ 计算机视觉
【opencv3】详述PnP测距完整流程(附C++代码)
【opencv3】详述PnP测距完整流程(附C++代码)
1510 0
|
8月前
|
机器学习/深度学习 存储 算法
如何判断两张图片的相似度?原来图片对比也可以如此简单!
本文介绍了图片对比技术在多个场景中的应用,如图片去重、内容审核、版权维权及相似图片搜索,并详细解析了两种主流的图片对比方法。第一种是**MD5指纹对比**,适合精确匹配完全相同的图片,具有速度快、简单易用的特点,但对稍作修改的图片无能为力。第二种是**图像哈希对比**,包括平均哈希、感知哈希等算法,能够判断图片的相似程度,适用于处理缩放、旋转或亮度调整后的图片,但在语义相似性上仍有局限。最后提到,随着机器学习和深度神经网络的发展,图片相似度判断技术将有更多可能性,值得进一步探索。
2930 6
如何判断两张图片的相似度?原来图片对比也可以如此简单!
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
5月前
|
机器学习/深度学习 数据采集 算法
【植物疾病的识别】使用叶片图像检测植物疾病研究【图像采集、分割、特征提取】(Matlab代码实现)
【植物疾病的识别】使用叶片图像检测植物疾病研究【图像采集、分割、特征提取】(Matlab代码实现)
177 0
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
23721 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
12月前
|
机器学习/深度学习 文字识别 自然语言处理
分析对比大模型OCR、传统OCR和深度学习OCR
OCR技术近年来迅速普及,广泛应用于文件扫描、快递单号识别、车牌识别及日常翻译等场景,极大提升了便利性。其发展历程从传统方法(基于模板匹配和手工特征设计)到深度学习(采用CNN、LSTM等自动学习高级语义特征),再到大模型OCR(基于Transformer架构,支持跨场景泛化和少样本学习)。每种技术在特定场景下各有优劣:传统OCR适合实时场景,深度学习OCR精度高但依赖大量数据,大模型OCR泛化能力强但训练成本高。未来,大模型OCR将结合多模态预训练,向通用文字理解方向发展,与深度学习OCR形成互补生态,最大化平衡成本与性能。
|
机器学习/深度学习 传感器 人工智能
【博士每天一篇论文-综述】Brain Inspired Computing : A Systematic Survey and Future Trends
本文提供了对脑启发计算(BIC)领域的系统性综述,深入探讨了BIC的理论模型、硬件架构、软件工具、基准数据集,并分析了该领域在人工智能中的重要性、最新进展、主要挑战和未来发展趋势。
546 2
【博士每天一篇论文-综述】Brain Inspired Computing : A Systematic Survey and Future Trends
|
JavaScript Java 测试技术
基于springboot+vue.js的餐饮管理系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的餐饮管理系统附带文章和源代码设计说明文档ppt
252 1
|
算法 数据库 C++
SIFT算法详解(附有完整代码)
SIFT算法详解(附有完整代码)