1. 程式人生 > >利用RobHess原始碼實現SIFT演算法及RANSAC去錯的影象特徵提取匹配及去除錯匹配

利用RobHess原始碼實現SIFT演算法及RANSAC去錯的影象特徵提取匹配及去除錯匹配

本文是在VS2010+Opencv2.4.9環境下實現!

首先下載RobHess利用opencv實現SIFT演算法原始碼,在配置好opencv環境的vs2010中實現SIFT特徵提取、匹配,在利用K-D樹、BBF和RANSAC去除錯誤匹配,實驗結果如圖:

去除錯誤匹配前結果:

去除錯誤匹配後結果:

下面詳細介紹如何在自己的開發環境中實現利用RobHess原始碼:

1、在VS2010中新建自己的C++工程。在工程根目錄內將原始碼檔案新增進去,imgfeatures.c imgfeatures.h kdtree.c kdtree.h minpq.c minpq.h sift.c sift.h utils.c utils.h xform.c xform.h(即除了match.c(實現匹配測試程式) siftfeat.c(實現特徵提取測試程式) dspfeat.c(從儲存特徵點檔案中讀取特徵點並顯示)的所有原始碼檔案)


2、在需要使用sift方法的地方新增對應標頭檔案:

#include "sift.h"
#include "imgfeatures.h"
#include "utils.h"
#include "kdtree.h"
#include "xform.h"
#include "minpq.h"
3、取消.c檔案的預編譯:在“資源管理器”檢視下面複選新增的所有.c檔案,右鍵選擇“屬性”,選取“C/C++”->“預編譯頭”,在“預編譯頭”選項中選擇“不使用預編譯頭”。

4、C語法設定:分別開啟imgfeatures.h和sift.h等所有包含的標頭檔案中,讓所有函式包含在

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif
例如:


    
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. #ifndef XFORM_H
  5. #define XFORM_H
  6. #include <cxcore.h>
  7. ..........
  8. #ifdef __cplusplus
  9. }
  10. #endif


5.呼叫相關函式可能會遇到的報錯如下:

(1)編譯報錯:
1>utils.obj : error LNK2001: 無法解析的外部符號 _va_end
1>utils.obj : error LNK2001: 無法解析的外部符號 _va_start

說好了原始碼裡面有些東西是要改的:在utils.c中#include <stdarg.h>就OK了。

(2)編譯報錯:

picturecopy1.obj : error LNK2019: 無法解析的外部符號 "int __cdecl kdtree_bbf_knn(struct kd_node *,struct feature *,int,struct feature * * *,int)"

 ([email protected]@[email protected]@[email protected]@[email protected]@Z),該符號在函式 _main 中被引用

出現上述類似錯誤將包含的任意一個頭檔案.h改成.cpp後編譯,然後再改成.h即可解決。

(3)注意事情:

下載RobHess原始碼時候注意要下載VC++版本或C版本,切勿下載linux版本在VS2010環境中呼叫!程式中遇到相關簡單錯誤可自行解決這裡不再贅述。

RobHess原始碼下載地址:http://download.csdn.net/detail/u011028345/9786644

本文程式原始碼下載地址(在VS2010+Opencv2.4.9中開啟即可使用):http://download.csdn.net/detail/u011028345/9786656

轉載自:https://blog.csdn.net/u011028345/article/details/63697441

本文是在VS2010+Opencv2.4.9環境下實現!

首先下載RobHess利用opencv實現SIFT演算法原始碼,在配置好opencv環境的vs2010中實現SIFT特徵提取、匹配,在利用K-D樹、BBF和RANSAC去除錯誤匹配,實驗結果如圖:

去除錯誤匹配前結果:

去除錯誤匹配後結果:

下面詳細介紹如何在自己的開發環境中實現利用RobHess原始碼:

1、在VS2010中新建自己的C++工程。在工程根目錄內將原始碼檔案新增進去,imgfeatures.c imgfeatures.h kdtree.c kdtree.h minpq.c minpq.h sift.c sift.h utils.c utils.h xform.c xform.h(即除了match.c(實現匹配測試程式) siftfeat.c(實現特徵提取測試程式) dspfeat.c(從儲存特徵點檔案中讀取特徵點並顯示)的所有原始碼檔案)

2、在需要使用sift方法的地方新增對應標頭檔案:

#include "sift.h"
#include "imgfeatures.h"
#include "utils.h"
#include "kdtree.h"
#include "xform.h"
#include "minpq.h"
3、取消.c檔案的預編譯:在“資源管理器”檢視下面複選新增的所有.c檔案,右鍵選擇“屬性”,選取“C/C++”->“預編譯頭”,在“預編譯頭”選項中選擇“不使用預編譯頭”。

4、C語法設定:分別開啟imgfeatures.h和sift.h等所有包含的標頭檔案中,讓所有函式包含在

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __cplusplus
}
#endif
例如:


 
  1. #ifdef __cplusplus
  2. extern "C" {
  3. #endif
  4. #ifndef XFORM_H
  5. #define XFORM_H
  6. #include <cxcore.h>
  7. ..........
  8. #ifdef __cplusplus
  9. }
  10. #endif


5.呼叫相關函式可能會遇到的報錯如下:

(1)編譯報錯:
1>utils.obj : error LNK2001: 無法解析的外部符號 _va_end
1>utils.obj : error LNK2001: 無法解析的外部符號 _va_start

說好了原始碼裡面有些東西是要改的:在utils.c中#include <stdarg.h>就OK了。

(2)編譯報錯:

picturecopy1.obj : error LNK2019: 無法解析的外部符號 "int __cdecl kdtree_bbf_knn(struct kd_node *,struct feature *,int,struct feature * * *,int)"

 ([email protected]@[email protected]@[email protected]@[email protected]@Z),該符號在函式 _main 中被引用

出現上述類似錯誤將包含的任意一個頭檔案.h改成.cpp後編譯,然後再改成.h即可解決。

(3)注意事情:

下載RobHess原始碼時候注意要下載VC++版本或C版本,切勿下載linux版本在VS2010環境中呼叫!程式中遇到相關簡單錯誤可自行解決這裡不再贅述。

RobHess原始碼下載地址:http://download.csdn.net/detail/u011028345/9786644

本文程式原始碼下載地址(在VS2010+Opencv2.4.9中開啟即可使用):http://download.csdn.net/detail/u011028345/9786656