#pragma once #include #include #include "data_def_api.h" #include "data_def.h" #include "logger.h" #include "imstorage_manager.h" namespace graft_cv { class CRootStockGrabPoint { public: CRootStockGrabPoint(ConfigParam&c, CGcvLogger*pLog = 0); ~CRootStockGrabPoint(); int grab_point_detect( int dtype, PositionInfo& posinfo); float* get_raw_point_cloud(int &data_size); int load_data(float*pPoint, int pixel_size, int pt_size, const char* fn = 0); void set_image_saver(CImStoreManager** ppis) { m_ppImgSaver = ppis; } private: //global configure parameters ConfigParam& m_cparam; CGcvLogger * m_pLogger; int m_dtype; string m_pcdId; //用于记录第一排z均值,用来辅助判别1、2排的苗 float m_1st_row_zmean_rs = -1.0; float m_1st_row_zmean_sc = -1.0; CImStoreManager** m_ppImgSaver; pcl::PointCloud::Ptr m_raw_cloud; int read_ply_file(const char* fn); double compute_nearest_neighbor_distance(pcl::PointCloud::Ptr); //////////////////////////////////////////////// //---> 2023-8-8优化,seedling order识别错误问题 /*void CRootStockGrabPoint::find_tray_top_edge( pcl::PointCloud::Ptr in_cloud, float & tray_top_edge_y ); void CRootStockGrabPoint::find_seedling_position_line_based( pcl::PointCloud::Ptr in_cloud, std::vector &first_seedling_cloud_idx, pcl::PointXYZ&xz_center ); void segement_line( pcl::PointCloud::Ptr in_cloud );*/ //<--------- void gen_all_seedling_positions( pcl::PointXYZ&key_center, //输入,已知的苗的坐标 std::vector&candidate_center //输出,有倾斜苗的坐标 ); void find_seedling_position_key( pcl::PointCloud::Ptr in_cloud, std::vector &first_seedling_cloud_idx, pcl::PointXYZ&xz_center ); // 邻域最小抑制 void nms_box( std::vector&clt_root_v, //目标点的可能位置 std::vector&valid_box_cc_dist, //目标点的重心到中心的距离,距离越近越好 float hole_step_radius, //目标点搜索半径 std::vector& target_toot // 返回值 ); //通过指定位置内,取部分点云分析是否存在真正的茎,真茎位置保存到target_filtered void line_filter(pcl::PointCloud::Ptr in_cloud, //输入点云 float radius, //输入,取点半径 float ymin, //输入,y最小值 float ymax, //输入,y最大值 std::vector&target_root, //输入,位置 std::vector&target_filtered, //输出,位置 std::vector&target_filtered_root, //输出,茎上根部点坐标 std::vector>&target_filtered_element //输出,茎上点index ); ///////////////////////////////////////////////// void find_seedling_position( pcl::PointCloud::Ptr in_cloud, std::vector &first_seedling_cloud_idx, pcl::PointXYZ&xz_center ); void crop_nn_analysis( pcl::PointCloud::Ptr in_cloud, pcl::PointCloud::Ptr seed_cloud, double dist_mean, std::vector&mass_indices, std::vector& idx ); void euclidean_clustering_ttsas( pcl::PointCloud::Ptr in_cloud, double d1, double d2, std::vector&cluster_center, std::vector> &clustr_member ); void cal_obb_2d( pcl::PointCloud::Ptr in_cloud, int axis, double &dx_obb, double &dy_obb, double &angle_obb); void get_optimal_seed( pcl::PointCloud::Ptr, pcl::PointXYZ&pt, int &pt_idx); //已知检测出苗的位置,找出有可能有苗的位置 void tilted_seedling_discover( std::vector&cluster_center, //输入,已知的苗的坐标 std::vector&tilted_center //输出,有倾斜苗的坐标 ); //通过比较直线点云和原始点云相同位置邻域内xz的范围,确定此点是否是无干扰点的茎 void get_optimal_seed_compare( pcl::PointCloud::Ptr in_cloud, pcl::PointCloud::Ptr in_line_cloud, pcl::PointXYZ&pt, int &pt_idx, std::vector& valid_line_index ); //在一株苗的空间范围内找出直线(茎,假设茎是直线分布的),并返回直线上的点index void find_line_in_cube( pcl::PointCloud::Ptr, //输入,整体点云 pcl::PointXYZ& min_pt_ex, //输入, pcl::PointXYZ& max_pt_ex, //输入, std::vector& out_idx //输出,直线上点的index, 基于输入整体点云 ); void viewer_cloud(pcl::PointCloud::Ptr, std::string&winname); void viewer_cloud(pcl::PointCloud::Ptr, std::string&winname); void viewer_cloud_debug( pcl::PointCloud::Ptr cloud, pcl::PointXYZ&p, pcl::PointXYZ &root_pt, std::string&winname); void viewer_cloud_cluster(pcl::PointCloud::Ptr cloud, std::vectorcluster_center, std::string&winname); void viewer_cloud_cluster_box( pcl::PointCloud::Ptr cloud, std::vector&cluster_center, std::vector&cluster_box, std::vector >& clt_line_idx, std::string&winname); }; };