ORB特征算法
ORB算法綜合了FAST角點檢測算法和BRIEFF描述符。
FAST特征檢測
- 算法原理
- opencv官方文檔
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))
FAST - threshold100效果圖
FAST - 預設threshold(10)效果圖
BRIEF特征描述符
- 論文
- opencv官方文檔
- 中文版
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論文
- OpenCV官方文檔
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效果