手把手教你快速实现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机器视觉

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

目录
相关文章
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
12月前
|
机器学习/深度学习 数据采集 算法
【植物疾病的识别】使用叶片图像检测植物疾病研究【图像采集、分割、特征提取】(Matlab代码实现)
【植物疾病的识别】使用叶片图像检测植物疾病研究【图像采集、分割、特征提取】(Matlab代码实现)
437 0
|
机器学习/深度学习 编解码 监控
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
这篇文章详细介绍了如何使用YOLOv8进行目标检测任务,包括环境搭建、数据准备、模型训练、验证测试以及模型转换等完整流程。
29932 59
目标检测实战(六): 使用YOLOv8完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
|
人工智能 运维 安全
热门 MCP Server一键部署
本文探讨了MCP(Model Context Protocol)的发展及其云上托管的趋势。尽管MCP协议在2024年发布时未引起广泛关注,但随着Cursor和Manus等平台的集成,以及OpenAI对其Agent SDK的支持,MCP逐渐成为行业标准。然而,本地部署的MCP Server存在效率低、扩展复杂等问题,难以满足企业级需求。函数计算(FC)作为Serverless算力的代表,提供一键托管开源MCP Server的能力,具备成本效益、弹性扩展、简化运维等优势,解决了传统托管的核心痛点。文章还提供了多个开源MCP Server的一键部署链接,助力开发者快速上手。
热门 MCP Server一键部署
|
SQL 安全 API
在API 接口的设计中,如何保证数据的安全性和完整性?
在API接口设计中,确保数据安全与完整至关重要。关键措施包括:采用HTTPS协议防数据泄露;强认证机制(如OAuth2/JWT)确保用户授权;敏感数据加密(如AES);签名加时间戳防重放攻击;输入验证防SQL注入等攻击;恰当错误处理避免敏感信息泄露;限频防滥用及DDoS攻击;详尽日志记录助安全审计;数据完整性校验(如哈希比对);版本控制保兼容;严格避免响应中泄露敏感信息;定期安全审计与测试。这些措施共同保障API安全。
2136 1
|
NoSQL 大数据 Redis
使用 Flask 和 Celery 构建异步任务处理
使用 Flask 和 Celery 构建异步任务处理
960 2
|
人工智能 IDE 程序员
通义灵码:AI 研发趋势与效果提升实践丨SDCon 全球软件技术大会演讲全文整理
SDCon 全球软件技术大会上,阿里云通义灵码团队分享了关于 AI 辅助编码的最新研究与实践,随着 AIGC 技术的发展,软件研发领域将迎来智能化的新高度,助力 DevOps 流程优化,提升研发效率和研发幸福感。
14793 11
使用qemu来dump虚拟机的内存,然后用crash来分析
使用qemu来dump虚拟机的内存,然后用crash来分析

热门文章

最新文章