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