grab_point_rs.h 5.3 KB

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