理論
在前一節(jié)木柬,我們看到了SIFT來做關(guān)鍵點檢測和描述皆串,但是它相對來說比較慢,人們需要更快的版本眉枕。在2006恶复, 三個人,Bay速挑,H.谤牡,Tuytelaars,T.和Van Gool, L, 發(fā)表了另一篇論文“SURF: Speeded Up Robust Features”介紹了一個新的算法叫SURF,名字中可以知道姥宝,他是加速版的SIFT拓哟。
SURF用盒子過濾器來近似LoG,下面的圖演示了這種近似伶授。一個很大的好處是用盒子過濾器卷積可以很容易的計算断序,還可以在不同尺度并行計算。SURF在尺度和位置上依賴Hessian矩陣的決定糜烹。
OpenCV里的SURF
OpenCV提供了SURF函數(shù)违诗,你用一些可選條件,比如64/128-維的描述來初始化一個SURF對象疮蹦,然后做SIFT诸迟,我們可以使用SURF.detect(), SURF.compute()來找關(guān)鍵點和描述愕乎。
首先我們會看到一個簡單的demo
>>> img = cv2.imread('fly.png',0)
# Create SURF object. You can specify params here or later.
# Here I set Hessian Threshold to 400
>>> surf = cv2.SURF(400)# Find keypoints and descriptors directly
>>> kp, des = surf.detectAndCompute(img,None)>>> len(kp)
699
1199個關(guān)鍵點太多阵苇,我們減少到50好畫他們,當匹配時我們需要所有的特征感论,所以我們提高Hessian閾值绅项。
# Check present Hessian threshold
>>> print surf.hessianThreshold
400.0# We set it to some 50000. Remember, it is just for representing in picture.
# In actual cases, it is better to have a value 300-500
>>> surf.hessianThreshold = 50000# Again compute keypoints and check its number.
>>> kp, des = surf.detectAndCompute(img,None)>>> print len(kp)
47
這比50少了,我們畫出它來
>>>img2=cv2.drawKeypoints(img,kp,None,(255,0,0),4)
>>>plt.imshow(img2),plt.show()
現(xiàn)在使用U-SURF.
# Check upright flag, if it False, set it to True
>>> print surf.upright
False>>> surf.upright = True
# Recompute the feature points and draw it
>>> kp = surf.detect(img,None)
>>> img2 = cv2.drawKeypoints(img,kp,None,(255,0,0),4)>>> plt.imshow(img2),plt.show()
看下面的結(jié)果比肄,所有的方向都一樣了快耿,這比前面的更快,如果你遇到的是不太關(guān)心方向的芳绩,這就更好掀亥。
最后我們檢查描述的大小,如果是64維的話就把它變成128妥色。
# Find size of descriptor
>>> print surf.descriptorSize()
64# That means flag, "extended" is False.
>>> surf.extended
False# So we make it to True to get 128-dim descriptors.
>>> surf.extended = True
>>> kp, des = surf.detectAndCompute(img,None)
>>> print surf.descriptorSize()
128
>>> print des.shape
(47, 128)