OpenCVDetect.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/xfeatures2d.hpp>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <vector>
  6. #include <filesystem>
  7. using namespace cv;
  8. using namespace cv::xfeatures2d;
  9. using namespace std;
  10. using namespace std::filesystem;
  11. const auto detector = SIFT::create();
  12. /// <summary>
  13. /// 提取图片特征描述符
  14. /// </summary>
  15. /// <param name="image">待提取图片路径</param>
  16. /// <param name="output">保存描述符路径</param>
  17. void process_image(const path& image, const path& output) {
  18. ofstream fs(output.string().c_str());
  19. if (!fs.is_open()) {
  20. cout << "create file error!";
  21. }
  22. fs.close();
  23. Mat input_image = imread(image.string());
  24. vector<KeyPoint> keypoints_cat;
  25. Mat descriptor_cat, descriptor_smallCat;
  26. detector->detectAndCompute(input_image, Mat(), keypoints_cat, descriptor_cat);
  27. Mat convert;
  28. if (descriptor_cat.type() != CV_32F)
  29. {
  30. descriptor_cat.convertTo(convert, CV_32F, 1.0 / 255, 0);
  31. }
  32. else
  33. {
  34. convert = descriptor_cat;
  35. }
  36. imwrite(output.string(), convert);
  37. }
  38. void deep_copy(const path& src, const path& des) {
  39. if (is_regular_file(src)) {
  40. auto d = des.string().substr(0, des.string().size() - 3) + "png\0";
  41. process_image(src, path(d));
  42. return;
  43. }
  44. if (!exists(des)) {
  45. create_directories(des);
  46. }
  47. for (auto& it : directory_iterator(src)) {
  48. string current = it.path().lexically_relative(it.path().parent_path()).string();
  49. path des_next(des);
  50. deep_copy(it.path(), des_next /= current);
  51. }
  52. }
  53. int main(int argc, char** argv) {
  54. string input_dir = "D:\\Work\\Cards";
  55. //string output_dir = "D:\\Work\\Outputs";
  56. string output_dir = "D:\\Work\\SIFT";
  57. path input_dir_path(input_dir.c_str());
  58. path output_dir_path(output_dir.c_str());
  59. if (!exists(input_dir_path)) {
  60. cout << "请设置正确的卡片存放路径" << endl;
  61. }
  62. if (exists(output_dir_path)) {
  63. remove_all(output_dir_path);
  64. }
  65. else {
  66. create_directories(output_dir_path);
  67. }
  68. directory_entry input_entry(input_dir_path);
  69. assert(input_entry.status().type() == file_type::directory);
  70. copy(input_dir_path, output_dir_path);
  71. deep_copy(input_dir_path, output_dir_path);
  72. return 0;
  73. }