点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

作者:Iago Suárez

编译:ronghuaiyang(AI 公园)

导读

OpenCV发布了4.5.1,包含了BEBLID算子,一个新的局部特征描述符,超越ORB。

OpenCV 4.5.1中最令人兴奋的特性之一是BEBLID (Boosted Efficient Binary Local Image Descriptor),一个新的描述符能够提高图像匹配精度,同时减少执行时间!这篇文章将向你展示这个魔法是如何实现的。所有的源代码都在这个GitHub库中:https://github.com/iago-suarez/beblid-opencv-demo/blob/main/demo.ipynb

在这个例子中,我们将匹配这两个视角不一样的图像:

首先,确保安装了正确的OpenCV版本是很重要的。在你喜欢的环境中,你可以通过以下方式安装并检查OpenCV Contrib版本:

pip install "opencv-contrib-python>=4.5.1"
python
>>> import cv2 as cv
>>> print(f"OpenCV Version: {cv.__version__}")
OpenCV Version: 4.5.1

在Python中加载这两个图像所需的代码是:

import cv2 as cv# Load grayscale images
img1 = cv.imread("graf1.png", cv.IMREAD_GRAYSCALE)
img2 = cv.imread("graf3.png", cv.IMREAD_GRAYSCALE)if img1 is None or img2 is None:print('Could not open or find the images!')exit(0)

为了评估我们的图像匹配程序,我们需要在两幅图像之间进行正确的(即ground truth)几何变换。它是一个称为单应性的3x3矩阵,当我们从第一个图像中乘以一个点(在齐次坐标中)时,它返回第二个图像中这个点的坐标。加载这个矩阵:

# Load homography (geometric transformation between image)
fs = cv.FileStorage("H1to3p.xml", cv.FILE_STORAGE_READ)
homography = fs.getFirstTopLevelNode().mat()
print(f"Homography from img1 to img2:\n{homography}")

下一步是检测图像中容易在其他图像中找到的部分:Local image features。在本例中,我们将使用ORB,一个快速可靠的检测器来检测角点。ORB检测到强角,在不同的尺度上比较它们,并使用FAST或Harris响应来挑选最好的。它还使用局部patch的一阶矩来寻找每个角点的方向。我们检测每个图像中最多10000个角点:

detector = cv.ORB_create(10000)
kpts1 = detector.detect(img1, None)
kpts2 = detector.detect(img2, None)

在下面的图片中,你可以看到500个用绿点标记的检测响应最强的角点特征:

很好,现在是时候以一种我们可以在另一张图中找到它们的方式来表示这些关键点了。这个步骤被称为description,因为每个角点的局部patch中的纹理表示 为图像上不同操作得到的数字的向量。有很多的描述符可以用,但如果我们想要一些精确的东西,即使在移动电话或低功耗设备上也能实时运行,OpenCV有两个重要的方法:

  • ORB(导向快速和旋转简短):一个经典的方法,有10年的历史,工作相当好。

  • BEBLID (Boosted Efficient Binary Local Image Descriptor):2020年引入的一个新的描述符,已被证明在几个任务中改善了ORB。由于BEBLID适用于多种检测方法,所以必须将ORB关键点的比例设置为0.75~1。

# Comment or uncomment to use ORB or BEBLID
descriptor = cv.xfeatures2d.BEBLID_create(0.75)
# descriptor = cv.ORB_create()
kpts1, desc1 = descriptor.compute(img1, kpts1)
kpts2, desc2 = descriptor.compute(img2, kpts2)

现在可以匹配这两个图像的描述符来建立对应关系了。让我们使用暴力求解算法,它基本上比较了第一张图像中的每个描述符和第二张图像中的所有描述符。当我们处理二进制描述符时,使用汉明距离进行比较,即计算每对描述符之间不同的比特数。

这里还使用了一个叫做比率检验的小技巧。它不仅确保描述符1和2彼此相似,而且确保没有其他像2一样接近1的描述符。

matcher = cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE_HAMMING)
nn_matches = matcher.knnMatch(desc1, desc2, 2)
matched1 = []
matched2 = []
nn_match_ratio = 0.8  # Nearest neighbor matching ratio
for m, n in nn_matches:if m.distance < nn_match_ratio * n.distance:matched1.append(kpts1[m.queryIdx])matched2.append(kpts2[m.trainIdx])

因为我们知道正确的几何变换,让我们检查有多少匹配是正确的(inliners)。如果图像2中的点和从图像1投射到图像2的点距离小于2.5像素,我们认为匹配是有效的。

inliers1 = []
inliers2 = []
good_matches = []
inlier_threshold = 2.5  # Distance threshold to identify inliers with homography check
for i, m in enumerate(matched1):# Create the homogeneous pointcol = np.ones((3, 1), dtype=np.float64)col[0:2, 0] = m.pt# Project from image 1 to image 2col = np.dot(homography, col)col /= col[2, 0]# Calculate euclidean distancedist = sqrt(pow(col[0, 0] - matched2[i].pt[0], 2) + pow(col[1, 0] - matched2[i].pt[1], 2))if dist < inlier_threshold:good_matches.append(cv.DMatch(len(inliers1), len(inliers2), 0))inliers1.append(matched1[i])inliers2.append(matched2[i])

现在我们在inliers1和inliers2变量中有了正确的匹配,我们可以使用cv.drawMatches定性地评估结果。每一个对应点可以在更高级别的任务上对我们有帮助,比如homography estimation, Perspective-n-Point, plane tracking, real-time pose estimation 以及 images stitching。

由于很难定性地比较这种结果,让我们绘制一些定量的评价指标。最能反映描述符可靠程度的指标是inlier的百分比:

Matching Results (BEBLID)
*******************************
# Keypoints 1:                          9105
# Keypoints 2:                          9927
# Matches:                              660
# Inliers:                              512
# Percentage of Inliers:                77.57%

使用BEBLID描述符获得77.57%的inliers。如果我们在描述符部分注释掉BEBLID并取消注释ORB描述符,结果下降到63.20%:

# Comment or uncomment to use ORB or BEBLID
# descriptor = cv.xfeatures2d.BEBLID_create(0.75)
descriptor = cv.ORB_create()
kpts1, desc1 = descriptor.compute(img1, kpts1)
kpts2, desc2 = descriptor.compute(img2, kpts2)
Matching Results (ORB)
*******************************
# Keypoints 1:                          9105
# Keypoints 2:                          9927
# Matches:                              780
# Inliers:                              493
# Percentage of Inliers:                63.20%

总之,只需更改一行代码,将ORB描述符替换为BEBLID ,就可以将这两个图像的匹配结果提高14%。这在需要局部特征匹配的高级任务中会产生很大影响,所以不要犹豫,试试BEBLID。

—END—

英文原文:https://towardsdatascience.com/improving-your-image-matching-results-by-14-with-one-line-of-code-b72ae9ca2b73

本文仅做学术分享,如有侵权,请联系删文。

下载1

在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。

下载2

在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。

下载3

在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有ORB-SLAM系列源码学习、3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、深度估计、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近3000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、可答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

修改一行代码,将图像匹配效果提升14%相关推荐

  1. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...

    对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...

  2. OpenCV再升级!修改一行代码,将图像匹配效果提升14%!

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:AI公园 作者:Iago Suárez 编译:rongh ...

  3. 在CV/NLP/DL领域中,有哪些修改一行代码或者几行代码提升性能的算法?

    链接:https://www.zhihu.com/question/427088601 编辑:深度学习与计算机视觉 声明:仅做学术分享,侵删 作者:年年的铲屎官 https://www.zhihu.c ...

  4. 通道注意力新突破!从频域角度出发,浙大提出FcaNet:仅需修改一行代码,简洁又高效

    该文是浙江大学提出一种的新颖的通道注意力机制,它将通道注意力机制与DCT进行了巧妙的结合,并在常规的通道注意力机制上进行了扩展得到了本文所提出的多谱通道注意力机制:FcaLayer.作者在图像分类.目 ...

  5. 简单有效!在CV/NLP/DL领域中,有哪些修改一行代码或者几行代码提升性能的算法?...

    圈圈 1. relu:用极简的方式实现非线性激活,还缓解了梯度消失 x = max(x, 0) 2. normalization:提高网络训练稳定性 x = (x - x.mean()) / x.st ...

  6. 梯度中心化,一行代码加速训练并提升泛化能力

    来源 | 晓飞的算法工程笔记 优化器(Optimizer)对于深度神经网络在大型数据集上的训练是十分重要的,如SGD和SGDM,优化器的目标有两个:加速训练过程和提高模型的泛化能力.目前,很多工作研究 ...

  7. 一行代码实现微光效果

    快速实现微光效果 导入 Shimmer 库 dependencies {...implementation 'com.github.huangziye:Shimmer:${latest_version ...

  8. IJCAI 2022 | 用一行代码大幅提升零样本学习方法效果!南京理工牛津提出即插即用分类器模块...

    点击下方卡片,关注"CVer"公众号 AI/CV重磅干货,第一时间送达 点击进入-> CV 微信技术交流群 转载自:机器之心  |  作者:陈督兵 来自南京理工大学和牛津大学 ...

  9. 本周AI热点回顾:一行代码提升训练速度、PyTorch核心技术涉嫌抄袭、bAbI又被屠榜

    01 180所高校获批新增人工智能专业 3 月 3 日,教育部官方网站更新了「关于公布 2019 年度普通高等学校本科专业备案和审批结果的通知」.各高校新增备案专业 1672 个.审批专业 181 个 ...

  10. 如何不改一行代码,让Hippy启动速度提升50%?

    导读|Hippy使用JS引擎进行异步渲染,在用户从点击到打开首屏可交互过程中会有一定的耗时,影响用户体验.如何优化这段耗时?腾讯客户端开发工程师李鹏,将介绍QQ浏览器通过切换JS引擎来优化耗时的探索过 ...

最新文章

  1. python面试题及答案-5个很好的Python面试题问题答案及分析
  2. java选填,java选择填空 - osc_ug2wy0bi的个人空间 - OSCHINA - 中文开源技术交流社区
  3. Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresour
  4. lightoj 1031 区间dp
  5. [Winodows Phone 7控件详解]控件拾遗
  6. 如何在学习机器学习时学习数学?
  7. Git提交本地代码到GitHub
  8. 火狐firebug和firepath插件安装
  9. 字节跳动的 8 轮视频面试流程
  10. [2019年国庆专题训练] dp专题训练
  11. STM32(7):中断方式让按键点亮LED
  12. 湖北湖南广州计算机科学大学排行,校友会2018中国大学计算机类专业排名
  13. oracle数据库用户状态失效Expired
  14. 拿信用卡套个首付买房子——引火自焚
  15. word研究报告排版要领
  16. 如何有效提高营销型企业官网客户成交率?
  17. CloudsBombs
  18. 什么是云存储,是怎么服务大家的,云存储有什么优点和缺点?
  19. 链叨叨直播间丨CryptoMechaKing——末世机甲“元宇宙游戏”来临
  20. 专注情感故事短视频,三感video获千万级A+轮融资...

热门文章

  1. 第二百二十七节,jQuery EasyUI,ComboTree(树型下拉框)组件
  2. 计算机网络第五次笔记
  3. JavaSE复习_8 泛型程序设计
  4. HTML5 Web Storage
  5. 查看被系统或程序打开文件工具 OpenedFilesView
  6. 22. 切勿直接修改set或multiset中的键
  7. 电脑怎么开护眼模式_心累!整天对着手机电脑,到底该怎么护眼啊啊啊
  8. Hadoop下虚拟机的创建与克隆
  9. raid卡 4k 设置 linux,硬盘“大户”看过来,手把手教你组建 RAID 磁盘阵列
  10. vue中的组件重定向