grab_point_rs.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #pragma once
  2. #include <pcl\point_types.h>
  3. #include <pcl\point_cloud.h>
  4. #include <pcl\segmentation\sac_segmentation.h>
  5. #include "data_def_api.h"
  6. #include "data_def.h"
  7. #include "logger.h"
  8. #include "imstorage_manager.h"
  9. namespace graft_cv {
  10. class CRootStockGrabPoint {
  11. public:
  12. CRootStockGrabPoint(ConfigParam&c, CGcvLogger*pLog = 0);
  13. ~CRootStockGrabPoint();
  14. int grab_point_detect(PositionInfo& posinfo);
  15. float* get_raw_point_cloud(int &data_size);
  16. int load_data(float*pPoint, int pixel_size, int pt_size, int dtype, const char* fn = 0);
  17. void set_image_saver(CImStoreManager** ppis) { m_ppImgSaver = ppis; }
  18. private:
  19. //global configure parameters
  20. ConfigParam& m_cparam;
  21. CGcvLogger * m_pLogger;
  22. int m_dtype;
  23. string m_pcdId;
  24. //用于记录第一排z均值,用来辅助判别1、2排的苗
  25. float m_1st_row_zmean_rs = -1.0;
  26. float m_1st_row_zmean_sc = -1.0;
  27. CImStoreManager** m_ppImgSaver;
  28. pcl::PointCloud<pcl::PointXYZ>::Ptr m_raw_cloud;
  29. int read_ply_file(const char* fn);
  30. double compute_nearest_neighbor_distance(pcl::PointCloud<pcl::PointXYZ>::Ptr);
  31. ////////////////////////////////////////////////
  32. //---> 2023-8-8优化,seedling order识别错误问题
  33. /*void CRootStockGrabPoint::find_tray_top_edge(
  34. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  35. float & tray_top_edge_y
  36. );
  37. void CRootStockGrabPoint::find_seedling_position_line_based(
  38. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  39. std::vector<int> &first_seedling_cloud_idx,
  40. pcl::PointXYZ&xz_center
  41. );
  42. void segement_line(
  43. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud
  44. );*/
  45. //<---------
  46. //叶子剔除
  47. void leaf_filter(
  48. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  49. std::vector<int> &stem_cloud_idx
  50. );
  51. void gen_all_seedling_positions(
  52. pcl::PointXYZ&key_center, //输入,已知的苗的坐标
  53. std::vector<pcl::PointXYZ>&candidate_center //输出,有倾斜苗的坐标
  54. );
  55. void find_seedling_position_key(
  56. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  57. std::vector<int> &first_seedling_cloud_idx,
  58. pcl::PointXYZ&xz_center,
  59. pcl::ModelCoefficients::Ptr& lmodel
  60. );
  61. // 邻域最小抑制
  62. void nms_box(
  63. std::vector<pcl::PointXYZ>&clt_root_v, //目标点的可能位置
  64. std::vector<float>&valid_box_cc_dist, //目标点的重心到中心的距离,距离越近越好
  65. float hole_step_radius, //目标点搜索半径
  66. std::vector<pcl::PointXYZ>& target_toot // 返回值
  67. );
  68. //通过指定位置内,取部分点云分析是否存在真正的茎,真茎位置保存到target_filtered
  69. void line_filter(pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud, //输入点云
  70. float radius, //输入,取点半径
  71. float ymin, //输入,y最小值
  72. float ymax, //输入,y最大值
  73. std::vector<pcl::PointXYZ>&target_root, //输入,位置
  74. std::vector<pcl::PointXYZ>&target_filtered, //输出,位置
  75. std::vector<pcl::PointXYZ>&target_filtered_root, //输出,茎上根部点坐标
  76. std::vector<std::vector<int>>&target_filtered_element, //输出,茎上点index
  77. std::vector<pcl::ModelCoefficients::Ptr>& target_filtered_models//输出,茎直线模型
  78. );
  79. /////////////////////////////////////////////////
  80. void find_seedling_position(
  81. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  82. std::vector<int> &first_seedling_cloud_idx,
  83. pcl::PointXYZ&xz_center
  84. );
  85. void crop_nn_analysis(
  86. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  87. pcl::PointCloud<pcl::PointXYZ>::Ptr seed_cloud,
  88. double dist_mean,
  89. std::vector<double>&mass_indices,
  90. std::vector<int>& idx
  91. );
  92. void euclidean_clustering_ttsas(
  93. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  94. double d1, double d2,
  95. std::vector<pcl::PointXYZ>&cluster_center,
  96. std::vector<std::vector<int>> &clustr_member
  97. );
  98. void cal_obb_2d(
  99. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  100. int axis,
  101. double &dx_obb,
  102. double &dy_obb,
  103. double &angle_obb);
  104. void get_optimal_seed(
  105. pcl::PointCloud<pcl::PointXYZ>::Ptr,
  106. pcl::PointXYZ&pt,
  107. int &pt_idx);
  108. //已知检测出苗的位置,找出有可能有苗的位置
  109. void tilted_seedling_discover(
  110. std::vector<pcl::PointXYZ>&cluster_center, //输入,已知的苗的坐标
  111. std::vector<pcl::PointXYZ>&tilted_center //输出,有倾斜苗的坐标
  112. );
  113. //通过比较直线点云和原始点云相同位置邻域内xz的范围,确定此点是否是无干扰点的茎
  114. /*void get_optimal_seed_compare(
  115. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  116. pcl::PointCloud<pcl::PointXYZ>::Ptr in_line_cloud,
  117. pcl::PointXYZ&pt,
  118. int &pt_idx,
  119. std::vector<int>& valid_line_index
  120. );*/
  121. //通过比较直线点云和原始点云相同位置邻域内xz的范围,确定此点是否是无干扰点的茎
  122. void get_optimal_seed_compare(
  123. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud, //input
  124. pcl::PointCloud<pcl::PointXYZ>::Ptr in_line_cloud, //input
  125. pcl::ModelCoefficients::Ptr line_model, //input
  126. pcl::PointXYZ&pt,
  127. int &pt_idx,
  128. std::vector<int>& valid_line_index
  129. );
  130. //在一株苗的空间范围内找出直线(茎,假设茎是直线分布的),并返回直线上的点index
  131. void find_line_in_cube(
  132. pcl::PointCloud<pcl::PointXYZ>::Ptr, //输入,整体点云
  133. pcl::PointXYZ& min_pt_ex, //输入,
  134. pcl::PointXYZ& max_pt_ex, //输入,
  135. std::vector<int>& out_idx //输出,直线上点的index, 基于输入整体点云
  136. );
  137. //生成结果图片
  138. void gen_result_img(
  139. pcl::PointCloud<pcl::PointXYZ>::Ptr, //输入,整体点云cloud_dowm_sampled,
  140. pcl::PointXYZ& selected_pt, //输入,selected_pt,
  141. cv::Mat& rst_img //输出,图片, 640*1280
  142. );
  143. void viewer_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr, std::string&winname);
  144. void viewer_cloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr, std::string&winname);
  145. void viewer_cloud_debug(
  146. pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
  147. pcl::PointXYZ&p,
  148. pcl::PointXYZ &root_pt,
  149. std::string&winname);
  150. void viewer_cloud_cluster(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud, std::vector<pcl::PointXYZ>cluster_center, std::string&winname);
  151. void viewer_cloud_cluster_box(
  152. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
  153. std::vector<pcl::PointXYZ>&cluster_center,
  154. std::vector<pcl::PointXYZ>&cluster_box,
  155. std::vector<std::vector<int> >& clt_line_idx,
  156. std::string&winname);
  157. };
  158. };