日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

發布時間:2023/11/27 生活经验 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

OpenCV中的SURF(加速健壯功能)

    • 1. 效果圖
    • 2. 原理
      • 2.1 為什么SURF比SIFT快?
      • 2.3 怎樣獲取SIFT與SURF?
    • 3. 源碼
    • 參考

上一篇博客介紹了用于關鍵點檢測和描述的SIFT,但它相對較慢,這篇博客將介紹其優化版本——SURF(Speeded-Up Robust Features 加速魯棒特征),它是加速版的SIFT;

  • 在SIFT中,Lowe用高斯差分近似高斯的拉普拉斯算子來尋找尺度空間。
  • SURF借助于積分圖像,可以很容易地計算帶盒濾波器的卷積。并行計算不同的尺度。此外,SURF還依賴于規模和位置的Hessian矩陣行列式。
  • SURF增加了許多功能以提高每一步的速度。它比SIFT快3倍,而性能與SIFT相當。
  • SURF擅長處理模糊和旋轉的圖像,但不擅長處理視點變化和照明變化。

1. 效果圖

SURF默認參數效果圖如下:

檢查到的關鍵點比較多,把原圖覆蓋完了。

SURF調整閾值,檢查到關鍵點近50個,效果圖如下:

使用U-SURF不計算方向,方向全為一個,SURF關鍵點效果圖如下:

默認以64D計算效果圖如上,調整為128D,U-SURF效果圖如下:基本沒差別

2. 原理

OpenCV使用 SURF.detect()、SURF.compute()等來查找關鍵點和描述符。

2.1 為什么SURF比SIFT快?

  • 在任何尺度下,利用積分圖像都可以很容易地發現小波響應。
  • 不考慮旋轉不變形,因此不需要找到方向會加快過程。
  • SURF提供了一種稱為Upright-SURF或U-SURF的功能。它提高了速度,±15°之間非常健壯。
  • OpenCV支持Upright-SURF、U-SURF,具體取決于標志。如果為0,則計算方向。如果為1,則不計算方向,速度更快。
  • 維數越低,計算和匹配的速度越快,但特征的顯著性越好。OpenCV通過分別為64 dim和128 dim設置擴展為0和1的標志值(默認值為128 dim)來支持這兩種功能
  • 另一個重要的改進是對潛在興趣點使用拉普拉斯符號(Hessian矩陣的軌跡)。它不增加計算成本。拉普拉斯符號將黑暗背景上的明亮斑點與相反情況區分開來。
  • 在匹配階段,只比較具有相同對比度的特征(如下圖所示)。這種最小的信息允許更快的匹配,而不會降低描述符的性能。

2.3 怎樣獲取SIFT與SURF?

  • https://stackoverflow.com/questions/64525121/sift-surf-set-opencv-enable-nonfree-cmake-solution-opencv-3-opencv-4

  • https://www.pianshen.com/article/8283162836/

SIFT、SURF是有專利的算法,在OpenCV3.0以上時已去除。移到了opencv-contrib-python版本中。所以有以下方法可以獲取:
1)安裝opencv3以下版本
2)卸載opencv3以上版本,opencv-contrib-python安裝指定版本
3)安裝opencv3以上版本,安裝opencv-contrib-python,源碼編譯安裝opencv;

綜上方法2更方便可行,只需要倆步:

  1. 卸載opencv-python
  2. 安裝指定版本opencv-contrib-python==3.4.2.17
pip uninstall opencv-pythonpip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-contrib-python==3.4.2.17

可以看到成功了

3. 源碼

# 尋找SURF關鍵點和描述符并繪制
import cv2
from matplotlib import pyplot as pltimg = cv2.imread('images/butterfly.jpg', 0)# 創建SURF對象,可以在創建時指定參數也可以稍后設置參數
# 此處設置 Hessian閾值為 400
sift = cv2.xfeatures2d.SIFT_create()
print('sift: ', sift)
surf = cv2.xfeatures2d.SURF_create()
print('surf: ', surf,' \ndefaultParameter\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())# 尋找SURF關鍵點和描述符
# kp:返回的關鍵點列表,des:numpy數組
kp, des = surf.detectAndCompute(img, None)
# 繪制關鍵點在圖片上
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)
plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('more keypoints'), plt.show()print('keypoints: ', len(kp))# 檢查當前Hessian閾值
# print(surf.getHessianThreshold())# 調整Hessian閾值,此處設置為50000,但一般最佳設置為300~500
surf.setHessianThreshold(50000)
print(' parameters\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())# 再一次計算關鍵點和描述符
kp, des = surf.detectAndCompute(img, None)print('keypoints: ', len(kp))# 繪制關鍵點在圖片上
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('less than 50 keypoints'), plt.show()# U-SURF不會計算方向
# print(surf.getUpright())
surf.setUpright(True)
print(' parameters\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())# 重新計算關鍵點和描述符,并繪制
kp = surf.detect(img, None)
print('keypoints: ', len(kp))
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('U-SURF'), plt.show()# 所有方向顯示在同一方向,它比以前快多了。如果您正在處理方向不成問題的情況(如全景縫合)等,使用U-SURF會更好。
# 尋找描述符的大小
# print(surf.descriptorSize())
# extended為false,默認為64D
# print(surf.getExtended())# 設置描述符為128D
surf.setExtended(True)
print(' parameters\thessianThreshold: ', surf.getHessianThreshold(),' upright: ', surf.getUpright(),' extended: ', surf.getExtended(),' descriptors: ',surf.descriptorSize())kp, des = surf.detectAndCompute(img, None)
print('keypoints: ',len(kp))
img2 = cv2.drawKeypoints(img, kp, None, (255, 0, 0), 4)plt.imshow(img2), plt.xticks([]), plt.yticks([]), plt.title('128D res'), plt.show()

參考

總結

以上是生活随笔為你收集整理的OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。