#ifndef __POINTSIFT__HH___API #define __POINTSIFT__HH___API #include #include "pointSIFT_API.h" #include "../error_code/error_code.h" #include #include //Cloud_box,点云的三维方框, typedef struct Cloud_box { double x_min; double x_max; double y_min; double y_max; double z_min; double z_max; }Cloud_box; /* * 封装PointSift点云分割网络,输入点云,分割出汽车,检验结果 * 功能包括将pcl点云数据格式转换成原始数据格式float* * 将识别数据转换成点云数据并用不同颜色区分 */ class Point_sift_segmentation : public PointSifter { public: Point_sift_segmentation(int point_size,int cls,float freq,pcl::PointXYZ minp,pcl::PointXYZ maxp); Point_sift_segmentation(int point_size,int cls,float freq, Cloud_box cloud_box); virtual ~Point_sift_segmentation(); //初始化网络, 加载网络权重 virtual Error_manager init(std::string graph,std::string cpkt); //分割函数,输入点云,输出各类的点云,并保存中间文件方便查看识别结果. //cloud:输入点云, (有内存) //cloud_vector:输出分类好的多个点云(附带颜色,红色为杂物,绿色为车,白色为地面)(此时里面没有内存) virtual Error_manager segmentation(pcl::PointCloud::Ptr p_cloud_in, std::vector::Ptr>& cloud_vector, bool save_flag, std::string save_dir); protected: //使用体素网格, 抽稀点云, //将点云空间分为小方格,每个小方格只保留一个点. Error_manager filter_cloud_with_voxel_grid(pcl::PointCloud::Ptr p_cloud); //使用box限定点云范围,只保留box范围内部的点, 剔除外部的点云 Error_manager filter_cloud_with_box(pcl::PointCloud::Ptr p_cloud); //通过输入点云,更新边界区域范围 Error_manager update_region(pcl::PointCloud::Ptr p_cloud); //抽稀点云, //自己写的算法, 重新生成新的点云. Error_manager filter_cloud_with_my_grid(pcl::PointCloud::Ptr p_cloud); //从点云中选出固定数量的随机点, 默认8192个点 //p_cloud_in::输入点云, 有内存,且size>0 //p_cloud_out::输出点云, 需要提前分配内存. size==0 Error_manager filter_cloud_with_select(pcl::PointCloud::Ptr p_cloud_in, pcl::PointCloud::Ptr p_cloud_out); //将点云数据转换到float* Error_manager translate_cloud_to_float(pcl::PointCloud::Ptr p_cloud_in, float* p_data_out); //恢复点云, 将float*转换成点云 //p_data_type:输入点云对应的类别,大小为 点数*类别 //p_data_point:输入点云数据(xyz) //cloud_vector::输出带颜色的点云vector Error_manager recovery_float_to_cloud(float* p_data_type, float* p_data_point, std::vector::Ptr>& cloud_vector); //保存点云数据 Error_manager save_cloud(std::vector::Ptr>& cloud_vector, std::string save_dir); protected: float m_freq; //抽稀的分辨率, pcl::PointXYZ m_minp; //真实点云的最小值, 区域范围 pcl::PointXYZ m_maxp; //真实点云的最大值, 区域范围 Cloud_box m_cloud_box_limit; //限制点云的方框, 只有在有效区域内的点才能参与计算. }; #endif