## sift算法的編譯與實現
代碼:Rob Hess維護的sift 庫。
環境:windows xp+vc6.0。
條件:opencv1.0、gsl-1.8.exe
昨日,下載了Rob Hess的sift庫,將其源碼粗略的看了看,想要編譯時,遇到了不少問題,先修改了下代碼,然后下載opencv、gsl。最后,幾經周折,才最終編譯成功。
以下便是sift源碼庫編譯后的效果圖:



為了給有興趣實現sift算法的朋友提供個參考,特整理此文如下。要了解什么是sift算法,請參考:[九、圖像特征提取與匹配之SIFT算法](http://blog.csdn.net/v_JULY_v/article/details/6186942)。ok,咱們下面,就來利用Rob Hess維護的sift 庫來實現sift算法:
首先,請下載Rob Hess維護的sift 庫:
<http://blogs.oregonstate.edu/hess/code/sift>
下載Rob Hess的這個壓縮包后,如果直接解壓縮,直接編譯,那么會出現下面的錯誤提示:
編譯提示:error C1083: Cannot open include file: 'cxcore.h': No such file or directory,找不到這個頭文件。
這個錯誤,是因為你還沒有安裝opencv,因為:cxcore.h和cv.h是開源的OPEN CV頭文件,不是VC++的默認安裝文件,所以你還得下載OpenCV并進行安裝。然后,可以在OpenCV文件夾下找到你所需要的頭文件了。
據網友稱,截止2010年4月4日,還沒有在VC6.0下成功使用opencv2.0的案例。所以,如果你是VC6.0的用戶請下載opencv1.0版本。vs的話,opencv2.0,1.0任意下載。
以下,咱們就以**vc6.0為平臺舉例,下載并安裝opencv1.0版本、gsl**等。當然,你也可以用vs編譯,同樣下載opencv(具體版本不受限制)、gsl等。
請按以下步驟操作:
### 一、下載opencv1.0
<http://sourceforge.net/projects/opencvlibrary/files/opencv-win/1.0/OpenCV_1.0.exe/download>
### 二、安裝opencv1.0,配置Windows環境變量
1. **安裝注意:**假如你是將OpenCV安裝到**C**:/Program Files/OpenCV(**如果你安裝的時候選擇不是安裝在C盤,則下面所有對應的C盤都改為你所安裝在的那個“X盤”,即可**),在安裝時選擇"將/OpenCV/bin加入系統變量",打上“勾”。(Add/OpenCV/bin to the systerm PATH。**這一步確認選上了之后,下面的檢查環境變量的步驟,便可免去**)

2. **檢查環境變量。**為了確保上述步驟中,加入了系統變量,在安裝opencv1.0成功后,還得檢查C:/Program Files/OpenCV/bin是否已經被加入到環境變量PATH,如果沒有,請加入。
3. **最后是配置Visual C++ 6.0。**
* 全局設置
菜單Tools->Options->Directories:先設置lib路徑,選擇Library files,在下方填入路徑:
**C:/Program Files/OpenCV/lib**
然后選擇include files,在下方填入路徑(參考下圖):
**C:/Program Files/OpenCV/cxcore/include**
**C:/Program Files/OpenCV/cv/include**
**C:/Program Files/OpenCV/cvaux/include**
**C:/Program Files/OpenCV/ml/include**
**C:/Program Files/OpenCV/otherlibs/highgui**
**C:/Program Files/OpenCV/otherlibs/cvcam/include**

最后選擇source files,在下方填入路徑:
**C:/Program Files/OpenCV/cv/src**
**C:/Program Files/OpenCV/cxcore/src**
**C:/Program Files/OpenCV/cvaux/src**
**C:/Program Files/OpenCV/otherlibs/highgui**
**C:/Program Files/OpenCV/otherlibs/cvcam/src/windows**
* 項目設置
每創建一個將要使用OpenCV的VC Project,都需要給它指定需要的lib。菜單:Project->Settings,然后將Setting for選為All Configurations,然后選擇右邊的link標簽,在Object/library modules附加上:
cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib
當然,你不需要這么多lib,你可以只添加你需要的lib(見下圖)

### 三、下載gsl,gsl也是一個庫,也需要下載:
<http://sourceforge.net/projects/gnuwin32/files/gsl/1.8/gsl-1.8.exe/download>。在編譯時候GSL也是和OpenCV一樣要把頭文件和lib的路徑指定好。
### 四、配置gsl
將C:/WinGsl/bin中的WinGsl.dll和WinGslD.dll復制到C:/VC6.0/Bin;將整個Gsl目錄復制到C:/VC6.0/Bin下;lib目錄下的所有.lib文件全部復制到C:/VC6.0/Lib下。
然后,在tools-options-directories中,將C:/WinGsl下的lib,gsl分別加入到庫文件和頭文件的搜索路徑中。
**以下是可能會出現的錯誤情況處理:**
1. OpenCV安裝后“沒有找到cxcore100.dll”的錯誤處理
在安裝時選擇“將/OpenCV/bin加入系統變量”(Add/OpenCV/bin to the systerm PATH)。 但該選項并不一定能成功添加到系統變量,如果編寫的程序在運行時出現“沒有找到cxcore100.dll,因為這個應用程序未能啟動。重新安裝應用程序可能會修復此問題。”的錯誤。
手動在我的電腦->屬性->高級->環境變量->系統變量->path添加c:/program files/opencv/bin;添加完成后需要重啟計算機。
2. vc6.0下配置了一下,可是編譯程序時遇到如下一個錯誤:
Linking... LINK : fatal error LNK1104: cannot open file"odbccp32.libcxcore.lib"
可能是:在工程設置的時候添加連接庫時沒加空格或.來把兩個文件名(odbccp32.lib cxcore.lib)分開。注意每一次操作后,記得保存。
若經過以上所有的步驟之后,如果還不能正常編譯,那就是還要稍微修改下你下載的Rob Hess代碼。ok,日后,若有空,再好好詳細剖析下此sift的源碼。最后,祝你編譯順利。
updated
今天下午試了下sift + KD + BBF,然后用兩幅不同的圖片做了下匹配(當然,運行結果顯示是不匹配的),效果還不錯:<http://weibo.com/1580904460/yDmzAEwcV#1348475194313>!

同時,編譯的過程中,直接用的VS2010 + opencv(并沒下gsl)。2012.09.24。完。
- 程序員如何準備面試中的算法
- 第一部分 數據結構
- 第一章 字符串
- 1.0 本章導讀
- 1.1 旋轉字符串
- 1.2 字符串包含
- 1.3 字符串轉換成整數
- 1.4 回文判斷
- 1.5 最長回文子串
- 1.6 字符串的全排列
- 1.10 本章習題
- 第二章 數組
- 2.0 本章導讀
- 2.1 尋找最小的 k 個數
- 2.2 尋找和為定值的兩個數
- 2.3 尋找和為定值的多個數
- 2.4 最大連續子數組和
- 2.5 跳臺階
- 2.6 奇偶排序
- 2.7 荷蘭國旗
- 2.8 矩陣相乘
- 2.9 完美洗牌
- 2.15 本章習題
- 第三章 樹
- 3.0 本章導讀
- 3.1 紅黑樹
- 3.2 B樹
- 3.3 最近公共祖先LCA
- 3.10 本章習題
- 第二部分 算法心得
- 第四章 查找匹配
- 4.1 有序數組的查找
- 4.2 行列遞增矩陣的查找
- 4.3 出現次數超過一半的數字
- 第五章 動態規劃
- 5.0 本章導讀
- 5.1 最大連續乘積子串
- 5.2 字符串編輯距離
- 5.3 格子取數
- 5.4 交替字符串
- 5.10 本章習題
- 第三部分 綜合演練
- 第六章 海量數據處理
- 6.0 本章導讀
- 6.1 關聯式容器
- 6.2 分而治之
- 6.3 simhash算法
- 6.4 外排序
- 6.5 MapReduce
- 6.6 多層劃分
- 6.7 Bitmap
- 6.8 Bloom filter
- 6.9 Trie樹
- 6.10 數據庫
- 6.11 倒排索引
- 6.15 本章習題
- 第七章 機器學習
- 7.1 K 近鄰算法
- 7.2 支持向量機
- 附錄 更多題型
- 附錄A 語言基礎
- 附錄B 概率統計
- 附錄C 智力邏輯
- 附錄D 系統設計
- 附錄E 操作系統
- 附錄F 網絡協議
- sift算法
- sift算法的編譯與實現
- 教你一步一步用c語言實現sift算法、上
- 教你一步一步用c語言實現sift算法、下
- 其它
- 40億個數中快速查找
- hash表算法
- 一致性哈希算法
- 倒排索引關鍵詞不重復Hash編碼
- 傅里葉變換算法、上
- 傅里葉變換算法、下
- 后綴樹
- 基于給定的文檔生成倒排索引的編碼與實踐
- 搜索關鍵詞智能提示suggestion
- 最小操作數
- 最短摘要的生成
- 最長公共子序列
- 木塊砌墻原稿
- 附近地點搜索
- 隨機取出其中之一元素