手把手教你快速实现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所查找的关键点都是一些十分突出,不会因光照,仿射便函和噪声等因素而变换的"稳定"特征点,如角点、边缘点、暗区的亮点以及亮区的暗点等。匹配的过程就是对比这些特征点的过程,这个流程可以用下图表述:

三、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:根据关键点计算描述符,描述符是一个矩阵
DescriptorMatcher.new.vi:创建匹配器;
matcher_knnMatch.vi:找到最好的k个匹配

参数说明:

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

1️⃣实现SIFT特征匹配

实现步骤如下:

  • 读取图片

  • 实例化sift并检测两幅图的关键点

  • 绘制关键点,并根据关键点计算描述符

  • 对匹配特征向量的类进行实例化,使用knnmatch进行最近邻匹配

  • 使用SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式筛选匹配点

  • 使用事件结构绘制匹配结果 完成程序VI如下:

2️⃣运行结果

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

4.2 python实现SIFT特征匹配

1️⃣实现SIFT特征匹配

python 复制代码
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️⃣运行结果


五、项目源码

项目源码下载:download.csdn.net/download/vi...


总结

以上就是今天要给大家分享的内容,希望对大家有用。下篇文章将给大家介绍SIFT特征匹配,我们下篇文章见~

如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们的技术交流群:705637299。进群请备注:LabVIEW机器视觉

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

相关推荐
华玥作者17 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
AAD5558889917 小时前
YOLO11-EfficientRepBiPAN载重汽车轮胎热成像检测与分类_3
人工智能·分类·数据挖掘
王建文go17 小时前
RAG(宠物健康AI)
人工智能·宠物·rag
巫婆理发22217 小时前
循环序列模型
深度学习·神经网络
ALINX技术博客17 小时前
【202601芯动态】全球 FPGA 异构热潮,ALINX 高性能异构新品预告
人工智能·fpga开发·gpu算力·fpga
易营宝17 小时前
多语言网站建设避坑指南:既要“数据同步”,又能“按市场个性化”,别踩这 5 个坑
大数据·人工智能
春日见18 小时前
vscode代码无法跳转
大数据·人工智能·深度学习·elasticsearch·搜索引擎
Drgfd18 小时前
真智能 vs 伪智能:天选 WE H7 Lite 用 AI 人脸识别 + 呼吸灯带,重新定义智能化充电桩
人工智能·智能充电桩·家用充电桩·充电桩推荐
萤丰信息19 小时前
AI 筑基・生态共荣:智慧园区的价值重构与未来新途
大数据·运维·人工智能·科技·智慧城市·智慧园区
盖雅工场19 小时前
排班+成本双管控,餐饮零售精细化运营破局
人工智能·零售餐饮·ai智能排班