特征提取算法与图像描述符[ORB]
程序员文章站
2024-03-25 19:22:16
...
ORB特征算法
ORB算法综合了FAST角点检测算法和BRIEFF描述符。
FAST特征检测
FAST只是一种特征点检测算法,并不涉及特征点的特征描述。
fast = cv2.FastFeatureDetector_create(threshold=10)
img = cv2.imread("laugh.jpg", 0)
fast = cv2.FastFeatureDetector_create()
keypoints = fast.detect(img, None)
img = cv2.drawKeypoints(img, keypoints, None, (0, 0, 255))
BRIEF特征描述符
Brief是Binary Robust Independent Elementary Features的缩写。这个特征描述子是由EPFL的Calonder在ECCV2010上提出的。主要思路就是在特征点附近随机选取若干点对,将这些点对的灰度值的大小,组合成一个二进制串,并将这个二进制串作为该特征点的特征描述子。文章同样提到,在此之前,需要选取合适的gaussian kernel对图像做平滑处理。
缺点
1:不具备旋转不变性。
2:对噪声敏感
3:不具备尺度不变性。
img = cv2.imread("laugh.jpg", 0)
# Initiate FAST detector
star = cv2.xfeatures2d.StarDetector_create()
# Initiate BRIEF extractor
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
# find the keypoints with STAR
kp = star.detect(img, None)
# compute the descriptors with BRIEF
kp, des = brief.compute(img, kp)
print(brief.descriptorSize())
print(des.shape)
ORB
ORB采用了FAST作为特征点检测算子,特征点的主方向是通过矩(moment)计算而来解决了BRIEF不具备旋转不变性的问题。
ORB还做了这样的改进,不再使用pixel-pair,而是使用9×9的patch-pair,也就是说,对比patch的像素值之和,解决了BRIEF对噪声敏感的问题。
关于计算速度:
ORB是sift的100倍,是surf的10倍。
import cv2
img = cv2.imread("A.jpg", 0)
orb = cv2.ORB_create()
kp, des = orb.detectAndCompute(img, None)
上一篇: ORB SLAM2中的mlNewKeyFrames用法
下一篇: Java中的NaN类型