siftgpu只是一个特称,主要是为了提升slam提取sift特征的速度,但如果以后你要用orb特征的话,这个也就没必要了。提取特征的速度快了,特征匹配的速度也会快吗?

原来是需要几百毫秒,这个效果可以提升到几十毫秒。
1.下载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/
我选的是第二个版本,记住一定要点击左边的
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>
(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.
就只有这两个建议,还不知道怎么用。