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

‍‍🏡博客主页: virobotics的CSDN博客:LabVIEW深度学习、人工智能博主
🎄所属专栏:『LabVIEW深度学习实战』
🍻上期文章: 使用LabVIEW AI视觉工具包快速实现SIFT特征检测(含源码)
📰如觉得博主文章写的不错或对你有所帮助的话,还望大家多多支持呀! 欢迎大家✌关注、👍点赞、✌收藏、👍订阅专栏

前言

上一篇博文给大家介绍了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特征匹配

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️⃣运行结果

在这里插入图片描述


五、项目源码

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


总结

以上就是今天要给大家分享的内容,希望对大家有用。我们下篇文章见~

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

推荐阅读

LabVIEW图形化的AI视觉开发平台(非NI Vision),大幅降低人工智能开发门槛
LabVIEW图形化的AI视觉开发平台(非NI Vision)VI简介
LabVIEW AI视觉工具包OpenCV Mat基本用法和属性
手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集
👇技术交流 · 一起学习 · 咨询分享,请联系👇

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

virobotics

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

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

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

打赏作者

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

抵扣说明:

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

余额充值