RobHess的SIFT源码分析:综述
最初的目的是想做全景圖像拼接,一開始找了OpenCV中自帶的全景拼接的樣例,用的是Stitcher類,可以很方便的實現全景拼接,而且效果很好,但是不利于做深入研究。
Stitcher類使用方法請查OpenCV API:http://docs.opencv.org/2.4.4/modules/refman.html,搜索Stitcher
使用OpenCV中自帶的Stitcher類的全景圖像拼接樣例下載:http://download.csdn.net/detail/masikkk/5661075
圖像拼接及源碼下載參見此篇博文:基于SIFT特征的全景圖像拼接
后來想用OpenCV中自帶的SIFT特征檢測器進行特征檢測和拼接,但還是有隔靴搔癢的感覺,接觸不到SIFT算法的本質,
看到網上大多數都是使用RobHess的SIFT源碼,自己也下載了一份進行了分析。
RobHess的SIFT源碼下載地址:http://robwhess.github.io/opensift/
一些SIFT算法和全景拼接測試用圖下載,包含牛津大學網站上提供的測試圖:http://download.csdn.net/detail/masikkk/5702749
一開始也是感覺比較亂,不知道怎么用,接觸了一段時間后比較清晰了,下面說一下RobHess的SIFT源碼中的幾個文件都是做什么用的,方便剛接觸的同學學習。
(1)?imgfeatures.h和imgfeatures.c文件
imgfeatures.h中有SIFT特征點結構struct feature的定義,這個結構很重要,后面都要用到,除此之外還有一些特征點的導入導出以及特征點繪制函數的聲明。
對應的imgfeatures.c文件中是特征點的導入導出以及特征點繪制函數的實現。
?imgfeatures.h和imgfeatures.c的源碼分析在這里:RobHess的SIFT源碼分析:imgfeatures.h和imgfeatures.c文件
里面有特征點結構struct feature的詳細說明。
(2) utils.h和utils.c文件
這兩個文件中是一些圖像基本操作的函數,包括:
1、獲取某位置的像素點
2、設置某位置的像素點(8位,32位和64位),
3、計算兩點之間的距離的平方
4、在圖片某一點畫一個“X”
5、將兩張圖片合成為一個(在特征匹配中用到),高是二者之和,寬是二者的較大者。
(3) sift.h和sift.c文件
這兩個是最重要的,里面的內容說白了很簡單,就是兩個特征點檢測函數sift_features()和?_sift_features(),
sift_features()是用默認參數進行特征點檢測,?_sift_features()允許用戶輸入各種檢測參數,其實sift_features()中也是再次調用_sift_features()函數。
所以,你只需提供原圖像和存儲特征點的數組以及其他一些檢測參數,然后調用sift_features()或 _sift_features()就可完成SIFT特征點檢測。
但是這兩個文件分析起來也是最復雜的。
sift.h中有默認的各種特征檢測中用到的參數的宏定義,sift.c中是檢測函數的實現,是最核心的一個文件,里面的一些未暴露接口的本地函數就有31個之多。
仔細分析完后發現大神就是大神,程序寫的條理非常清楚,尤其是函數_sift_features()的函數體,從頭到尾的幾部分正好對應SIFT算法的幾個步驟,
把一些細節全部放在子函數中,非常清楚明了。
關于SIFT算法的原理,可以參加下面幾篇文章,寫的都不錯:
小魏的SIFT原理與源碼分析系列文章:【OpenCV】SIFT原理與源碼分析
zddmail的SIFT算法詳解,講的不錯,尤其一些細節講的與眾不同:SIFT算法詳解
Rachel-Zhang的SIFT算法分析:SIFT特征提取分析
July的經典算法研究系列中的SIFT算法分析:經典算法研究系列:九、圖像特征提取與匹配之SIFT算法
以及July的教你一步一步實現SIFT算法:九之再續:教你一步一步用c語言實現sift算法、上
tornadomeet的SIFT算法分析:特征點檢測學習_1(sift算法)
以及這篇博客中的SIFT算法分析:SIFT 特征提取算法總結
還有這篇結合RobHess源碼的SIFT算法分析:SIFT算法研究
還有我覺得講的挺詳細的一篇文章:http://download.csdn.net/detail/masikkk/5661453
或者你也可以直接讀David.Lowe發表的英文原版論文:
David.Lowe1999年發表在ICCV的SIFT論文:http://download.csdn.net/detail/masikkk/5661441
David.Lowe2004年發表在IJCV的SIFT改進論文:http://download.csdn.net/detail/masikkk/5661447
sift.h和sift.c的源碼分析在這里:RobHess的SIFT源碼分析:sift.h和sift.c文件
(4) minpq.h和minpq.c文件
這兩個文件中實現了最小優先級隊列(Minimizing Priority Queue),也就是小頂堆,在k-d樹的建立和搜索過程中要用到。
(5) kdtree.h和kdtree.c文件
這兩個文件中實現了k-d樹的建立以及用BBF(Best Bin First)算法搜索匹配點的函數。
如果你需要對兩個圖片中的特征點進行匹配,就要用到這兩個文件。
關于k-d樹算法的講解,可參考這篇文章:k-d tree算法
以及這篇:k-d tree算法的研究
還有這篇,里面講解了k-d樹,BBF和RANSAC:SIFT特征點匹配與消除錯配:BBF,RANSAC
以及July的一篇:從K近鄰算法、距離度量談到KD樹、SIFT+BBF算法
kdtree.h和kdtree.c的源碼分析在這里:RobHess的SIFT源碼分析:kdtree.h和kdtree.c文件
(6) xform.h和xform.c文件
這兩個文件中實現了RANSAC算法(RANdom SAmple Consensus 隨機抽樣一致)。
RANSAC算法可用來篩選兩個圖像間的SIFT特征匹配并計算變換矩陣。
你可以單純利用RANSAC算法篩選兩個圖像間的SIFT特征匹配,以得到更好的匹配結果,
見此文:利用RANSAC算法篩選SIFT特征匹配
或者想要進行全景拼接時,利用RANSAC算法計算兩個圖像間的變換矩陣。
關于RANSAC算法的講解,可參考這篇文章:隨機抽樣一致 RANSAC
以及這篇,里面有用RANSAC算法解決線性回歸問題的例子:我的數學之美(一)——RANSAC算法詳解
以及這篇,里面講解了k-d樹,BBF和RANSAC:SIFT特征點匹配與消除錯配:BBF,RANSAC
xform.h和xform.c的源碼分析在這里:RobHess的SIFT源碼分析:xform.h和xform.c文件
(7) 其他文件:dspfeat.c,match.c,siftfeat.c
這幾個文件中是一些使用SIFT算法的小例子:
dspfeat.c文件可以從預先保存的特征點文件中讀取特征點并顯示在圖片上。
match.c文件可以檢測兩個圖像中的特征點并進行匹配。
siftfeat.c文件利用SIFT算法檢測特征點,有一些控制臺操作提示。
from:?http://blog.csdn.net/masibuaa/article/details/9191309
總結
以上是生活随笔為你收集整理的RobHess的SIFT源码分析:综述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用RANSAC算法筛选SIFT特征匹配
- 下一篇: OpenCV2.4.4中调用SIFT特征