tea_sorter.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #pragma once
  2. #include <opencv.hpp>
  3. #include "data_def_api.h"
  4. #include "data_def.h"
  5. #include "logger.h"
  6. #include "tea_detect.h"
  7. #include "imstorage_manager.h"
  8. using namespace cv;
  9. namespace graft_cv{
  10. class CTeaSort{
  11. public:
  12. CTeaSort(
  13. ConfigParam& ap,
  14. img_type dtype,
  15. CGcvLogger*pLog = 0
  16. );
  17. ~CTeaSort();
  18. int detect(
  19. ImgInfo*, PositionInfo& posinfo, const char* fn = 0);
  20. int load_data(
  21. ImgInfo*imginfo,
  22. const char* fn = 0);
  23. int load_model();
  24. void set_image_saver(CImStoreManager** ppis) { m_ppImgSaver = ppis; }
  25. private:
  26. img_type m_dtype; // data type: tea_grab, tea_cut
  27. string m_imgId;
  28. string m_dtype_str;
  29. Mat m_raw_img;
  30. Mat m_raw_gray_img;
  31. ConfigParam& m_cp;
  32. YoloDrop m_drop_detector;
  33. CImStoreManager** m_ppImgSaver;
  34. CGcvLogger* m_pLogger;
  35. ImgInfo* m_pImginfoRaw;
  36. ImgInfo* m_pImginfoDetected;
  37. void img_rgb2bgr(cv::Mat&img);
  38. int generate_detect_windows(vector<Rect>&boxes);
  39. int detect_impl(cv::Mat& img, vector<Rect>&drop_regions, vector<Bbox> &droplets_raw);
  40. void clear_imginfo();
  41. double calculate_angle(Bbox&b, double& grab_x, double&grab_y);
  42. //// --- disused
  43. //void calculate_stem_grab_position(Bbox&b, double& grab_x, double&grab_y, double& grab_angle);
  44. void calculate_stem_grab_position_opt(Bbox&b, double& grab_x, double&grab_y, double& grab_angle);
  45. void calculate_stem_cut_position_opt(Bbox&b, double& grab_x, double&grab_y, double& grab_angle);
  46. //thinning
  47. void thinningIteration(cv::Mat& img, int iter);
  48. void thinning(const cv::Mat& src, cv::Mat& dst);
  49. //// --- disused
  50. //void distance_thinning(const cv::Mat& src, cv::Mat& dst);
  51. void part_thinning(const cv::Mat& src, cv::Mat& dst);
  52. //find grab position
  53. double get_grab_position(const std::vector<cv::Point2f>& inner_pixels,
  54. const cv::Mat& skele_img,
  55. cv::Point&vertex,
  56. double ref_angle);
  57. void calc_bottom_vertex(cv::Point&vertex, double ref_angle, double delta_angle, double radius, cv::Point&bpt0, cv::Point&bpt1);
  58. //// --- disused
  59. //bool poly_fit_cv(std::vector<cv::Point>& key_point, int n, cv::Mat& A);
  60. //double calc_fit_y(double x,cv::Mat& A);
  61. void line_fit(std::vector<cv::Point2f>& key_point, cv::Vec4f& lines);
  62. /**
  63. 计算 [-pi,pi]间的两个角间的夹角
  64. */
  65. double intersection_angle(double ref_angle, double angle_to_p3);
  66. /**
  67. 计算灰度图是否为空(料盘是否为空)
  68. */
  69. bool is_empty_feeder(cv::Mat& raw_img, double th=20.0);
  70. /**
  71. 计算框图中单例概率
  72. */
  73. double singleten_ratio(Bbox& region);
  74. /**
  75. 计算框图方向系数, 针对抓取
  76. */
  77. double direction_ratio(Bbox& box);
  78. /**
  79. 计算综合得分,并排序, 针对抓取
  80. */
  81. void calculate_overall_score_grab(std::vector<Bbox> &drops);
  82. };
  83. };