#include #include #include #include #include #include using namespace cv; using namespace cv::xfeatures2d; using namespace std; using namespace std::filesystem; const auto detector = SIFT::create(); /// /// 提取图片特征描述符 /// /// 待提取图片路径 /// 保存描述符路径 void process_image(const path& image, const path& output) { ofstream fs(output.string().c_str()); if (!fs.is_open()) { cout << "create file error!"; } fs.close(); Mat input_image = imread(image.string()); vector keypoints_cat; Mat descriptor_cat, descriptor_smallCat; detector->detectAndCompute(input_image, Mat(), keypoints_cat, descriptor_cat); Mat convert; if (descriptor_cat.type() != CV_32F) { descriptor_cat.convertTo(convert, CV_32F, 1.0 / 255, 0); } else { convert = descriptor_cat; } imwrite(output.string(), convert); } void deep_copy(const path& src, const path& des) { if (is_regular_file(src)) { auto d = des.string().substr(0, des.string().size() - 3) + "png\0"; process_image(src, path(d)); return; } if (!exists(des)) { create_directories(des); } for (auto& it : directory_iterator(src)) { string current = it.path().lexically_relative(it.path().parent_path()).string(); path des_next(des); deep_copy(it.path(), des_next /= current); } } int main(int argc, char** argv) { string input_dir = "D:\\Work\\Cards"; //string output_dir = "D:\\Work\\Outputs"; string output_dir = "D:\\Work\\SIFT"; path input_dir_path(input_dir.c_str()); path output_dir_path(output_dir.c_str()); if (!exists(input_dir_path)) { cout << "请设置正确的卡片存放路径" << endl; } if (exists(output_dir_path)) { remove_all(output_dir_path); } else { create_directories(output_dir_path); } directory_entry input_entry(input_dir_path); assert(input_entry.status().type() == file_type::directory); copy(input_dir_path, output_dir_path); deep_copy(input_dir_path, output_dir_path); return 0; }