grab_occlusion.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #pragma once
  2. #include <vector>
  3. #include <string>
  4. #include <math.h>
  5. #include <pcl\point_types.h>
  6. #include <pcl\point_cloud.h>
  7. #include "logger.h"
  8. namespace graft_cv {
  9. class CStemResult {
  10. public:
  11. CStemResult() :
  12. root_x(0.0),
  13. root_z(0.0),
  14. stem_size(0),
  15. batch_id(std::string("")),
  16. root_count(0)
  17. {};
  18. CStemResult(double x,double y, double z, int size, std::string& bid, int rcount)
  19. {
  20. root_x = x;
  21. root_y = y;
  22. root_z = z;
  23. stem_size = size;
  24. batch_id = std::string(bid);
  25. root_count = rcount;
  26. };
  27. double calcluate_distance(const CStemResult& sr) {
  28. double dist = 0.0;
  29. dist = sqrt((this->root_x - sr.root_x) *(this->root_x - sr.root_x) +
  30. //(this->root_y - sr.root_y) *(this->root_y - sr.root_y) +
  31. (this->root_z - sr.root_z) *(this->root_z - sr.root_z));
  32. return dist;
  33. };
  34. double root_x; //识别到的茎根x坐标
  35. double root_y;
  36. double root_z; //识别到的茎根z坐标
  37. int stem_size; //识别到的茎根矩形邻域点云数量
  38. std::string batch_id; //识别到的茎批次(每一次处理,批次一致)
  39. int root_count; //统计root的累计个数
  40. private:
  41. };
  42. class CStemResultInfos {
  43. public:
  44. CStemResultInfos(
  45. double seedling_dist,
  46. int holes_number,
  47. double x_min,
  48. double x_max,
  49. double z_min,
  50. double z_max,
  51. std::string pcd_id,
  52. CGcvLogger*pLog=0);
  53. ~CStemResultInfos();
  54. //void set_json_filename(std::string& filename);
  55. //void read_root_centers(std::string& filename);//读取历史数据,每次启动时,去取
  56. //void write_root_centers(std::string& filename);//保存当前数据,间隔一定时间保存一次
  57. void append(CStemResult& sr);
  58. void clear();
  59. void get_root_centers(std::vector<CStemResult>&rst);
  60. protected:
  61. CGcvLogger * m_pLogger;
  62. int m_max_size; //m_infos最大长度
  63. std::vector<CStemResult> m_infos;
  64. double m_seedling_dist; //植株间距,毫米
  65. std::vector<CStemResult> m_root_centers; //茎根位置历史平均值
  66. //int m_append_counter;
  67. //std::string m_json_filename;
  68. std::string m_pcdId;
  69. int m_holes_number;
  70. double m_xmin;
  71. double m_xmax;
  72. double m_zmin;
  73. double m_zmax;
  74. void _update_root_centers(CStemResult& sr); //通过当前的数据生成茎中心位置,聚类
  75. //void _filter_root_centers(double d1, double d2); //对生成的根中心m_root_centers进行过滤,剔除异常
  76. //void euclidean_clustering_ttsas(
  77. // pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  78. // double d1, double d2,
  79. // std::vector<pcl::PointXYZ>&cluster_center,
  80. // std::vector<std::vector<int>> &clustr_member
  81. //);
  82. void gen_root_centers();
  83. };
  84. //植株状态,记录植株点云分布情况,用于确定植株是否被取走,穴位是否有苗
  85. class CSeedlingStatus {
  86. public:
  87. CSeedlingStatus(
  88. int dtype, //1-砧木, 0-穗苗
  89. double step, //x方向直方图点云分布,每个bin的宽度(默认5毫米)
  90. double x_min, //x的下限
  91. double x_max, //x的上限
  92. double pc_mean_dist, //点云,两点间平均距离
  93. CGcvLogger*pLog = 0);
  94. ~CSeedlingStatus();
  95. void set_x_centers(std::vector<double>&cx);
  96. void append_hist(std::vector<int>&xhist //input
  97. //std::vector<bool>&xstatus //output
  98. );
  99. //实际茎检测的结果,更新到历史记录中
  100. void real_result_update(
  101. std::vector<pcl::PointXYZ>& root);
  102. //实际叶遮挡检测的结果,更新到历史记录中
  103. void occlusion_result_update(
  104. std::vector<int>& leaf_occlusion
  105. );
  106. //获取植株的状态,是否有苗
  107. void get_stem_status(
  108. std::vector<int>&xstatus
  109. );
  110. protected:
  111. CGcvLogger * m_pLogger;
  112. int m_max_size; //最大记录长度
  113. int m_record_cursor;
  114. int m_global_cursor;
  115. cv::Mat m_history_histogram; //历史点云每个穴位的点云数量
  116. cv::Mat m_history_point_size; //历史点云框内数量
  117. cv::Mat m_history_status; //历史穴位是有苗状态
  118. std::vector<int> m_idx_low; //穴位对应的序号低位
  119. std::vector<int> m_idx_up; //穴位对应的序号低位
  120. int m_dtype; //1-砧木, 0-穗苗
  121. double m_xmin; //x的下限
  122. double m_xmax; //x的上限
  123. double m_bin_step; //x方向直方图点云分布,每个bin的宽度(默认5毫米)
  124. double m_pc_mean_dist; //点云,两点间平均距离
  125. std::vector<double>m_center_x;
  126. int m_hist_length;
  127. std::vector<int>m_center_grabed_record;//植株被取走的记录, -1--不确定, 0--已抓取
  128. int get_status(int& max_idx, float&max_change);
  129. void calculate_center_size(
  130. std::vector<int>&xhist, //input
  131. std::vector<float>&x_count//output
  132. );
  133. std::vector<int> m_stem_status;//0--没有,1--茎检测有结果, 2---遮挡检测有结果
  134. };
  135. }