siftgpu只是一个特称,主要是为了提升slam提取sift特征的速度,但如果以后你要用orb特征的话,这个也就没必要了。提取特征的速度快了,特征匹配的速度也会快吗?
原来是需要几百毫秒,这个效果可以提升到几十毫秒。
1.下载siftgpu
http://www.cs.unc.edu/~ccwu/siftgpu/
点击这个siftgpu-v400,解压之后,移到ubuntu下home文件夹
2.安装依赖项
sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev
3.安装glew 1.5.1以上版本
选择的是1.13.0版本,点击之后,是跳到了https://sourceforge.net/projects/glew/files/glew/1.13.0/
我选的是第二个版本,记住一定要点击左边的![](https://note.youdao.com/yws/res/4355/DD949A98C1AE4D408FBF0E87C9C88177)
4.编译glew
glew是直接用makefile编译的,所以这里不用cmake
直接
make
sudo make install
就可以了。
5.告诉系统glew所在的文件夹,它是被安装到了/usr/lib/
sudo ldconfig /usr/lib/
6.编译 siftgpu
make
7检测siftgpu编译是否顺利
(1)查看bin目录下是否生成了libsiftgpu.so库文件
(2)ldd bin/libsiftgpu.so
ldd命令是输出与它链接的库的信息,如果没有出现undefine reference,说明编译顺利
8.测试siftgpu
(1)新建一个文件夹,eg:test_siftgpu,编写一个main.cpp文件,把下面代码放进去
// SiftGPU模块
#include <SiftGPU.h>
//标准C++
#include <iostream>
#include <vector>
// OpenCV图像
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
// boost库中计时函数
#include <boost/timer.hpp>
// OpenGL
#include <GL/gl.h>
using namespace std;
int main( int argc, char** argv)
{
//声明SiftGPU并初始化
SiftGPU sift;
char* myargv[4] ={ "-fo", "-1", "-v", "1"};
sift.ParseParam(4, myargv);
//检查硬件是否支持SiftGPU
int support = sift.CreateContextGL();
if ( support != SiftGPU::SIFTGPU_FULL_SUPPORTED )
{
cerr<<"SiftGPU is not supported!"<<endl;
return 2;
}
//测试直接读取一张图像
cout<<"running sift"<<endl;
boost::timer timer;
//在此填入你想测试的图像的路径!不要用我的路径!不要用我的路径!不要用我的路径!
sift.RunSIFT( "/home/xiang/wallE-slam/data/rgb1.png" );
cout<<"siftgpu::runsift() cost time="<<timer.elapsed()<<endl;
// 获取关键点与描述子
int num = sift.GetFeatureNum();
cout<<"Feature number="<<num<<endl;
vector<float> descriptors(128*num);
vector<SiftGPU::SiftKeypoint> keys(num);
timer.restart();
sift.GetFeatureVector(&keys[0], &descriptors[0]);
cout<<"siftgpu::getFeatureVector() cost time="<<timer.elapsed()<<endl;
// 先用OpenCV读取一个图像,然后调用SiftGPU提取特征
cv::Mat img = cv::imread("/home/xiang/wallE-slam/data/rgb1.png", 0);
int width = img.cols;
int height = img.rows;
timer.restart();
// 注意我们处理的是灰度图,故照如下设置
sift.RunSIFT(width, height, img.data, GL_INTENSITY8, GL_UNSIGNED_BYTE);
cout<<"siftgpu::runSIFT() cost time="<<timer.elapsed()<<endl;
return 0;
}
把代码中的两个路径改为 /home/exbot/slam2/src/data/rgb.png
(2)新建一个文件CMakeLists.txt,把下面代码复制进去
cmake_minimum_required(VERSION 2.8.3)
project(test_siftgpu)
# OpenCV依赖
find_package( OpenCV REQUIRED )
# OpenGL
find_package(OpenGL REQUIRED)
# GLUT
find_package(GLUT REQUIRED)
# Glew
find_package(Glew REQUIRED)
# SiftGPU:手动设置其头文件与库文件所在位置
include_directories("/home/xiang/Downloads/SiftGPU/src/SiftGPU/" ${OpenGL_INCLUDE_DIR})
set(SIFTGPU_LIBS "/home/xiang/Downloads/SiftGPU/bin/libsiftgpu.so")
add_executable( testSIFTGPU main.cpp )
target_link_libraries( testSIFTGPU
${OpenCV_LIBS}
${SIFTGPU_LIBS}
${GLEW_LIBRARIES} ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES}
)
(3)新建一个FindGlew.cmake文件,建这个文件是因为glew是用make编译的,在cmake库里可能找不到它。如果你直接编译的话,有可能就会出现找不到glew的错误。把下面代码复制进去。
#
# Try to find GLEW library and include path.
# Once done this will define
#
# GLEW_FOUND
# GLEW_INCLUDE_PATH
# GLEW_LIBRARY
#
IF (WIN32)
FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
$ENV{PROGRAMFILES}/GLEW/include
${PROJECT_SOURCE_DIR}/src/nvgl/glew/include
DOC "The directory where GL/glew.h resides")
FIND_LIBRARY( GLEW_LIBRARY
NAMES glew GLEW glew32 glew32s
PATHS
$ENV{PROGRAMFILES}/GLEW/lib
${PROJECT_SOURCE_DIR}/src/nvgl/glew/bin
${PROJECT_SOURCE_DIR}/src/nvgl/glew/lib
DOC "The GLEW library")
ELSE (WIN32)
FIND_PATH( GLEW_INCLUDE_PATH GL/glew.h
/usr/include
/usr/local/include
/sw/include
/opt/local/include
DOC "The directory where GL/glew.h resides")
FIND_LIBRARY( GLEW_LIBRARY
NAMES GLEW glew
PATHS
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/lib
/sw/lib
/opt/local/lib
DOC "The GLEW library")
ENDIF (WIN32)
IF (GLEW_INCLUDE_PATH)
SET( GLEW_FOUND 1 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
ELSE (GLEW_INCLUDE_PATH)
SET( GLEW_FOUND 0 CACHE STRING "Set to 1 if GLEW is found, 0 otherwise")
ENDIF (GLEW_INCLUDE_PATH)
MARK_AS_ADVANCED( GLEW_FOUND )
(4)把新建的cmake格式的文件放到cmake的modules文件夹里。放在它的文件夹里,cmake就可以知道怎么找了。
sudocp ./FindGlew.cmake /usr/share/cmake-2.8/Modules/
(5)找到siftgpu的库文件SiftGPU.h,打开,把下面一句加到它头的部分。因为作者重载了新的new运算符,其中size的类型size_t,必须新加一个库
stddef
才能用。不然就会报错
error: declaration of ‘operator new’ as non-function SIFTGPU_EXPORT void* operatornew (size_t size);
#include <stddef.h>
![](https://note.youdao.com/yws/res/4435/AABB2C9A60A5492A91320ADF197F27D6)
(6)编译
mkdir build
cd build
cmake ..
make
(7)运行
在当前目录下运行ls,可以看到出现了一个可执行程序,
testSIFTGPU ,执行它。
./
testSIFTGPU
结果:
[SiftGPU Language]: GLSL
[GPU VENDOR]: VMware, Inc.
TEXTURE: 8192
running sift
Image size : 640x480
Image loaded : /home/exbot/slam2/src/data/rgb.png
#Features: 0
#Features MO: 0
[RUN SIFT]: 0.487
siftgpu::runsift() cost time=0.052294
Feature number=0
siftgpu::getFeatureVector() cost time=1e-06
Image size : 640x480
#Features: 0
#Features MO: 0
[RUN SIFT]: 0.095
siftgpu::runSIFT() cost time=0.008794
试了几张图片,features 数目一直是0,我去google搜过之后,1- into this method int GLTexInput::LoadImageFile(char *imagepath, int &w, int &h ) changing char buf[800]; instead of char buf[8].
2- And using ppm files because jpg is not supported.
就只有这两个建议,还不知道怎么用。