https://github.com/Celebrandil/CudaSift/blob/Pascal/CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(cudaSift) set(cudaSift_VERSION_MAJOR 2) set(cudaSift_VERSION_MINOR 0) set(cudaSift_VERSION_PATCH 0) set(CPACK_PACKAGE_VERSION_MAJOR "${cudaSift_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${cudaSift_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${cudaSift_VERSION_PATCH}") set(CPACK_GENERATOR "ZIP") include(CPack) find_package(OpenCV REQUIRED) find_package(CUDA) if (NOT CUDA_FOUND) message(STATUS "CUDA not found. Project will not be built.") endif(NOT CUDA_FOUND) if (WIN32) set(EXTRA_CXX_FLAGS "/DVERBOSE /D_CRT_SECURE_NO_WARNINGS ") list(APPEND CUDA_NVCC_FLAGS "-arch=sm_35;--compiler-options;-O2;-DVERBOSE") endif() if (UNIX) if (APPLE) set(EXTRA_CXX_FLAGS "-DVERBOSE -msse2") list(APPEND CUDA_NVCC_FLAGS "-arch=sm_35;--compiler-options;-O2;-DVERBOSE") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -msse2 ") list(APPEND CUDA_NVCC_FLAGS "-lineinfo;-ccbin;/usr/bin/gcc-6;--compiler-options;-O2;-D_FORCE_INLINES;-DVERBOSE_NOT") endif() endif() set(cuda_sources cudaImage.cu cudaImage.h cudaSiftH.cu cudaSiftH.h matching.cu cudaSiftD.h cudaSift.h cudautils.h ) set(sources geomFuncs.cpp mainSift.cpp ) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) #SET(CUDA_SEPARABLE_COMPILATION ON) cuda_add_executable(cudasift ${cuda_sources} ${sources} OPTIONS -arch=sm_35) #cuda_add_executable(l2net l2netD.cu OPTIONS -arch=sm_35) set_target_properties(cudasift PROPERTIES COMPILE_FLAGS "${EXTRA_CXX_FLAGS}" ) target_link_libraries(cudasift ${CUDA_cudadevrt_LIBRARY} ${OpenCV_LIBS}) # /usr/local/cuda/lib64/libcudadevrt.a ${OpenCV_LIBS} #) install(FILES ${cuda_sources} ${sources} cudaSiftD.cu CMakeLists.txt Copyright.txt DESTINATION . ) install(FILES data/left.pgm data/righ.pgm DESTINATION data )
测试样例1 读取单路图像检测特征点
#include <iostream> #include <cmath> #include <dirent.h> // 循环访问文件夹路径使用 #include <iomanip> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "cudaImage.h" #include "cudaSift.h" using namespace std; typedef struct { float xpos; float ypos; float scale; float sharpness; float edgeness; float orientation; float score; float ambiguity; int match; float match_xpos; float match_ypos; float match_error; float subsampling; float empty[3]; float data[128]; } SiftPoint_gpu; typedef struct { float xpos; float ypos; float scores; float descriptors[128]; } SiftPoint_cpu; //单路测试 void GetKeyPoint() { int devNum = 0, imgSet = 0; //1读取图像 cv::Mat limg; cv::imread("data/img1.png", 0).convertTo(limg, CV_32FC1); unsigned int w = limg.cols; unsigned int h = limg.rows; std::cout << "Image size = (" << w << "," << h << ")" << std::endl; //2 初始化cuda加速器 std::cout << "Initializing data..." << std::endl; InitCuda(devNum); //3 加载图像到cuda CudaImage img1; img1.Allocate(w, h, iAlignUp(w, 128), false, NULL, (float*)limg.data); img1.Download(); // 4-1 初始化提取器 SiftData siftData1; float initBlur = 1.0f; float thresh = (imgSet ? 4.5f : 3.0f); InitSiftData(siftData1, 32768, true, true); // 4-2 初始化分配空间 float *memoryTmp = AllocSiftTempMemory(w, h, 5, false); // 4-3 提取特征点 ExtractSift(siftData1, img1, 5, initBlur, thresh, 0.0f, false, memoryTmp); int numPts = siftData1.numPts;//特征点总数目 SiftPoint *sift1 = siftData1.h_data;//特征点的数据 for (int j=0;j<numPts;j++) { float x=sift1[j].xpos; float y=sift1[j].ypos; float scores=sift1[j].score; //float descriptors[128]; //sift1[j].data; cout<< "(x,y) "<< x <<" " <<y<< "scores " <<scores <<endl; } // 4-4 释放特征点临时空间 FreeSiftTempMemory(memoryTmp); // 5Free Sift data from device FreeSiftData(siftData1); } int main() { GetKeyPoint(); }
样例2 读取多个文件夹循环访问
#include <iostream> #include <cmath> #include <dirent.h> //循环访问文件夹路径使用 #include <iomanip> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "cudaImage.h" #include "cudaSift.h" using namespace std; typedef struct { float xpos; float ypos; float scale; float sharpness; float edgeness; float orientation; float score; float ambiguity; int match; float match_xpos; float match_ypos; float match_error; float subsampling; float empty[3]; float data[128]; } SiftPoint_gpu; typedef struct { float xpos; float ypos; float scores; float descriptors[128]; } SiftPoint_cpu; // 获取目录下所有图像名称 std::vector<std::string> getAllImagesPath(std::string img_dir) { std::vector<std::string> img_path_all; // 读取文件夹下所有地图文件路径存储在 map_path_all数组中 DIR *pDir; struct dirent *ptr; if (!(pDir = opendir(img_dir.c_str()))) { std::cout<<"Folder doesn't Exist!"<<std::endl; } while ((ptr = readdir(pDir)) != 0) { if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { std::string path = img_dir + "/" + ptr->d_name; img_path_all.push_back(path); std::cout << "img_name:" << path << std::endl; } } closedir(pDir); return img_path_all; } //单路测试 void GetKeyPoint(vector<string> imgs_path ) { int devNum = 0, imgSet = 0; //1-1 初始化cuda加速器 std::cout << "Initializing data..." << std::endl; InitCuda(devNum); //1-2 初始化提取器 SiftData siftData1; float initBlur = 1.0f; float thresh = (imgSet ? 4.5f : 3.0f); InitSiftData(siftData1, 32768, true, true); //1-3 初始化分配空间 unsigned int w = 1920; unsigned int h = 1080; float *memoryTmp = AllocSiftTempMemory(w, h, 5, false); cv::Mat limg;//创建空白图像 CudaImage img1;//创建空白cudA int IMG_NUM=imgs_path.size();//记录大小 for( int i=0;i<IMG_NUM;i++){ //2-1 读取图像 cv::imread(imgs_path[i], 0).convertTo(limg, CV_32FC1); //w = limg.cols; //h = limg.rows; //std::cout << "Image size = (" << w << "," << h << ")" << std::endl; //2-2 加载图像到cuda img1.Allocate(w, h, iAlignUp(w, 128), false, NULL, (float*)limg.data); img1.Download(); // 2-3 提取特征点 ExtractSift(siftData1, img1, 5, initBlur, thresh, 0.0f, false, memoryTmp); //2-4 访问所有特征点的属性 int numPts = siftData1.numPts;//特征点总数目 SiftPoint *sift1 = siftData1.h_data;//特征点的数据 //逐个特征点访问 for (int j=0;j<numPts;j++) { float x=sift1[j].xpos; float y=sift1[j].ypos; float scores=sift1[j].score; //float descriptors[128]; //sift1[j].data; cout<< "图像"<< imgs_path[i] << " (x,y) "<< x <<" " <<y<< "scores " <<scores <<endl; } //2-5 保存所有结果 }//for 读取图像 //3-1 释放特征点临时空间 FreeSiftTempMemory(memoryTmp); //3-2Free Sift data from device FreeSiftData(siftData1); } int main() { // 1.读取所有图像 vector<string> imgs_path = getAllImagesPath("./data"); //2 提取特征点 GetKeyPoint(imgs_path); }
样例
1读取文件夹,提取每个特征点保存h5
2读取txt中两个图像匹配关系,特征点保存在h5
CMakeLists.txt
cmake_minimum_required(VERSION 3.10) project(cudaSift) #指定gcc和g++的版本为系统当前版本 工程默认6.0 现有系统7.5 set(CMAKE_C_COMPILER "/usr/bin/gcc") set(CMAKE_CXX_COMPILER "/usr/bin/g++") #设置cuda set(cudaSift_VERSION_MAJOR 2) set(cudaSift_VERSION_MINOR 0) set(cudaSift_VERSION_PATCH 0) #设置cpack #CPack 是 CMake 2.4.2 之后的一个内置工具,用于创建软件的二进制包和源代码包。 set(CPACK_PACKAGE_VERSION_MAJOR "${cudaSift_VERSION_MAJOR}") set(CPACK_PACKAGE_VERSION_MINOR "${cudaSift_VERSION_MINOR}") set(CPACK_PACKAGE_VERSION_PATCH "${cudaSift_VERSION_PATCH}") set(CPACK_GENERATOR "ZIP") include(CPack) #hdf5 find_package(HDF5 COMPONENTS C CXX HL REQUIRED) link_directories( ${HDF5_LIBRARY_DIRS} ) include_directories( ${HDF5_INCLUDE_DIRS} ) find_package(OpenCV REQUIRED) find_package(CUDA) if (NOT CUDA_FOUND) message(STATUS "CUDA not found. Project will not be built.") endif(NOT CUDA_FOUND) if (WIN32) set(EXTRA_CXX_FLAGS "/DVERBOSE /D_CRT_SECURE_NO_WARNINGS ") list(APPEND CUDA_NVCC_FLAGS "-arch=sm_35;--compiler-options;-O2;-DVERBOSE") endif() if (UNIX) if (APPLE) set(EXTRA_CXX_FLAGS "-DVERBOSE -msse2") list(APPEND CUDA_NVCC_FLAGS "-arch=sm_35;--compiler-options;-O2;-DVERBOSE") else() #CMAKE_CXX_FLAGS 是CMake传给C++编译器的编译选项,通过设置这个值就好比 g++ -std=c++11 -g -Wall set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -msse2 ") # # release包优化 list(APPEND CUDA_NVCC_FLAGS "-lineinfo;-ccbin;/usr/bin/gcc-6;--compiler-options;-O2;-D_FORCE_INLINES;-DVERBOSE_NOT") endif() endif() #把当前目录(CMakeLists.txt所在目录)下的include文件夹加入到包含路径 include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ) #cuda_sources 指代文件目录 set(cuda_sources cudaImage.cu cudaImage.h cudaSiftH.cu cudaSiftH.h matching.cu cudaSiftD.h cudaSift.h cudautils.h ) #sources 指代 文件目录 set(sources geomFuncs.cpp v4_mainSift_h5_match.cpp ) #SET(CUDA_SEPARABLE_COMPILATION ON) cuda_add_executable(cudasift ${cuda_sources} ${sources} OPTIONS -arch=sm_35) #cuda_add_executable(l2net l2netD.cu OPTIONS -arch=sm_35) set_target_properties(cudasift PROPERTIES COMPILE_FLAGS "${EXTRA_CXX_FLAGS}") #告诉CMake我要链接哪个库文件 target_link_libraries(cudasift ${CUDA_cudadevrt_LIBRARY} ${OpenCV_LIBS} ${HDF5_CXX_LIBRARIES} ) # /usr/local/cuda/lib64/libcudadevrt.a ${OpenCV_LIBS} #) install(FILES ${cuda_sources} ${sources} cudaSiftD.cu CMakeLists.txt Copyright.txt DESTINATION . ) install(FILES data/left.pgm data/righ.pgm DESTINATION data )
v4_mainSift_h5_match.cpp
关键
float thresh = (imgSet ? 4.5f : 3.0f);
InitSiftData(siftData1, 4096, true, true); //
#include <iostream> #include <cmath> #include <dirent.h> //循环访问文件夹路径使用 #include <iomanip> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include "cudaImage.h" #include "cudaSift.h" #include "hdf5.h" #include <fstream> int ImproveHomography(SiftData &data, float *homography, int numLoops, float minScore, float maxAmbiguity, float thresh); void PrintMatchData(SiftData &siftData1, SiftData &siftData2, CudaImage &img); void MatchAll(SiftData &siftData1, SiftData &siftData2, float *homography); double ScaleUp(CudaImage &res, CudaImage &src); using namespace std; typedef struct { float xpos; float ypos; float scale; float sharpness; float edgeness; float orientation; float score; float ambiguity; int match; float match_xpos; float match_ypos; float match_error; float subsampling; float empty[3]; float data[128]; } SiftPoint_gpu; typedef struct { float xpos; float ypos; float scores; float descriptors[128]; } SiftPoint_cpu; // 获取目录下所有图像名称 std::vector<std::string> getAllImagesPath(std::string img_dir) { std::vector<std::string> img_path_all; // 读取文件夹下所有地图文件路径存储在 map_path_all数组中 DIR *pDir; struct dirent *ptr; if (!(pDir = opendir(img_dir.c_str()))) { std::cout<<"Folder doesn't Exist!"<<std::endl; } while ((ptr = readdir(pDir)) != 0) { if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) { std::string path = img_dir + "/" + ptr->d_name; img_path_all.push_back(path); std::cout << "img_name:" << path << std::endl; } } closedir(pDir); return img_path_all; } //特征点提取保存的名字 #define FILE "CudaSiftPoint.h5" //特征点关系保存保存名字 #define FILE_Match "CudaSiftMatch.h5" //单个文件夹循环读取图片提取特征点保存 void GetKeyPoint(vector<string> imgs_path ) { int devNum = 0, imgSet = 1; //1-1 初始化cuda加速器 std::cout << "Initializing data..." << std::endl; InitCuda(devNum); //1-2 初始化提取器 SiftData siftData1; float initBlur = 1.0f; float thresh = (imgSet ? 4.5f : 3.0f); InitSiftData(siftData1, 32768, true, true); // //1-3 初始化分配空间 unsigned int w = 1920; unsigned int h = 1080; float *memoryTmp = AllocSiftTempMemory(w, h, 5, false); cv::Mat limg;//创建空白图像 CudaImage img1;//创建空白cudA int IMG_NUM=imgs_path.size();//记录大小 // 3.存成h5文件 hid_t file; herr_t status; // 创建h5 file file = H5Fcreate(FILE,H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); hid_t group; hid_t space_kpt, space_dec, space_size, space_score; hid_t dset_kpt, dset_dec, dest_size, dest_score; for( int i=0;i<IMG_NUM;i++){ //2-1 读取图像 cv::imread(imgs_path[i], 0).convertTo(limg, CV_32FC1); //w = limg.cols; //h = limg.rows; //std::cout << "Image size = (" << w << "," << h << ")" << std::endl; //2-2 加载图像到cuda if(i==0){ img1.Allocate(w, h, iAlignUp(w, 128), false, NULL, (float*)limg.data); } img1.Download(); // 2-3 提取特征点 ExtractSift(siftData1, img1, 5, initBlur, thresh, 0.0f, false, memoryTmp); //2-4 访问所有特征点的属性 int numPts = siftData1.numPts;//特征点总数目 SiftPoint *sift1 = siftData1.h_data;//特征点的数据 // 构建group int p = imgs_path[i].find_last_of("/"); std::string g_name = imgs_path[i].substr(p+1); // std::cout<<g_name<<std::endl; group = H5Gcreate(file, g_name.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); float kpt_pos[numPts*2];//特征点列表 float score[numPts];//得分列表 float descriptors[128][numPts];//numPts个描述子 每个128维度 h5是竖着存储的 int img_size[2] = {w,h}; //逐个特征点访问 for (int j=0;j<numPts;j++) { kpt_pos[2 * j] = sift1[j].xpos; kpt_pos[2 * j + 1] = sift1[j].ypos; score[j]=sift1[j].score; for (int i =0;i<128;i++){ descriptors[i][j]=sift1[j].data[i]; } // cout<< "图像"<< imgs_path[i] << " (x,y) "<< x <<" " <<y<< "scores " <<scores <<endl; } // 1.特征点 // 设置数据空间 hsize_t dims_kpt[2] = {numPts, 2}; // n行2列 space_kpt = H5Screate_simple(2, dims_kpt, NULL); // 构建dataset dset_kpt = H5Dcreate(group, "keypoints", H5T_IEEE_F32LE, space_kpt, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); // 写入数据到dataset status = H5Dwrite(dset_kpt, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, kpt_pos); // 2.描述子 // hsize_t dims_dec[2] = {descriptors_vec[i].rows, descriptors_vec[i].cols}; // 行列 hsize_t dims_dec[2] = {128,numPts}; // 128行 1列 space_dec = H5Screate_simple(2, dims_dec, NULL); dset_dec = H5Dcreate(group, "descriptors", H5T_IEEE_F32LE, space_dec, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dset_dec, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, descriptors); // 3.特征点分数 hsize_t dims_score[1] = {numPts}; // n行1列 space_score = H5Screate_simple(1, dims_score, NULL); // 构建dataset dest_score = H5Dcreate(group, "scores", H5T_IEEE_F32LE, space_score, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dest_score, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, score); // 4.图像大小 hsize_t dims_size[1] = {2}; // space_size = H5Screate_simple(1, dims_size, NULL); // 构建dataset // 注意这里不能BE 需要是LE 涉及到字节存储顺序big-endian // https://stackoverflow.com/questions/59247385/why-does-torch-from-numpy-require-a-different-byte-ordering-while-matplotlib-doe // https://www.cnblogs.com/still-smile/p/11595775.html dest_size = H5Dcreate(group, "image_size", H5T_STD_I64LE, space_size, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dest_size, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, img_size); }//for 读取图像 //3-1 释放特征点临时空间 FreeSiftTempMemory(memoryTmp); //3-2Free Sift data from device FreeSiftData(siftData1); //4 // 关闭句柄 status = H5Dclose(dset_kpt); status = H5Sclose(space_kpt); status = H5Dclose(dset_dec); status = H5Sclose(space_dec); status = H5Dclose(dest_score); status = H5Sclose(space_score); status = H5Dclose(dest_size); status = H5Sclose(space_size); status = H5Gclose(group); status = H5Fclose(file); } //------------------------------------------------------------------------- //读取colmap生成的匹配txt,生成cudasift对应的h5文件 int beginnum=200; int endnum=600; //2260 // 0-200 85-77 //200-400 bool issaveh5=1;//是否保存h5 //输入文件路径txt void cudasift_matchImg( string txtpath) { //初始化 int devNum = 0, imgSet = 1; unsigned int w = 1920; unsigned int h = 1080; InitCuda(devNum); CudaImage img1, img2; cv::Mat limg, rimg; float initBlur = 1.0f; float thresh = (imgSet ? 4.5f : 3.0f);//阈值 4.5f -3000多个 3.0f - 10000多个 //特点点初始化 SiftData siftData1, siftData2; InitSiftData(siftData1, 32768, true, true); InitSiftData(siftData2, 32768, true, true); float *memoryTmp = AllocSiftTempMemory(w, h, 5, false); /* //循环读取 // 1 读取txt 逐行读取 空格分割 获取结果两个图像名字 */ ifstream in(txtpath); string line; vector< vector<string> > strALL_split; while (getline(in, line)) {//将in文件中的每一行字符读入到string line中 cout<< line <<endl; stringstream ss(line);//使用string初始化stringstream string tmp_str; vector<string> str_split; while(getline(ss,tmp_str,' ')){ str_split.push_back(tmp_str); } strALL_split.push_back(str_split); } // 3.存成h5文 herr_t status; //char FILE_Match[]="feats-superpoint-n4096-r1024_matches-NN-mutual_pairs-db-covis20.h5"; // 创建h5 file hid_t file; hid_t group ; hid_t dest_matchid,dest_matchiderror; if(issaveh5){file = H5Fcreate(FILE_Match,H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);} //int ci=beginnum-1; //-----------------------------------循环开始提取-------------------------------------- //if(strALL_split.size()<=endnum){endnum=strALL_split.size();} for (int i=0;i<strALL_split.size();i++){ cout <<"次数"<< i << "/"<< strALL_split.size()<<" 图像1 "<<strALL_split[i][0] << "\t 图像2 "<< strALL_split[i][1]<<endl; string img1name="data/imgs/"+strALL_split[i][0]; string img2name="data/imgs/"+strALL_split[i][1]; // 1 读取图像 cv::imread(img1name, 0).convertTo(limg, CV_32FC1); cv::imread(img2name, 0).convertTo(rimg, CV_32FC1); //2载入cuda内存 if(i==0){//只能执行一次 初始化分配 且图像格式是CV_32FC1 img1.Allocate(w, h, iAlignUp(w, 128), false, NULL, (float*)limg.data); img2.Allocate(w, h, iAlignUp(w, 128), false, NULL, (float*)rimg.data); } img1.Download(); img2.Download(); //3特征点提取 ExtractSift(siftData1, img1, 5, initBlur, thresh, 0.0f, false, memoryTmp); ExtractSift(siftData2, img2, 5, initBlur, thresh, 0.0f, false, memoryTmp); //4匹配 MatchSiftData(siftData1, siftData2); float homography[9]; int numMatches; FindHomography(siftData1, homography, &numMatches, 10000, 0.00f, 0.80f, 5.0); int numFit = ImproveHomography(siftData1, homography, 5, 0.00f, 0.80f, 3.0); //2-4 访问所有特征点的属性 int numPts = siftData1.numPts;//特征点总数目 SiftPoint *sift1 = siftData1.h_data;//特征点的数据 // float kpt_pos[numPts*2];//特征点列表 //float score[numPts];//得分列表 // float descriptors[128][numPts];//numPts个描述子 每个128维度 h5是竖着存储的 //int img_size[2] = {w,h}; float matchid[numPts]; float match_scores[numPts]; float minScore= 0.00f; float maxAmbiguity= 0.80f; float thresh=3.0; float limit = thresh*thresh; int no_num=0; //逐个特征点访问 for (int j=0;j<numPts;j++) { // if (sift1[j].score<minScore || sift1[j].ambiguity>maxAmbiguity) if(sift1[j].match_error>=limit) //剔除匹配不好的点 { no_num=no_num+1; matchid[j]=-1; //匹配为-1 } else { matchid[j]=sift1[j].match; //正常的匹配点 } match_scores[j]=sift1[j].match_error; } cout<<" 特征点总数 "<<numPts<< " 剔除的特征点 " << no_num<<endl; //保存h5 if(issaveh5){ //创建group std::string g_name = strALL_split[i][0]+"_"+strALL_split[i][1]; group = H5Gcreate(file, g_name.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (numPts==0){continue;} //创建数据格式 hsize_t dims_matchid[1] = {numPts}; // n行1列 hid_t space_matchid = H5Screate_simple(1, dims_matchid, NULL); //保存matches0数据 int16 H5T_STD_I64LE H5T_STD_I16LE--float dest_matchid = H5Dcreate(group, "matches0", H5T_STD_I16LE, space_matchid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dest_matchid, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,matchid); //保存matching_scores0数据 float32 hsize_t dims_matchiderror[1] = {numPts}; // n行1列 hid_t space_matchiderror = H5Screate_simple(1, dims_matchiderror, NULL); dest_matchiderror = H5Dcreate(group, "matching_scores0", H5T_IEEE_F32LE, space_matchiderror, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); status = H5Dwrite(dest_matchiderror, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT,match_scores); } }//txt循环每一行图像路径 if(issaveh5){ status = H5Dclose(dest_matchid); status = H5Dclose(dest_matchiderror); status = H5Dclose(group); status = H5Dclose(file); } FreeSiftTempMemory(memoryTmp); FreeSiftData(siftData1); FreeSiftData(siftData2); } int main() { // 1.读取文件夹下所有图像 string imgspath="./data/imgs"; vector<string> imgs_path = getAllImagesPath(imgspath); //2 提取特征点,没有筛选 ,并保存h5, 没有匹配 GetKeyPoint(imgs_path); //3提取特征点,匹配关系保存h5,从txt获取每行要对比的图像名字 //string txtpath="data/pairs-db-covis20.txt"; //cudasift_matchImg(txtpath); }
cmd中输入命令:vitables来打开ViTables,从而在可视化界面里来进行相应操作。