12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- #include <opencv2/opencv.hpp>
- #include <opencv2/xfeatures2d.hpp>
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <filesystem>
- using namespace cv;
- using namespace cv::xfeatures2d;
- using namespace std;
- using namespace std::filesystem;
- const auto detector = SIFT::create();
- /// <summary>
- /// 提取图片特征描述符
- /// </summary>
- /// <param name="image">待提取图片路径</param>
- /// <param name="output">保存描述符路径</param>
- 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<KeyPoint> 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;
- }
|