设为首页 加入收藏

TOP

[学习笔记]SiftGPU入门(一)
2018-11-06 14:14:14 】 浏览:66
Tags:学习 笔记 SiftGPU 入门

当有读者看到我这篇SiftGPU入门的学习笔记时,相信你已经读过了高博那篇《SLAM拾萃:SiftGPU》,那篇文章写于16年,已经过去两年的时间。在我尝试配置SiftGPU的环境时,遇到了几个问题,在网络上也少有较为系统的关于SiftGPU的介绍,因此觉得有必要记录下来,以便同样对此感兴趣的同学们少走弯路。

暑假的时候参加了高分举办的无人机大赛,在进行图像处理的时候用到过特征提取,当时主要是考虑SIFT和SURF两种方法,由于提取速度上的优势,我采用了SURF。比赛之后读过一些博客和文章,发觉SIFT的准确率应该更高一些,而我在比赛中也发现SURF偶尔会出现无法匹配的情况。OpenCV集成了SIFT算子,我们可以比较容易地利用其中的函数进行特征点的检测,而由于传统的SIFT算法速度较为缓慢,检测一张图片在台式机上通常都需要100+ms,因此传统的SIFT算法很难应用在无人机这种资源紧张而且对速度要求很高的平台上。目前我们组的无人平台上主要应用过ORBSLAM和VINS。

我的原计划是阅读Lowe的论文,理解算法的原理,而后对源码进行一定的优化以在特定的情景中加快检测速度,然而在一次组会中,老板提到了SiftGPU让我去了解一下,于是就有了这篇学习笔记。原作者Wu Changchang来自北卡罗来纳大学教堂山分校,高博文章中的下载链接基于此。

笔者使用的是Ubuntu 16.04的系统,工作机配置了CUDA9.0,笔记本配置的是CUDA9.2,OpenCV的版本都是3.2.0,关于OpenCV及其contrib的编译可以参照我的另一篇博文[环境配置]Ubuntu 16.04 源码编译安装OpenCV-3.2.0+OpenCV_contrib-3.2.0及产生的问题。SiftGPU大部分代码是基于OpenGL的,因此不编译CUDA也没有问题,两者速度的对比后面会提到。

 


下载和编译

源码编译之前我们需要安装一些包以及Glew。

$ sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev freeglut3-dev libdevil-dev

Glew的源码位于其官网,下载最新版的即可,之后直接解压。

$ cd Downloads/glew-2.1.0
$ make
$ sudo make install

我们需要告诉系统的cmake工具编译好的文件的位置。

$ sudo ldconfig /usr/lib64/

接下来就是SiftGPU的编译了,Wu Changchang的源码链接已经失效,因此只能去万能的github上下载源码了。但是这个版本的SiftGPU有几处问题,编译之前需要更正,否则无法正确编译完成,为方便起见,我fork之后更新了需要更正的文件,放在我的github上,大家可以直接clone我更正后的代码,然后编译SiftGPU。

$ cd Downloads/SiftGPU
$ make

检查一下得到的bin/libsiftgpu.so的链接是否正确

$ ldd bin/libsiftgpu.so

如果得到如下的图片,说明编译成功,每一个库都找到了对应的位置。

 笔者对pitzer的源码主要更改了两个文件,首先一个关于freeglut的问题,报错如下

freeglut ERROR: Function <glutDestroyWindow> called without first calling 'glutInit'.

我们打开src/SiftGPU/LiteWindow.h,找到

virtual ~LiteWindow()   {  if(glut_id > 0) glutDestroyWindow(glut_id);  }

改为

virtual ~LiteWindow()   
{  
    if(glut_id > 0) 
    {
      int argc = 0;
      char** argv;
      glutInit(&argc, argv); 
      glutDestroyWindow(glut_id); 
    } 
}

第二个文件是src/SiftGPU/SiftGPU.h,在头文件处加一个

#include <stddef.h>

如果缺少这个头文件,会报如下的错误

/home/yao/Environment/SiftGPU/src/SiftGPU/SiftGPU.h:336:40: error: declaration of ‘operator new’ as non-function SIFTGPU_EXPORT void* operator new (size_t size);

测试与结果

OpenGL

编译好之后我们当然需要来测试一下,笔者主要使用cmake从命令行进行编译,使用编译器的同学如果是调用cmake工具的话,应该步骤相同。首先我们创建一个工程文件夹,名字就叫test_SiftGPU,在文件夹下创建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/yao/Environment/SiftGPU/src/SiftGPU/" ${OpenGL_INCLUDE_DIR})
set(SIFTGPU_LIBS "/home/yao/Environment/SiftGPU/bin/libsiftgpu.so")

add_executable( test_SiftGPU main.cpp )
target_link_libraries( testSiftGPU
    ${OpenCV_LIBS}
    ${SIFTGPU_LIBS}
    ${GLEW_LIBRARIES} ${GLUT_LIBRARIES} ${OPENGL_LIBRARIES}
)

注意设置SiftGPU的路径时读者要改成自己的路径。此外高博的文章中写到需要为Glew写一个寻找其路径的cmake文件,但在我安装完Glew后cmake的modules文件夹下出现了FindGLEW.cmake这个文件,因此我们不需要专门为Glew写这个文件,直接加上GLEW的find_package代码,注意大写。

main.cpp我直接用高博的代码,后续的学习之后可能会写一个新的测试代码,更便于学习。

// SiftGPU模块
#include <SiftGPU.h>

//标准C++
#include <iostream>
#include <vector>

// OpenCV图像
#include <opencv2/core/core.hpp>
#include <opencv2/hi
编程开发网
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇cf449D. Jzzhu and Numbers(容斥.. 下一篇c/c++ 多线程 unique_lock的使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

array(4) { ["type"]=> int(8) ["message"]=> string(24) "Undefined variable: jobs" ["file"]=> string(32) "/mnt/wp/cppentry/do/bencandy.php" ["line"]=> int(214) }