特征描述 ORB
ORB 算法创建的特征向量只包含 1 和 0,称为二元特征向量。1 和 0 的顺序会根据特定关键点和其周围的像素区域而变化。该向量表示关键点周围的强度模式,因此多个特征向量可以用来识别更大的区域,甚至图像中的特定对象。
ORB 的特点是速度超快,而且在一定程度上不受噪点和图像变换的影响,例如旋转和缩放变换等。
ORB特征描述
ORB特征基于FAST角点的特征点检测与BRIEF特征描述技术。
与SIFT和SURF相比,速度快是ORB的最大优势。
ORB的基本思路
它是对FAST角点与BRIEF特征描述子的一种结合与改进。
FAST角点检测的缺点
- 缺乏尺度不变性的;
- 可以通过构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性;
BRIEF的缺点
- 缺乏旋转不变性的;
- 需要给BRIEF加上旋转不变性。
BRIEF
BRIEF需要先平滑图像,然后在特征点周围选择一个Patch,在这个Patch内通过一种选定的方法来挑选出来nd个点对。
比较点对中两点像素的大小,进行如下赋值
所有 nd 个点对,都进行比较之间,我们就生成了一个 nd 长的二进制串。
ORB对BRIEF的改进
ORB在计算BRIEF描述子时建立的坐标系是以关键点为圆心,以关键点和取点区域的形心(圆形)的连线为X轴建立坐标系。
计算形心时,圆形区域上每个点的"质量”是其对应的像素值。
完整代码如下
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img1 = cv.imread('H:/pictures/box.png',0) # queryImage
img2 = cv.imread('H:/pictures/box_in_scene.png',0) # trainImage
# Initiate ORB detector
orb = cv.ORB_create()
# find the keypoints and descriptors with ORB
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)
# create BFMatcher object
bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
# Match descriptors.
matches = bf.match(des1,des2)
# Sort them in the order of their distance.
matches = sorted(matches, key = lambda x:x.distance)
# Draw first 10 matches.
img3 = cv.drawMatches(img1,kp1,img2,kp2,matches[:20],None, flags=2)
plt.imshow(img3),plt.show()