#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>

/*
 * 封装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);
    //设置要识别的点云区域
    Error_manager set_region(pcl::PointXYZ minp, pcl::PointXYZ maxp);
    //初始化网络, 加载网络权重
	virtual Error_manager init(std::string graph,std::string cpkt);
	//分割函数,输入点云,输出各类的点云,并保存中间文件方便查看识别结果.
	//cloud:输入点云
	//clouds:输出分类好的多个点云(附带颜色,红色为杂物,绿色为车,白色为地面)
	virtual Error_manager seg(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
	    std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& clouds, std::string save_dir);

	virtual ~Point_sift_segmentation();
protected:
    //将点云数据转换到float*
    //cloud:输入点云
    //output:转换结果保存地址,函数内不负责内存的分配与释放
	bool	Create_data(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, float* output);
    //将float*转换成点云
    //output:点云对应的类别,大小为  点数*类别
    //cloud:点云数据(xyz)
    //cloud_seg::输入带颜色的点云
	bool    RecoveryCloud(float* output, float* cloud, std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_seg);

	bool	FilterObs(std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_seg, std::string save_dir);
protected:
	float		        m_freq;
    pcl::PointXYZ		m_minp;
    pcl::PointXYZ		m_maxp;

};
#endif

