cut_point_rs.h 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. //cut point recognization for rootstock plant
  2. #pragma once
  3. #include <time.h>
  4. #include <opencv.hpp>
  5. #include "data_def_api.h"
  6. #include "data_def.h"
  7. #include "logger.h"
  8. #include "imstorage_manager.h"
  9. //using namespace cv;
  10. namespace graft_cv{
  11. class CRootStockCutPoint{
  12. public:
  13. CRootStockCutPoint(ConfigParam&c,CGcvLogger*pLog=0);
  14. ~CRootStockCutPoint();
  15. int up_point_detect(//上切割点,切前识别
  16. ImgInfo*,
  17. cv::Mat&,
  18. PositionInfo& posinfo,
  19. map<string, cv::Mat>& img_cache
  20. );
  21. //int up_point_reid( // 上切割点,切后重识别
  22. // ImgInfo*,
  23. // Mat&,
  24. // double edge_length,
  25. // PositionInfo& posinfo
  26. // );
  27. void set_image_saver(CImStoreManager** ppis){m_ppImgSaver=ppis;}
  28. private:
  29. cv::Mat m_binImg;// binary image
  30. cv::Mat m_grayImg;// gray image
  31. cv::Mat m_edgeImg;
  32. string m_imgId;
  33. CImStoreManager** m_ppImgSaver;
  34. //返回图片,用于调试
  35. ImgInfo* m_pImginfoBinFork;//fork-y, right-x
  36. ImgInfo* m_pImgCorners;//corners, reference-point, candidate box
  37. ImgInfo* m_pImgCutPoint;//reference-point, cutpoint
  38. //global configure parameters
  39. ConfigParam& m_cparam;
  40. CGcvLogger * m_pLogger;
  41. // image segment
  42. void img_segment(cv::Mat&);
  43. // get_optimal_corner()
  44. // return 0--success, 1--error
  45. int get_optimal_corner(
  46. int ref_x,
  47. int ref_y,
  48. std::vector<cv::Point2f>& corners,
  49. int stem_dia,
  50. double cand_corner_box_width_ratio,
  51. double cand_corner_box_xoffset_ratio,
  52. double opt_corner_xoffset_ratio,
  53. double opt_corner_yoffset_ratio,
  54. double corner_mask_radius_ratio,
  55. cv::Point2f& cut_pt);
  56. void get_default_cutpoint(
  57. int fork_cent_x,
  58. int fork_cent_y,
  59. int fork_stem_dia,
  60. cv::Point2f& cut_pt);
  61. void clear_imginfo();
  62. /// pre-cut calculationo
  63. //# 通过砧木切前切割点识别结果(切割点)、二值图像,茎根y值,刀角度
  64. //# 输出切割点到根部的边缘曲线长度
  65. double get_cut_edge_length(
  66. cv::Mat& bin_img,
  67. cv::Mat& edge_img,
  68. gcv_point<int>& start_pt, //up cut point
  69. gcv_point<int>& lower_cut_pt,//output
  70. gcv_point<int>& root_pt,//output
  71. double cut_angle,
  72. int y_max,
  73. int stem_dia,
  74. clock_t t0
  75. );
  76. void find_lower_cut_point(
  77. cv::Mat& bin_img,
  78. gcv_point<int>&start_pt,
  79. gcv_point<int>&end_pt,//output
  80. double cut_angle,
  81. int stem_dia);
  82. double calculate_edge_length(
  83. cv::Mat& edge_img,
  84. gcv_point<int>&lower_cut_pt,
  85. gcv_point<int>&root_pt,//output
  86. int y_max,
  87. clock_t t0
  88. );
  89. //corner evluation
  90. void corner_magnificence(
  91. const vector<cv::Point2f>& cand_pts,
  92. int stem_dia,
  93. double corner_mask_radius_ratio,
  94. vector<double>& scores
  95. );
  96. //functions for reid
  97. int get_root_point_reid(
  98. int x0,
  99. int x1,
  100. int stem_end_y,
  101. bool is_right //是否右侧根部点, true-右侧,false-左侧
  102. );
  103. void find_upper_cut_point_reid(
  104. cv::Mat& edge_img,
  105. gcv_point<int>&start_pt,
  106. gcv_point<int>&end_pt,//output
  107. double curve_length
  108. );
  109. void get_stem_root_y(
  110. vector<int>&hist_row,
  111. double rs_stem_dia_min,
  112. int &stem_end_y);
  113. };
  114. };