ORB特征检测
程序员文章站
2022-03-13 22:05:56
...
ORB概述
- ORB(Oriented FAST and Rotated BRIEF)是一种快速特征点提取和描述的算法。
- 这个算法是由Ethan Rublee, Vincent Rabaud, Kurt Konolige以及Gary R.Bradski在2011年一篇名为“ORB:An Efficient Alternative to SIFT or SURF”的文章中提出。
- ORB算法分为两部分,分别是特征点提取和特征点描述。特征提取是由FAST(Features from Accelerated Segment Test)算法发展来的,特征点描述是根据BRIEF(Binary Robust Independent Elementary Features)特征描述算法改进的。
- ORB = oFast + rBRIEF。据称ORB算法的速度是sift的100倍,是surf的10倍。
- ORB算子在SLAM及无人机视觉等领域得到广泛应用。
oFAST特征提取
ORB算法的特征提取是由FAST算法改进的,这里称为oFAST(FAST keypoint Orientation),在使用FAST提取出特征点之后, 给其定义一个特征点方向,以此来实现特征点的旋转不变性。
oFAST实现步骤:
- 粗提取
- 筛选最优特征点
- 使用非极大值抑制算法去除临近位置多个特征点
- 建立金字塔以实现特征点多尺度不变性
rBRIEF特征描述
ORB算法的特征描述是由BRIEF算法改进的,这里称为rBRIEF(Rotation-Aware Brief)。也就是说,在BRIEF特征描述的基础上加入旋转因子从而改进BRIEF算法。
算法描述:
BRIEF算法计算出来的是一个二进制串的特征描述符。它是在一个特征点的邻域内,选择n对像素点pi、qi(i=1,2,…,n)
比较每个点对的灰度值的大小,如果I(pi)> I(qi),则生成二进制串中的1,否则为0。
所有的点对都进行比较,则生成长度为n的二进制串。一般n取128、256或512,opencv默认为256。
rBRIEF实现步骤:
- 以关键点P为圆心,以d为半径做圆O。
- 在圆O内某一模式选取N个点对。这里为方便说明,N=4,实际应用中N可以取512。
- 定义操作T。
- 分别对已选取的点对进行T操作,将得到的结果进行组合。
Python实现:
import cv2 as cv
import numpy as np
# 读入左右反向图片
imgL = cv.imread("left03.jpg")
imgR = cv.imread("right03.jpg")
# 灰度图转换
grayL = cv.cvtColor(imgL, cv.COLOR_BGR2GRAY)
grayR = cv.cvtColor(imgR, cv.COLOR_BGR2GRAY)
# 创建orb算子以及提取描述子
orb = cv.ORB_create()
kpL, dstL = orb.detectAndCompute(grayL, None)
kpR, dstR = orb.detectAndCompute(grayR, None)
# 创建FBMatcher类对象,并且进行匹配
BF = cv.BFMatcher(cv.NORM_L2)
matches = BF.match(dstL, dstR)
# 显示orb匹配结果
img1 = cv.drawMatches(imgL, kpL, imgR, kpR, matches, None, flags=2)
cv.imshow("ORB", img1)
#--------------------------------------#
# 初始化Bruteforce匹配器
bf = cv.BFMatcher()
# 通过KNN匹配两张图片的描述子
matches = bf.knnMatch(dstL, dstR, k=2)
# 筛选比较好的匹配点
good = []
for i, (m, n) in enumerate(matches):
if m.distance < 0.85 * n.distance:
good.append(m)
# 画出匹配点
img2 = cv.drawMatches(imgL, kpL, imgR, kpR, good, None, flags=2)
cv.imshow("ORB-BF", img2)
cv.waitKey(0)
cv.destroyAllWindows()
效果显示: