grab_point_rs.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. void gen_all_seedling_positions(
  47. pcl::PointXYZ&key_center, //输入,已知的苗的坐标
  48. std::vector<pcl::PointXYZ>&candidate_center //输出,有倾斜苗的坐标
  49. );
  50. void find_seedling_position_key(
  51. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  52. std::vector<int> &first_seedling_cloud_idx,
  53. pcl::PointXYZ&xz_center,
  54. pcl::ModelCoefficients::Ptr& lmodel
  55. );
  56. // 邻域最小抑制
  57. void nms_box(
  58. std::vector<pcl::PointXYZ>&clt_root_v, //目标点的可能位置
  59. std::vector<float>&valid_box_cc_dist, //目标点的重心到中心的距离,距离越近越好
  60. float hole_step_radius, //目标点搜索半径
  61. std::vector<pcl::PointXYZ>& target_toot // 返回值
  62. );
  63. //通过指定位置内,取部分点云分析是否存在真正的茎,真茎位置保存到target_filtered
  64. void line_filter(pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud, //输入点云
  65. float radius, //输入,取点半径
  66. float ymin, //输入,y最小值
  67. float ymax, //输入,y最大值
  68. std::vector<pcl::PointXYZ>&target_root, //输入,位置
  69. std::vector<pcl::PointXYZ>&target_filtered, //输出,位置
  70. std::vector<pcl::PointXYZ>&target_filtered_root, //输出,茎上根部点坐标
  71. std::vector<std::vector<int>>&target_filtered_element, //输出,茎上点index
  72. std::vector<pcl::ModelCoefficients::Ptr>& target_filtered_models//输出,茎直线模型
  73. );
  74. /////////////////////////////////////////////////
  75. void find_seedling_position(
  76. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  77. std::vector<int> &first_seedling_cloud_idx,
  78. pcl::PointXYZ&xz_center
  79. );
  80. void crop_nn_analysis(
  81. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  82. pcl::PointCloud<pcl::PointXYZ>::Ptr seed_cloud,
  83. double dist_mean,
  84. std::vector<double>&mass_indices,
  85. std::vector<int>& idx
  86. );
  87. void euclidean_clustering_ttsas(
  88. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  89. double d1, double d2,
  90. std::vector<pcl::PointXYZ>&cluster_center,
  91. std::vector<std::vector<int>> &clustr_member
  92. );
  93. void cal_obb_2d(
  94. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  95. int axis,
  96. double &dx_obb,
  97. double &dy_obb,
  98. double &angle_obb);
  99. void get_optimal_seed(
  100. pcl::PointCloud<pcl::PointXYZ>::Ptr,
  101. pcl::PointXYZ&pt,
  102. int &pt_idx);
  103. //已知检测出苗的位置,找出有可能有苗的位置
  104. void tilted_seedling_discover(
  105. std::vector<pcl::PointXYZ>&cluster_center, //输入,已知的苗的坐标
  106. std::vector<pcl::PointXYZ>&tilted_center //输出,有倾斜苗的坐标
  107. );
  108. //通过比较直线点云和原始点云相同位置邻域内xz的范围,确定此点是否是无干扰点的茎
  109. /*void get_optimal_seed_compare(
  110. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud,
  111. pcl::PointCloud<pcl::PointXYZ>::Ptr in_line_cloud,
  112. pcl::PointXYZ&pt,
  113. int &pt_idx,
  114. std::vector<int>& valid_line_index
  115. );*/
  116. //通过比较直线点云和原始点云相同位置邻域内xz的范围,确定此点是否是无干扰点的茎
  117. void get_optimal_seed_compare(
  118. pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud, //input
  119. pcl::PointCloud<pcl::PointXYZ>::Ptr in_line_cloud, //input
  120. pcl::ModelCoefficients::Ptr line_model, //input
  121. pcl::PointXYZ&pt,
  122. int &pt_idx,
  123. std::vector<int>& valid_line_index
  124. );
  125. //在一株苗的空间范围内找出直线(茎,假设茎是直线分布的),并返回直线上的点index
  126. void find_line_in_cube(
  127. pcl::PointCloud<pcl::PointXYZ>::Ptr, //输入,整体点云
  128. pcl::PointXYZ& min_pt_ex, //输入,
  129. pcl::PointXYZ& max_pt_ex, //输入,
  130. std::vector<int>& out_idx //输出,直线上点的index, 基于输入整体点云
  131. );
  132. //生成结果图片
  133. void gen_result_img(
  134. pcl::PointCloud<pcl::PointXYZ>::Ptr, //输入,整体点云cloud_dowm_sampled,
  135. pcl::PointXYZ& selected_pt, //输入,selected_pt,
  136. cv::Mat& rst_img //输出,图片, 640*1280
  137. );
  138. void viewer_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr, std::string&winname);
  139. void viewer_cloud(pcl::PointCloud<pcl::PointXYZRGB>::Ptr, std::string&winname);
  140. void viewer_cloud_debug(
  141. pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
  142. pcl::PointXYZ&p,
  143. pcl::PointXYZ &root_pt,
  144. std::string&winname);
  145. void viewer_cloud_cluster(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud, std::vector<pcl::PointXYZ>cluster_center, std::string&winname);
  146. void viewer_cloud_cluster_box(
  147. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
  148. std::vector<pcl::PointXYZ>&cluster_center,
  149. std::vector<pcl::PointXYZ>&cluster_box,
  150. std::vector<std::vector<int> >& clt_line_idx,
  151. std::string&winname);
  152. };
  153. };