opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

这篇具有很好参考价值的文章主要介绍了opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在计算机视觉领域,从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是
ORB(Oriented FAST and Rotated Brief)特征检测器和描述符。ORB 由 Ethan Rublee
等人开发,结合了两种现有技术的优势——FAST(加速分段测试特征)和Brief(二进制鲁棒独立基本特征)——为特征提取和匹配提供了强大而高效的解决方案。

在本文中,我们将深入研究 ORB 的内部工作原理,探讨它如何充当特征检测器和描述符、其关键组件以及与其他特征提取方法相比的优势。

  1. FAST特征检测器

加速分割测试的特征(Feature from Accelerated Segment
Test,FAST)算法是通过分析16个像素的圆形邻域来实现的。FAST算法把邻域内每个像素标记为比特定阈值更亮或更暗,该阈值是相对于圆心定义的。如果邻域包含若干标记为更亮或更暗的一系列连续像素,那么这个邻域就被视为角点。

FAST是一种角点检测算法,可以有效识别图像中的角点或关键点。通过利用简单的强度阈值方案和最小化计算,它的设计速度比传统的角点检测器更快。FAST 检查候选像素周围的一圈像素,如果有足够数量的连续像素比候选像素更亮或更暗,则将其分类为角点。

  1. BRIEF

另外,二值鲁棒独立基本特征(Binary Robust Independent Elementary
Feature,BRIEF)并非特征检测算法,而是一个描述符。我们来更深入地研究一下描述符的概念,然后再来研究BRIEF。

在前面用SIFT和SURF分析图像时,整个过程的核心是调用
detectAndCompute函数。此函数执行两个不同的步骤——检测和计算,它们返回2个不同的结果(耦合到一个元组中)。

检测结果是一组关键点,计算结果是这些关键点的一组描述符。这意味着OpenCV的cv2.SIFT和cv2.SURF类都实现了检测和描述算法。请记住,原始的SIFT和SURF不是特征检测算法。

OpenCV的cv2.SIFT实现了DoG特征检测和SIFT描述,而OpenCV的cv2.SURF实现了快速Hessian特征检测和SURF描述。
关键点描述符是图像的一种表示,充当特征匹配的通道,因为你
可以比较两幅图像的关键点描述符并发现它们的共性。BRIEF是目前最快的描述符之一。BRIEF背后的理论相当复杂,但是可以这样说,BRIEF采用一系列优化,使其成为特征匹配的一个非常好的选择。

蛮力匹配

蛮力匹配器是一个描述符匹配器,它比较两组关键点描述符并生成匹配列表。之所以称为蛮力匹配,是因为在该算法中几乎不涉及优化。对于第一个集合中的每个关键点描述符,匹配器将之与第二个集合中的每个关键点描述符进行比较。每次比较产生一个距离值,并基于最小距离选择最佳匹配。

概括地说,在计算中,“蛮力”一词是指将所有可能组合(例如,破解已知长度密码的所有可能的字符组合)的穷举按优先级排序的方法。相反,优先考虑速度的算法可能会跳过一些可能性,并试图走一条捷径来找到看似最合理的解决方案。

OpenCV提供了一个cv2.BFMatcher类,支持几种蛮力特征匹配的方法。

  1. ORB算法原理
    ORB算法将FAST特征点的检测方法和BRIEF特征描述子结合起来,并在它们的基础上做了改进与优化。

首先,它利用FAST特征点检测的方法来检测特征点,然后利用Harris角点的度量方法,从FAST特征点中挑选出Harris角点响应值最大的N个特征点。其中Harris角点的响应函数定义为:

R=detM−k(trace(M))2

在现在生活中,我们从不同的距离,不同的方向、角度、不同的光照条件下观察一个物体时,物体的大小、形状,明暗都会有所不同。但是我们仍然可以判断它是一个物体。理想的特征描述子应该具备这些性质,即在大小、方向、明暗不同的图像中,同一特征点应具有足够相似的描述子,称之为描述子的可复现性。

但是ORB并没有解决尺度不一致的问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能,我们通过构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性。ORB主要解决了BRIEF描述子不具备旋转不变性的问题,ORB论文种提出了一种利用灰度质心法来解决这个问题,灰度质心法假设角点的灰度与质心之间存在一个偏移,这个向量可以用于表示一个方向。对于任意一个特征点p来说,我们定义p的邻域像素的矩为:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python

其中I(x,y)为点(x,y)处的灰度值,q 为质心,i,j=0,1。那么我们可以得到图像的质心为:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python

那么特征点与质心的夹角定义为FAST特征点的方向:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python
为了提高算法的旋转不变性,需要确保 x 和 y 在半径为r 的圆形区域内,即x,y∈[−r,r],r 等于邻域半径。

特征点的描述

ORB选择了BRIEF作为特征描述方法,但是我们知道BRIEF不具备旋转不变性,所以我们要给BRIEF加上旋转不变性,把这种方法称为"Steer BRIEF"。 对于任何一个特征点来说,它的BRIEF描述子是一个长度为n的二值码串,这个二值码串是由特征点邻域n个点对生成的,我们现在讲这2n个点(xi,yi),i=1,2,…,2n组成一个矩阵S:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python
Calonder建议为每个块的旋转和投影集合分别计算BRIEF描述子,但代价昂贵。ORB中采用了一个更有效的方法:使用邻域方向θ和对应的转矩阵Rθ,构建S 的一个校正版本Sθ:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python
其中:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python
而θ 即我们为特征点求得的主方向。

即我们把坐标轴旋转]theta,计算以主方向为坐标系的匹配点对,如下图:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python
实际上,我们可以把角度离散化,即把360度分为12份,每一份是30度,然后我们对这个12个角度分别求得一个Sθ,这样我们就创建了一个查找表,对于每一个θ,我们只需要查表即可快速得到它的点的集合Sθ。

解决描述子的区分性

BRIEF令人惊喜的特性之一是:对于n维的二值串的每个特征位,所有特征点在该位上的值都满足一个均值接近于0.5,而方差很大的高斯分布。方差越大,说明区分性越强,那么不同特征点的描述子就表现出来越大差异性,对匹配来说不容易误配。但是当我们把BRIEF沿着特征点的方向调整为Steered BRIEF时,均值就漂移到一个更加分散式的模式。可以理解为有方向性的角点关键点对二值串则展现了一个更加均衡的表现。而且论文中提到经过PCA对各个特征向量进行分析,得知Steered BRIEF的方差很小,判别性小,各个成分之间相关性较大。

为了减少Steered BRIEF方差的亏损,并减少二进制码串之间的相关性,ORB使用了一种学习的方法来选择一个较小的点对集合。方法如下:

首先建立一个大约300k关键点的测试集,这些关键点来自于PASCAL2006集中的图像。

对于这300k个关键点中的每一个特征点,考虑它的31×31的邻域,我们将在这个邻域内找一些点对,不同于BRIEF中要先对这个Patch内的点做平滑,再用以Patch中心为原点的高斯分布选择点对的方法。

ORB为了去除某些噪声点的干扰,选择了一个5×5大小的区域的平均灰度来代替原来一个单点的灰度,这里5×5区域内图像平均灰度的计算可以用积分图的方法。我们知道31×31的Patch里共有N=(31−5+1)×(31−5+1)个这种窗口,那么我们要N个子窗口中选择2个子窗口的话,共有C2N种方法。所以对于300k中每一个特征点,我们都可以从它的31×31大小的邻域中提取一个很长的二进制串,长度为M=C2N,表示为:

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python
那么当300k个关键点全部进行上面的特征提取之后,我们就得到了一个300k×M的矩阵,矩阵中的每个元素值为0或者1.

对该矩阵的每个列向量,也就是每个点对在300k个特征点上的测试结果,计算其均值。把所有的列向量按均值进行重新排序。排好后,组成了一个向量T,T的每一个元素都是一个列向量。进行贪婪搜索,从T中把排在第一的那个列放到R中,T中就没有这个点对的测试结果了,然后把T中的排在下一个的列与R中的所有元素比较,计算它们的相关性,如果相关超过了某一事先设定好的阈值,就扔了它,否则就把它方到R里面。

重复上面的步骤,直到R中有256个列向量位置。

如果把T全部找完也没有找到256个,那么我们可以把相关的阈值调高一些,再尝试一遍。这样,我们就得到了256个点对。上面这个过程我们称它为rBRIEF。

OpenCV实现

ORB中有很多参数可以设置,在OpenCV中它可以通过ORB来创建一个ORB检测器。

cv2.ORB_create([,nfeatues[,scaleFactor[,nlevels[,edgeThreshold[,firstLevel[,WTA_K[,[scoreType,[patchSize,fastThreshold]]]]]]]]])

参数说明:

  • nfeatures :最多提取的特征点的数量;
  • scaleFactor : 金字塔图像之间的尺度参数,类似于SIFT中的k;
  • nlevels: 高斯金字塔的层数;
  • edgeThreshold :边缘阈值,这个值主要是根据后面的patchSize来定的,靠近边缘edgeThreshold以内的像素是不检测特征点的。
  • firstLevel-:看过SIFT都知道,我们可以指定第一层的索引值,这里默认为0。
  • WET_K : 用于产生BIREF描述子的点对的个数,一般为2个,也可以设置为3个或4个,那么这时候描述子之间的距离计算就不能用汉明距离了,而是应该用一个变种。OpenCV中,如果设置WET_K = 2,则选用点对就只有2个点,匹配的时候距离参数选择NORM_HAMMING,如果WET_K设置为3或4,则BIREF描述子会选择3个或4个点,那么后面匹配的时候应该选择的距离参数为NORM_HAMMING2。
  • scoreType :用于对特征点进行排序的算法,你可以选择HARRIS_SCORE,也可以选择FAST_SCORE,但是它也只是比前者快一点点而已。
  • patchSize :用于计算BIREF描述子的特征点邻域大小。

示例:使用ORB描述符进行Brute-Force匹配:

示例代码:


import cv2

def orb_test():
    # 加载图片  灰色
    img1 = cv2.imread('images\\quexiao\\2.png')
    gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    img2 = cv2.imread('images\\quexiao\\2-1.png')

    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    image1 = gray1.copy()
    image2 = gray2.copy()

    '''
    1.使用ORB算法检测特征点、描述符
    '''
    orb = cv2.ORB_create(128)
    keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
    keypoints2, descriptors2 = orb.detectAndCompute(image2, None)
    # 在图像上绘制关键点
    image1 = cv2.drawKeypoints(image=image1, keypoints=keypoints1, outImage=image1, color=(255, 0, 255),
                               flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    image2 = cv2.drawKeypoints(image=image2, keypoints=keypoints2, outImage=image2, color=(255, 0, 255),
                               flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
    # 显示图像
    cv2.imshow('orb_keypoints1', image1)
    cv2.imshow('orb_keypoints2', image2)
    cv2.waitKey(20)

    '''
    2、匹配
    '''
    # 使用汉明距离,创建BF匹配器,并进行匹配() 新版本不支持
   # matcher = cv2.BFMatcher_create(cv2.HAMMING_NORM_TYPE, crossCheck=True)
    matcher = cv2.BFMatcher_create(cv2.NORM_HAMMING, crossCheck=True)
    matchePoints = matcher.match(descriptors1, descriptors2)
    print(type(matchePoints), len(matchePoints), matchePoints[0])
    # 按照距离从小到大排序,选取最优匹配的
    sorted(matchePoints, key=lambda x: x.distance)
    # 绘制最优匹配点
    outImg = None
    outImg = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matchePoints[:10], outImg, matchColor=(0, 255, 0),
                             flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT)
    cv2.imshow('matche', outImg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    orb_test()

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python

实验原图:
2.png
opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python

2-1.png
opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配),opencv 进阶,计算机视觉,人工智能,opencv,人工智能,计算机视觉,python文章来源地址https://www.toymoban.com/news/detail-668816.html

到了这里,关于opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “ORB技术解析:快速检测和描述图像特征点的算法“

    ORB(Oriented FAST and Rotated BRIEF)是一种计算机视觉算法,用于检测和描述图像中的特征点。它结合了FAST算法和BRIEF算法,使其具有快速的计算速度和对不同光照条件和视角变化的鲁棒性。 ORB算法的主要原理是使用FAST算法快速检测图像中的关键点,然后使用BRIEF算法描述这些关

    2024年02月09日
    浏览(39)
  • Opencv特征检测之ORB算法原理及应用详解

    特征是图像信息的另一种数字表达形式。一组好的特征对于在指定 任务上的最终表现至关重要。 视觉里程 (VO) 的主要问题是如何根据图像特征来估计相机运动。但是,整幅图像用来计算分析通常比较耗时,故而转换为分析图像中的特征点的运动。 计算机视觉领域的研究者

    2024年02月12日
    浏览(47)
  • OpenCV实战——多尺度FAST特征检测

    FAST 是用于快速检测图像中关键点的方法,而 SURF 和 SIFT 算法的设计重点是尺度不变性。为了同时实现快速检测和尺度不变性, OpenCV 中引入了新的兴趣点检测器,包括 BRISK ( Binary Robust Invariant Scalable Keypoints ) 检测器(基于 F

    2023年04月09日
    浏览(37)
  • OpenCV实战(17)——FAST特征点检测

    Harris 算子根据两个垂直方向上的强度变化率给出了角点(或更一般地说,兴趣点)的数学定义。但使用这种定义需要计算图像导数,计算代价较为高昂,特别是兴趣点检测通常只是更复杂算法的先决步骤。 在本中,我们将学习另一个特征点检测算子 FAST ( Features from Accelerated S

    2023年04月08日
    浏览(38)
  • python opencv orb特征点提取匹配然后图像拼接

    opencv 基于ORB特征点图像拼接_特征点 warpperspective-CSDN博客 图像用这儿的 右边多出了一部分黑色的,应该是重复部分的宽

    2024年01月19日
    浏览(50)
  • Opencv 之ORB特征提取与匹配API简介及使用例程

    ORB因其速度较快常被用于视觉SLAM中的位姿估计、视觉里程、图像处理中的特征提取与匹配及图像拼接等领域 本文将详细给出使用例程及实现效果展示 创建 检测 计算 检测与计算 绘制特征点 绘制匹配点对 讲述特征点提取与描述子计算,实现如下: 暴力匹配实现: 其效果如

    2024年02月13日
    浏览(44)
  • OpenCV实战(19)——特征描述符

    SURF 和 SIFT 关键点检测算法为每个检测到的特征计算位置、方向和比例,比例因子信息可用于定义每个特征点周围的图像窗口的大小。因此,无论特征所属对象的比例如何,定义的邻域都将包含相同的视觉信息。本节将介绍如何使用特征描述符描述兴趣点的邻域,在图像分析

    2023年04月21日
    浏览(38)
  • OpenCV实战——二值特征描述符

    在《特征描述符》一节中,我们学习了如何使用从图像强度梯度中提取的描述符来描述关键点,这些描述符可以是 64 、 128 或更多维的浮点向量。这使得使用这些描述符的算法计算代价较高,为了减少与这些描述符相关的内存和计算负载,引入了二值描述符,使它们易于计算

    2023年04月24日
    浏览(36)
  • Lesson4-1:OpenCV图像特征提取与描述---角点特征

    学习目标 理解图像的特征 知道图像的角点 1 图像的特征 大多数人都玩过拼图游戏。首先拿到完整图像的碎片,然后把这些碎片以正确的方式排列起来从而重建这幅图像。如果把拼图游戏的原理写成计算机程序,那计算机就也会玩拼图游戏了。 在拼图时,我们要寻找一些唯一

    2024年02月10日
    浏览(38)
  • 特征点的检测与匹配(ORB,SIFT,SURFT比较)[opencv-python]

    本文旨在总结opencv-python上特征点的检测和匹配。 1、特征点的检测(包括:ORB,SIFT,SURFT) 2、特侦点匹配方法 (包括:暴力法,FLANN,以及随机抽样一致性优化RANSAC算法) 注:由于SURF专利问题,所以opencv官方包目前不支持SURF但支持ORB和SIFT,安装opencv-contrib-python包就可以解决 一

    2024年02月06日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包