利用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例如:
-
#ifdef __cplusplus
-
extern
"C" {
-
#endif
-
-
#ifndef XFORM_H
-
#define XFORM_H
-
-
#include <cxcore.h>
-
-
..........
-
-
#ifdef __cplusplus
-
}
-
#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例如:
-
#ifdef __cplusplus
-
extern
"C" {
-
#endif
-
-
#ifndef XFORM_H
-
#define XFORM_H
-
-
#include <cxcore.h>
-
-
..........
-
-
#ifdef __cplusplus
-
}
-
#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