12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #ifndef __POINTSIFT__HH___API
- #define __POINTSIFT__HH___API
- #include <string>
- #include "pointSIFT_API.h"
- #include "../error_code/error_code.h"
- #include <pcl/point_types.h>
- #include <pcl/common/common.h>
- //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<pcl::PointXYZ>::Ptr p_cloud_in,
- std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_vector,
- bool save_flag, std::string save_dir);
- protected:
- //使用体素网格, 抽稀点云, //将点云空间分为小方格,每个小方格只保留一个点.
- Error_manager filter_cloud_with_voxel_grid(pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud);
- //使用box限定点云范围,只保留box范围内部的点, 剔除外部的点云
- Error_manager filter_cloud_with_box(pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud);
- //通过输入点云,更新边界区域范围
- Error_manager update_region(pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud);
- //抽稀点云, //自己写的算法, 重新生成新的点云.
- Error_manager filter_cloud_with_my_grid(pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud);
- //从点云中选出固定数量的随机点, 默认8192个点
- //p_cloud_in::输入点云, 有内存,且size>0
- //p_cloud_out::输出点云, 需要提前分配内存. size==0
- Error_manager filter_cloud_with_select(pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud_in, pcl::PointCloud<pcl::PointXYZ>::Ptr p_cloud_out);
- //将点云数据转换到float*
- Error_manager translate_cloud_to_float(pcl::PointCloud<pcl::PointXYZ>::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<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_vector);
- //保存点云数据
- Error_manager save_cloud(std::vector<pcl::PointCloud<pcl::PointXYZRGB>::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
|