零、说明
我这次编译的时候比较费神,主要还是一眼障目,不见泰山。看到
glu
,glew
之类的lib
比较像,以为原本设好了,然后导致一直相关函数引用失败。
0.1 主要参考网页
SiftGPU在Ubuntu和Windows下的编译与使用;
SIFTGPU编译及测试;
SLAM拾萃(3):siftGPU;
一、SiftGPU 下载
原本的给的网址SiftGPU主页:http://www.cs.unc.edu/~ccwu/siftgpu/已经不能用了,然后就去
github
找github仓库:SiftGPU,但是下载下来实在是太慢了,最后在码云
上面下载的码云仓库:SiftGPU,使用登录码云下载zip,还是使用HTTPS
克隆仓库看个人习惯,我是使用HTTPS
链接放到github desktop
里面克隆整个仓库的。
二、在visual studio 下面编译
2.1 准备工作
2.2 构建 SiftGPU.sln
下载下来的仓库目录应该是如下这样
.
├─bin
├─data
├─demos
├─doc
│ └─evaluation
├─lib
├─msvc
│ ├─ServerSiftGPU
│ ├─SiftGPU
│ └─TestWin
└─src
├─ServerSiftGPU
├─SiftGPU
└─TestWin
在
msvc
文件夹下找到SiftGPU.sln
,双击打开,我这儿默认是使用visual studio 2017
打开的,打开后会提示升级,正常升级即可。
接下来配置glew
和DevIL
:
在项目SiftGPU
上右键属性,然后在vc++
目录-->包含目录 里面添加两者的包含头文件目录,根据自己的解压路径对应修改。
D:\glew-2.1.0\include
D:\DevIL Windows SDK\include
D:\DevIL Windows SDK\include\IL
在
vc++
目录-->库目录 里面添加两者库文件所在目录,根据自己解压地址修改具体地址
D:\glew-2.1.0\lib\Release\x64
D:\DevIL Windows SDK\lib\x64\Release
在 链接器-->输入-->附加依赖项 中添加如下内容,根据自己具体下载的库的版本来写,比如我这儿就没有*64.lb
,*64s.lib
之类的,而项目原本写的里面是有的,记得删掉。
opengl32.lib
glu32.lib
winmm.lib
glew32.lib
glew32s.lib
接下来是关于
DevIL.lib
,把文件GLTexImage.cpp
中第46
行开始改成如下:
#ifndef SIFTGPU_NO_DEVIL
#include "IL/il.h"
#if defined(_WIN64)
#pragma comment(lib, "D:/DevIL Windows SDK/lib/x64/Release/DevIL.lib")
#elif defined(_WIN32)
#pragma comment(lib, "D:/DevIL Windows SDK/lib/x86/Release/DevIL.lib")
#endif
#else
#include <string.h>
#endif
右键项目,生成。
2.3 SiftGPU_CUDA_Enabled.sln 生成
同样在
msvc
文件夹下找到SiftGPU_CUDA_Enabled.sln
,双击打开,vs2017
或者vs2019
提示升级就直接升级就是了。
包含目录,库目录,附加依赖项,以及库加载代码的改动和SiftGPU.sln
一致。
与
SiftGPU.sln
方案不同的是,SiftGPU_CUDA_Enabled.sln
方案中的SiftGPU_CUDA_Enabled
项目包含*.cu
文件,要记得把项目的右键菜单的生成依赖项-->生成自定义
里面的cuda
勾选上。如下图:
接下来就是把
*.cu
文件的选项也改了。找到ProgramCU.cu
文件在右键菜单-->属性 里面更改如下:
都改好后,右键项目,生成。
三、测试
首先给出测试代码如下,主要参考了高翔博士的博客。
#include "../../src/SiftGPU/SiftGPU.h"
//标准C++
#include <iostream>
#include <vector>
// OpenCV图像
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
// boost库中计时函数
//#include <boost/timer.hpp>
//#include <GL/gl.h>
#ifndef SIFTGPU_NO_DEVIL
#if defined(_WIN64)
#pragma comment(lib, "../../lib/SIFTGPU.lib")
#elif defined(_WIN32)
#pragma comment(lib, "../../lib/SIFTGPU.lib")
#endif
#else
#include <string.h>
#endif
using namespace std;
int main()
{
SiftGPU sift;
char* argv[4] = { "-fo", "-1", "-v", "1" };
double timeOneBegin, timeOneEnd;
timeOneBegin = (double)clock() / CLOCKS_PER_SEC;
sift.ParseParam(4, argv);
int support = sift.CreateContextGL();
if (support != SiftGPU::SIFTGPU_FULL_SUPPORTED)
{
return 0;
}
//测试直接读取一张图像
cout << "running sift" << endl;
timeOneBegin = (double)clock() / CLOCKS_PER_SEC;
//在此填入你想测试的图像的路径!不要用我的路径!不要用我的路径!不要用我的路径!
sift.RunSIFT("你的图片路径");
cout << "siftgpu::runsift() cost time=" << (double)clock() / CLOCKS_PER_SEC - timeOneBegin << 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("你的图片路径", 0);
int width = img.cols;
int height = img.rows;
//timer.restart();
// 注意我们处理的是灰度图,故照如下设置
unsigned int GL_INTENSITY8 = 0x804B;
unsigned int GL_UNSIGNED_BYTE = 0x1401;
timeOneBegin = (double)clock() / CLOCKS_PER_SEC;
sift.RunSIFT(width, height, img.data, GL_INTENSITY8, GL_UNSIGNED_BYTE);
cout << "siftgpu::runSIFT() cost time=" << (double)clock() / CLOCKS_PER_SEC - timeOneBegin << endl;
return 0;
}
我是直接在对应的方案下面新建一个
TestSiftGPU
项目,然后新建一个testMain.cpp
文件,输入上面这些代码进行测试,记得项目要添加opencv
的依赖,以及更改自己对应的文件路径。