#ifndef __3DCNN__LOCATER__HH_ #define __3DCNN__LOCATER__HH_ #include "opencv/highgui.h" #include "opencv2/opencv.hpp" #include #include #include #include "../error_code/error_code.h" /* * 3dcnn网络识别车两中轮胎点 */ class Cnn3d_segmentation { public: Cnn3d_segmentation(int l,int w,int h,int freq,int nClass); //设置3dcnn网络参数 Error_manager set_parameter(int l, int w, int h,int freq,int classes); virtual ~Cnn3d_segmentation(); //初始化网络参数 //weights:参数文件 virtual Error_manager init(std::string weights); //预测 //cloud:输入点云 //rect:输出旋转矩形框 //save_dir:中间文件保存路径 virtual Error_manager predict(pcl::PointCloud::Ptr cloud, float& center_x,float& center_y, float& wheel_base,float& width,float& angle, std::string save_dir); protected: //根据设置的参数将点云转换成网络输入数格式 float* generate_tensor(pcl::PointCloud::Ptr cloud, float min_x, float max_x, float min_y, float max_y, float min_z, float max_z); //将识别结果转换成点云 std::vector::Ptr> decodeCloud(pcl::PointCloud& cloud, float* data, float min_x, float max_x, float min_y, float max_y, float min_z, float max_z); protected: //判断矩形框是否找到 //points:输入轮子中心点, 只能是3或者4个 Error_manager isRect(std::vector& points); //kmeans算法聚类,拆分四个轮子,返回四轮中心 //cloud:输入点云 std::vector::Ptr> kmeans( pcl::PointCloud::Ptr cloud, std::string cluster_file_path); bool check_box(cv::RotatedRect& box, pcl::PointCloud::Ptr cloud); ///IIU判断 bool check_IOU(cv::RotatedRect& box, pcl::PointCloud::Ptr cloud); /* * 对点云作pca分析,然后在最小轴方向过滤, 防止轮胎左右两边出现噪声 * cloud_in:输入点云 * cloud_out:输出点云 */ Error_manager pca_minist_axis_filter(pcl::PointCloud::Ptr cloud_in, pcl::PointCloud::Ptr cloud_out); /* *计算两点距离 */ static double distance(cv::Point2f p1, cv::Point2f p2); protected: int m_lenth; int m_width; int m_height; int m_freq; int m_nClass; }; #endif