ORB(Oriented FAST and Rotated BRIEF) 特征点

ORB特征点结合了FAST角点检测和BRIEF描述子,通过多尺度图像金字塔实现尺度不变性,并引入旋转不变性增强描述子。在保持实时性能的同时,提升了特征提取的效果,广泛应用于实时处理任务。关键步骤包括使用高斯平滑后的二进制向量描述子,计算特征点方向以实现旋转不变,以及通过图像矩确定特征点角度。

ORB(Oriented FAST and Rotated BRIEF) 特征点

Fast角点与brief描述子的基础上,拓展得到ORB特征点。
具有实时性好,提取效果也不错的优势,被广泛应用于需要实时处理处理任务的场景中。

特征提取

预备知识:
FAST角点

Fast角点不具备尺度不变性,某些点在较小尺度下可能是角点而在大尺度下则变成了边缘,如图所示
在这里插入图片描述

因此ORB在提取特征点时进行了改进,利用单张图像金字塔进行多尺度特征提取,得到多尺度下的特征点。
在这里插入图片描述

特征描述

ORB特征点的描述子是在brief描述子基础上添加了类似于sift特征点的旋转不变性
首先我们还是先看原始的brief描述子原理。

brief 描述子(Binary robust independent elementary feature)

利用特征点周围的局部区域内的像素值确定一个向量用来表达和描述该特征点的属性,这个向量被称为描述子。而brief描述子则采用二进制的向量,一般为128-512维。
采用如下的模式生成向量
在这里插入图片描述

对比直线两端像素值的相对大小,记录为对应维度的0,1值。
由于局部的图像对噪声非常敏感,因此通常在计算描述子之前需要对图像进行一次高斯平滑。

生成二进制向量的方式有很多种,原始文献中对不同模式生成的计算策略进行了对比测试。常见的有如下几种:
在这里插入图片描述

添加旋转不变性的主要过程如下:

  • 计算提取特征点的方向
  • 将描述子提取的方法旋转对应的角度
    • 只需要将提取模式的直线旋转对应角度即可

提取特征点的方向

通过类比几何中心和质量中心定义物体的方向,定义特征点的方向,即几何中心指向像素强度中心。
其中几何中心则是特征点的位置,而像素强度中心则类比定义如下:
C = ( m 10 m 00 , m 01 m 00 ) C = \left(\frac{m_{10}}{m_{00}} , \frac{m_{01}}{m_{00}}\right) C=(m00m10,m00m01)

其中, m p q m_{pq} mpq为图像矩,类似于转矩的定义为
m p q = ∑ x , y x p y q I ( x , y ) m_{pq} = \sum_{x,y}x^p y^q I(x,y) mpq=x,yxpyqI(x,y)

因此得到特征点的角度为
θ = arctan ⁡ m 01 m 10 \theta = \arctan \frac{m_{01}}{m_{10}} θ=arctanm10m01

总结

最后总结如下:

ORB特征点在之前较为快速的算法中考虑了尺度不变性与旋转不变性,进一步提高了算法效果,兼顾了实时性和算法性能。

Oriented FAST and Rotated BRIEFORB)是一种用于图像特征提取描述的算法,具有关键点(Oriented FAST描述子(Rotated BRIEF)两个特征,描述子用于描述关键点周围的图像信息,并用描述向量表示 [^1]。 ORB算法包含两部分的改进,一部分是将FAST改进为Oriented FAST,另一部分是将BRIEF改进为Rotated BRIEF [^1]。原始的BRIEF描述子在旋转情况下表现较差,而ORB会根据关键点的方向对BRIEF进行“引导”。对于位置 \((x_i, y_i)\) 处的任意二进制测试特征集,定义一个 \(2 \times n\) 的矩阵 \(S\) ,其包含这些像素的坐标。然后利用图像块的方向 \(\theta\) 找到其旋转矩阵,并对 \(S\) 进行旋转,得到旋转后的版本 \(S_{\theta}\) [^2]。此外,ORB特征点的描述子是在BRIEF描述子基础上添加了类似于SIFT特征点的旋转不变性 [^3]。 在应用方面,ORB由于其快速有效的特点,在计算机视觉领域有广泛应用。例如在图像匹配任务中,通过提取ORB特征点描述子,可以快速准确地找到不同图像中的匹配点;在视觉SLAM(同时定位与地图构建)中,ORB可以用于提取环境特征,辅助机器人或相机进行定位地图构建。 以下是使用OpenCV库实现ORB特征提取匹配的Python示例代码: ```python import cv2 import numpy as np # 读取图像 img1 = cv2.imread('image1.jpg', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('image2.jpg', cv2.IMREAD_GRAYSCALE) # 创建ORB对象 orb = cv2.ORB_create() # 检测关键点并计算描述子 kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # 创建BFMatcher对象 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 匹配描述子 matches = bf.match(des1, des2) # 按距离排序 matches = sorted(matches, key=lambda x: x.distance) # 绘制前10个匹配 img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS) # 显示结果 cv2.imshow('Matches', img3) cv2.waitKey(0) cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值