siftGPU在Windows下编译,build siftGPU in Windows10 on vs.

零、说明

我这次编译的时候比较费神,主要还是一眼障目,不见泰山。看到gluglew之类的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 准备工作

需要下载glew;
需要下载DevIL;
然后解压出来。

2.2 构建 SiftGPU.sln

下载下来的仓库目录应该是如下这样

.
├─bin
├─data
├─demos
├─doc
│  └─evaluation
├─lib
├─msvc
│  ├─ServerSiftGPU
│  ├─SiftGPU
│  └─TestWin
└─src
    ├─ServerSiftGPU
    ├─SiftGPU
    └─TestWin

msvc文件夹下找到SiftGPU.sln,双击打开,我这儿默认是使用visual studio 2017打开的,打开后会提示升级,正常升级即可。
接下来配置glewDevIL
在项目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 
#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勾选上。如下图:

勾选项目的cuda依赖

接下来就是把*.cu文件的选项也改了。找到ProgramCU.cu文件在右键菜单-->属性 里面更改如下:

修改文件为CUDA C/C++选项

都改好后,右键项目,生成。

三、测试

首先给出测试代码如下,主要参考了高翔博士的博客。

#include "../../src/SiftGPU/SiftGPU.h"

//标准C++
#include 
#include 

// OpenCV图像
#include 
#include 

// boost库中计时函数
//#include 

//#include 

#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 
#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 descriptors(128 * num);
    vector 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的依赖,以及更改自己对应的文件路径。

你可能感兴趣的:(siftGPU在Windows下编译,build siftGPU in Windows10 on vs.)