利用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"
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.****.net/detail/u011028345/9786644
本文程序源代码下载地址(在VS2010+Opencv2.4.9中打开即可使用):http://download.****.net/detail/u011028345/9786656
转载自:https://blog.****.net/u011028345/article/details/63697441