opencv 33 SURF特徵檢測

2021-09-25 11:11:54 字數 3309 閱讀 7304

surf(speededup robust features)—加速穩健特徵演算法, 在2006 年由bay.h和van gool.l共同提出, surf是尺度不變特徵變換sift的加速版。一般來說, 標準的surf運算元比sift運算元快好幾倍, 並且在多幅影象下具有更好的穩定性。surf最大的特徵在於採用了harr特徵以及積分影象的概念, 這大大加快了程式執行時間,可以應用於物體識別以及三維重建中。

surf演算法簡介: 

在sift中, lowe 在構建尺度空間時使用dog對log進行近似, surf使用盒子濾波器(box_filter)對log 進行近似, 右圖顯示了這種近似。在進行卷積計算時可以利用積分影象(積分影象的一大特點是: 計算影象中某個視窗內所有畫素和時, 計算量的大小與視窗大小無關), 是盒子濾波器的一大優點, 而且這種計算可以在不同尺度空間同時進行。同樣 surf 演算法計算關鍵點的尺度和位置是也是依賴與 hessian 矩陣行列式的。 

為了保證特徵向量具有旋轉不變形, 需要對於每乙個特徵點分配乙個主要方向, 需要以特徵點為中心, 以6s(s為特徵點的尺度)為半徑的圓形區域內, 對影象進行harr 小波相應運算。這樣做實際就是對影象進行梯度運算, 但是利用積分影象, 可以提高計算影象梯度的效率, 為了求取主方向值, 需要設計乙個以方向為中心, 張角為60度的扇形滑動視窗, 以步長為0.2弧度左右旋轉這個滑動視窗, 並對視窗內的影象haar 小波的響應值進行累加, 主方向為最大的haar響應累加值對應的方向。在很多應用中根本就不需要旋轉不變性, 所以沒有必要確定它們的方向, 如果不計算方向的話,又可以使演算法提速。surf提供了稱為u-surf 的功 

能, 它具有更快的速度, 同時保持了對+/-15 度旋轉的穩定性。opencv對這兩種模式同樣支援, 只需要對引數upright進行設定, 當upright為0時計算方向, 為1時不計算方向, 同時速度更快。 

生成特徵點的特徵向量需要計算影象的haar小波響應, 在乙個矩形的區域內, 以特徵點為中心, 沿主方向將 20s*20s 的影象劃分成 4*4 個子塊, 每個子塊利用尺寸2s的haar小波模版進行響應計算, 然後對響應值進行統計, 組成向量v = ( ∑ dx, ∑ dy, ∑ |dx |, ∑ |dy | )這個描述符的長度為 64, 降低的維度可以加速計算和匹配, 但又能提供更容易區分的特徵。 

在檢測特徵點的過程中計算了 hessian 矩陣的行列式, 與此同時, 計算得到了 hessian 矩陣的跡, 矩陣的跡為對角元素之和。 

按照亮度的不同, 可以將特徵點分為兩種, 第一種為特徵點及其周圍小鄰域的亮度比背景區域要亮, hessian矩陣的跡為正; 另外一種為特徵點及其周圍小鄰域的亮度比背景區域要暗, hessian矩陣為負值。根據這個特性, 首先對兩個特徵點的hessian 的跡進行比較, 如果同號, 說明兩個特徵點具有相同的對比度; 如果異號的話, 說明兩個特徵點的對比度不同, 放棄特徵點之間後續的相似性度量。 

對於兩個特徵點描述子的相似性度量, 我們採用歐式距離進行計算。簡單來說 surf 演算法採用了很多方法來對每一步進行優化從而提高速度, 分析顯示在結果效果相當的情況下 surf 的速度是sift的3倍。surf善於處理具有模糊和旋轉的影象, 但是不善於處理視角變化和光照變化。

//定義surf特徵檢測類物件

surffeaturedetector surfdetector(400);

//定義keypoint變數

vectorkeypoints1;

vectorkeypoints2;

//特徵點檢測

surfdetector.detect(srcimg1, keypoints1);

surfdetector.detect(srcimg2, keypoints2);

//繪製特徵點(關鍵點)

mat feature_pic1, feature_pic2;

//drawkeypoints(srcimg1, keypoints1, feature_pic1, scalar(0, 255, 0));

//drawkeypoints(srcimg2, keypoints2, feature_pic2, scalar(0,255, 0));

drawkeypoints(srcimg1, keypoints1, feature_pic1, scalar::all(-1), drawmatchesflags::draw_rich_keypoints);

drawkeypoints(srcimg2, keypoints2, feature_pic2, scalar::all(-1), drawmatchesflags::draw_rich_keypoints);

//顯示原圖

imshow("src1", srcimg1);

imshow("src2", srcimg2);

//顯示結果

imshow("feature1", feature_pic1);

imshow("feature2", feature_pic2);

waitkey(0);

#include "opencv2/opencv.hpp"

#include #include #include #includeusing namespace std;

using namespace cv;

void main()

cout<

for(int i=0; i#include #include #includeusing namespace std;

using namespace cv;

void main()

cout<

for(int i=0; i

mat result;

//drawmatches(srcimg1, keypoints1, srcimg2, keypoints2, matches, result, scalar::all(-1), scalar::all(-1));

drawmatches(srcimg1, keypoints1, srcimg2, keypoints2, good_matches, result, scalar(0, 255, 0), scalar::all(-1));

imshow("match_result", result);

waitkey(0);

}

opencv 4 2 0使用SURF演算法

opencv的編譯與配置參考 記得使用cmak進行配置時,需要勾選opencv enable nofree,要不是後面使用surf演算法是會報錯的。另外就是如果是debug就引用debug的opencv lib,如果是realse就引用opencv realse的lib,不要引錯了。include ...

opencv 特徵點檢測 sift和surf

關於在opecv中使用,sift和surf進行特徵點檢測,主要分為三步 一.新增lib檔案。在opencv新版本中,上述了兩個演算法寫到了non free中,需要新增opencv nonfree244d.lib debug時新增 或opencv nonfree244.lib release時添 加 ...

opencv3 2中的SURF用法

opencv3.2中surffeaturedetector surfdescriptorextractor bruteforcematcher這三個的使用方法已經和原先2.4版本前不一樣了。使用方法示例如下 ptrdetector surf create minhessian detector de...