溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測

發(fā)布時(shí)間:2021-11-26 10:14:58 來源:億速云 閱讀:524 作者:小新 欄目:大數(shù)據(jù)

這篇文章主要介紹C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!


 

SIFT特征和SURF特征比較

比較項(xiàng)目SIFTSURF
尺度空間極值檢測使用高斯濾波器,根據(jù)不同尺度的高斯差(DOG)圖像尋找局部極值使用方形濾波器,利用海森矩陣的行列式值檢測極值,并利用積分圖加速運(yùn)算
關(guān)鍵點(diǎn)定位通過鄰近信息插補(bǔ)來定位與SIFT類似
方向定位通過計(jì)算關(guān)鍵點(diǎn)局部鄰域的方向直方圖,尋找直方圖中最大值的方向作為關(guān)鍵點(diǎn)的主方向通過計(jì)算特征點(diǎn)周圍像素點(diǎn)x,y方向的哈爾小波變換,將x、y方向小波變換的和向量的最大值作為特征點(diǎn)方向
特征描述子是關(guān)鍵點(diǎn)鄰域高斯圖像梯度方向直方圖統(tǒng)計(jì)結(jié)果的一種表示,是16*8=128維向量是關(guān)鍵點(diǎn)鄰域2D離散小波變換響應(yīng)的一種表示,是16*4=64維向量
應(yīng)用中的主要區(qū)別通常在搜索正確的特征時(shí)更加精確,當(dāng)然也更加耗時(shí)描述子大部分基于強(qiáng)度的差值,計(jì)算更快捷

SIFT特征基本介紹

SIFT(Scale-Invariant Feature Transform)特征檢測關(guān)鍵特征:

  • 建立尺度空間,尋找極值

  • 關(guān)鍵點(diǎn)定位(尋找關(guān)鍵點(diǎn)準(zhǔn)確位置與刪除弱邊緣)

  • 關(guān)鍵點(diǎn)方向指定

  • 關(guān)鍵點(diǎn)描述子


建立尺度空間,尋找極值

工作原理

  1. 構(gòu)建圖像高斯金字塔,求取DOG,發(fā)現(xiàn)最大與最小值在每一級(jí)

  2. 構(gòu)建的高斯金字塔,每一層根據(jù)sigma的值不同,可以分為幾個(gè)待級(jí),最少有4個(gè)。


關(guān)鍵點(diǎn)定位

  • 我們在像素級(jí)別獲得了極值點(diǎn)的位置,但是更準(zhǔn)確的值應(yīng)該在亞像素位置,如何得到--這個(gè)過程稱為關(guān)鍵點(diǎn)(準(zhǔn)確/精確)定位。

  • 刪除弱邊緣--通過Hassian矩陣特征值實(shí)現(xiàn),小于閾值自動(dòng)舍棄。


關(guān)鍵點(diǎn)方向指定

  • 求得每一層對應(yīng)圖像的梯度,根據(jù)給定的窗口大小

  • 計(jì)算每個(gè)高斯權(quán)重,sigma=scale*1.5, 0-360之間建立36個(gè)直方圖Bins

  • 找最高峰對應(yīng)的Bin,大于max*80%的都保留

  • 這樣就實(shí)現(xiàn)了旋轉(zhuǎn)不變性,提高了匹配時(shí)候的穩(wěn)定性

  • 大約有15%的關(guān)鍵點(diǎn)會(huì)有多個(gè)方向


關(guān)鍵點(diǎn)描述子

  • 擬合多項(xiàng)式插值尋找最大Peak

  • 得到描述子 = 4*4*8=128

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測


構(gòu)造函數(shù)

cv::xfeatures2d::SIFT::create(

     int  nfeatures = 0,

     int  nOctaveLayers = 3,    --高斯金字塔乘積數(shù)

     double contrastThreshold = 0.04,    --對比度

     double edgeThreshold = 10,   --邊緣閾值,一般默認(rèn)10就行

     double sigma = 1.6     

)

代碼演示

我們再新建一個(gè)項(xiàng)目名為opencv--sift,按照配置屬性(VS2017配置OpenCV通用屬性),然后在源文件寫入#include和main方法

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測

記得我們要加上opencv2\xfeatures2d.hpp

使用SIFT檢測,其實(shí)紅框里面是我們定義的參數(shù),可以修改一下參數(shù)進(jìn)行變化

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測

運(yùn)行效果

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測

上面左邊紅框處就是我們獲取了多少個(gè)KeyPoints并打印出來,可以看到這個(gè)比SURF檢測明顯要少了不少,說明檢測的更為細(xì)致了,不過也比SURF花費(fèi)的時(shí)間要長一點(diǎn)。


接下來我們改一下參數(shù)

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測

再看一下運(yùn)行效果

C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測

可以看到獲取到的Keypoints的特征點(diǎn)更少了。

以上是“C++ OpenCV特征提取之如何實(shí)現(xiàn)SIFT特征檢測”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI