由于COLMAP编译后生成的静态库中包含了SIFTGPU库,COLMAP编译过程:
https://blog.csdn.net/Z5122/article/details/84197127 因此,不需要再次下载SIFTGPU源码进行编译,提供SIFTGPU静态库和测试需要的相关头文件
https://github.com/nxyzgf/sgg-siftgpu
测试代码
#include<colmap/lib/SiftGPU/SiftGPU.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include <Windows.h>
#include <GL/gl.h>
#include <GL/glut.h>
#include <boost/timer.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace chrono;
int main()
{
SiftGPU sift;
SiftMatchGPU matcher;
std::vector<float> descriptors1(1), descriptors2(1);
std::vector<SiftGPU::SiftKeypoint> keys1(1), keys2(1);
int num1 = 0, num2 = 0;
const char * argv[] = { "-fo", "-1", "-v", "1" };
int argc = sizeof(argv) / sizeof(char*);
sift.ParseParam(argc, argv);
int support = sift.CreateContextGL();
if (support != SiftGPU::SIFTGPU_FULL_SUPPORTED)
{
std::cerr << "SiftGPU is not supported!" << std::endl;
return 2;
}
cv::Mat img1 = cv::imread("C:\\Users\\sggzg\\Desktop\\images\\IMG_2332.jpg");
cv::Mat img2 = cv::imread("C:\\Users\\sggzg\\Desktop\\images\\IMG_2333.jpg");
int width1 = img1.cols;
int width2 = img2.cols;
int height1 = img1.rows;
int height2 = img2.rows;
auto start_siftgpu = std::chrono::system_clock::now();
sift.RunSIFT(width1, height1, img1.data, GL_RGB, GL_UNSIGNED_BYTE);
num1 = sift.GetFeatureNum();
keys1.resize(num1);
descriptors1.resize(128 * num1);
sift.GetFeatureVector(&keys1[0], &descriptors1[0]);
sift.RunSIFT(width2, height2, img2.data, GL_RGB, GL_UNSIGNED_BYTE);
num2 = sift.GetFeatureNum();
keys2.resize(num2);
descriptors2.resize(128 * num2);
sift.GetFeatureVector(&keys2[0], &descriptors2[0]);
matcher.VerifyContextGL();
matcher.SetDescriptors(0, num1, &descriptors1[0]);
matcher.SetDescriptors(1, num2, &descriptors2[0]);
uint32_t (*match_buf)[2] = new uint32_t [num1][2];
int num_match = matcher.GetSiftMatch(num1, match_buf);
float time_cost = chrono::duration_cast<microseconds>(std::chrono::system_clock::now() - start_siftgpu).count() / 1000.0;
std::cout << "siftgpu两张图像特征提取与匹配总计时间:" << time_cost << "ms" << std::endl;
std::cout << num_match << "sift特征匹配被找到;\n";
system("pause");
return 0;
}
测试图像
测试结果