🏡博客主页: 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工具包下载及安装
- AI视觉工具包下载与安装参考:
https://blog.csdn.net/virobotics/article/details/123656523
二、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
更多资源,可关注微信公众号:VITRobotics
总结
以上就是今天要给大家分享的内容,希望对大家有用。如有笔误,还请各位及时指正。后续还会继续给各位朋友分享其他案例,欢迎大家关注博主。我是virobotics(仪酷智能),我们下篇文章见~
如果有问题可以在评论区里讨论,提问前请先点赞支持一下博主哦,如您想要探讨更多关于LabVIEW与人工智能技术,欢迎加入我们的技术交流群:705637299。进群请备注:LabVIEW机器视觉
**如果文章对你有帮助,欢迎✌关注、👍点赞、✌收藏