123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- @startuml
- title 摆扫测量模块类图
- class Task_Base
- {
- +~Task_Base();
- +virtual Error_manager init();//初始化任务单,初始任务单类型为 UNKONW_TASK
- +Error_manager update_statu(Task_statu task_statu,std::string statu_information="");//更新任务单
- +Task_type get_task_type();//获取任务类型
- +Task_statu get_statu();//获取任务单状态
- +std::string get_statu_information();//获取状态说明
- }
- class Locate_task
- {
- +Locate_task();
- +~Locate_task();
- //设置测量输入点云()
- +Error_manager set_locate_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
- //获取输入点云()
- +pcl::PointCloud<pcl::PointXYZ>::Ptr get_locate_cloud();
- //获取测量结果()
- +Locate_information get_locate_information();
- //设置测量结果()
- +Error_manager set_locate_information(Locate_information information);
- //获取文件存放路径()
- +std::string get_save_path();
- //设置文件村昂路径()
- +Error_manager set_save_path(std::string path);
- -pcl::PointCloud<pcl::PointXYZ>::Ptr m_locate_cloud_ptr;//测量算法输入点云
- -Locate_information m_locate_information;//测量结果存放结构体
- -std::string m_save_path;//测量中间文件存放路径
- }
- class Detector
- {
- std::shared_ptr<void> detector_gpu_ptr;//yolo测量网络指针
- std::deque<std::vector<bbox_t>> prev_bbox_vec_deque;
- const int cur_gpu_id;
- float nms = .4;
- bool wait_stream;
- + Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
- + ~Detector();
- + std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
- + std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
- + image_t load_image(std::string image_filename);
- + void free_image(image_t m);
- + int get_net_width() const;
- + int get_net_height() const;
- + int get_net_color_depth() const;
- + std::vector<bbox_t> tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history = true,
- int const frames_story = 5, int const max_dist = 40);
- + void *get_cuda_context();
- //+ bool send_json_http(std::vector<bbox_t> cur_bbox_vec, std::vector<std::string> obj_names, int frame_id,
- // std::string filename = std::string(), int timeout = 400000, int port = 8070);
- //重置图像大小,并识别()
- +std::vector<bbox_t> detect_resized(image_t img, int init_w, int init_h, float thresh = 0.2, bool use_mean = false);
-
- }
- class YoloDetector
- {
- +YoloDetector(std::string cfg,std::string weights,float minx,float maxx,float miny,float maxy,float freq);
- +//设置输入点云的边界,识别的时候根据边界投影到图像()
- +//输入边界的长款比必须是1:1,否则会出现图像扭曲()
- +//freq:表示多长一个像素点()
- +Error_manager set_region(float minx, float maxx, float miny, float maxy,float freq);
- +virtual ~YoloDetector();
- +//识别函数, 将点云数据转换成图像格式保存,该函数已经过期(第一版算法,点云由两个雷达扫描)
- +//l:左边雷达扫描数据; r:右边雷达扫描数据()
- +//save_dir:中间数据保存路径()
- +Error_manager detect(cv::Mat& l, cv::Mat& r, std::vector<YoloBox>& boxes,std::string save_dir);
- +//将点云投影成图像, 识别车辆外接矩形框()
- +Error_manager detect(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in, std::vector<YoloBox>& boxes, std::string save_dir);
- -//释放图像内存()
- -void free_img(image_t img);
- -//opencv图像类型转换成 image_t 格式,并调整大小()
- -std::shared_ptr<image_t> mat_to_image_resize(cv::Mat mat) const
- -static std::shared_ptr<image_t> mat_to_image(cv::Mat img_src)
- -static image_t ipl_to_image(IplImage* src)
- -static image_t make_empty_image(int w, int h, int c)
- -static image_t make_image_custom(int w, int h, int c)
- -Detector* m_pDetector;
- -float m_minx;
- -float m_maxx;
- -float m_miny;
- -float m_maxy;
- -float m_freq;
- }
- class PointSifter
- {
- +//初始化PointSift()
- +//point_num:pointsift输入点数()
- +//cls_num:PointSift输出类别数()
- +PointSifter(int point_num, int cls_num);
- +~PointSifter();
- +//加载网络参数()
- +//meta:tensorflow网络结构定义文件()
- +//cpkt:tensorflow网络权重()
- +bool Load(std::string meta, std::string cpkt);
- +//预测()
- +//data:输入数据,大小为 输入点数*3()
- +//output:输出数据,大小为 输入点数*类别数()
- +bool Predict(float* data, float* output);
- +//错误原因()
- +std::string LastError();
- -PointSifter();
- -std::mutex m_mutex;
- -std::string m_error;
- -bool m_bInit;
- -int m_point_num;
- -int m_cls_num;
- -void* m_sess;
- }
- note right of PointSifter
- sift识别类,导入类
- 负责pointsift网络的加载识别,
- 内部加锁,保证只有一个识别任务占有
- end note
- class Point_sift_segmentation
- {
- +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();
- -//将点云数据转换到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);
- -float m_freq;
- -pcl::PointXYZ m_minp;
- -pcl::PointXYZ m_maxp;
- }
- note bottom of Point_sift_segmentation
- * 封装PointSift点云分割网络,输入点云,分割出汽车,检验结果
- * 功能包括将pcl点云数据格式转换成原始数据格式float*
- * 将识别数据转换成点云数据并用不同颜色区分
- end note
- class LocateParameter
- {
- +获取各个配置参数()
- +序列化配置到文件()
- +从文件流读取配置()
- }
- note left of LocateParameter
- 测量算法参数配置类
- 格式protobuf,
- 详见locater_parameter.proto文件
- end note
- class Locater
- {
- +ocater();
- +Locater();
- +/初始化测量算法参数()
- +Error_manager init(Measure::LocateParameter parameter);
- +/获取测量模块状态(错误码);返回是否能执行任务,以及不能执行任务的原因()
- +Error_manager get_error();
- +//执行任务,()
- +//task:测量任务()
- +//time_out:超时时间,单位秒()
- +Error_manager execute_task(Task_Base* task,double time_out=5);
- -//测量算法函数()
- -//cloud_in:输入点云()
- -//locate_information:测量结果()
- -//work_dir:中间文件保存路径()
- -Error_manager locate(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
- -Locate_information& locate_information, std::string work_dir);
- -//yolo定位车辆外接矩形()
- -//cloud_in:输入点云,定位算法内部不会修改点云内容()
- -//boxes:定位到的外接box框()
- -//work_dir:中间文件输出路径()
- -Error_manager locate_yolo(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
- - std::vector<YoloBox>& boxes, std::string work_dir);
- -//根据yolo识别结果, 利用PointSift从场景中分割车辆点云()
- -//cloud:输入点云()
- -//boxes:yolo识别结果()
- -//cloud_target:车辆点云()
- -//work_dir:中间文件保存路径()
- -Error_manager locate_sift(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, std::vector<YoloBox> boxes,
- - pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_wheel,pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_car,
- - std::string work_dir);
- -//输入汽车点云,识别轮胎,并计算轴长,宽,中心,旋转角()
- -Error_manager locate_wheel(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,float& center_x,float& center_y,float& wheel_base,float& width,float& angle,std::string work_dir);
-
- -//根据汽车点云计算车高()
- -//cloud_car:车辆点云()
- -Error_manager measure_height(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_car,float& height);
-
- -// 保存点云成txt到文件()
- -static void save_cloud_txt(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,std::string save_file);
- -Measure::LocateParameter m_locate_parameter;
- -Point_sift_segmentation* mp_point_sift;
- -YoloDetector* mp_yolo_detector;
- -Cnn3d_segmentation* mp_cnn3d;
- -std::mutex m_mutex_lock;
- }
- Locate_task --|> Task_Base
- YoloDetector --> Detector
- Point_sift_segmentation --|> PointSifter
- Locater --> Point_sift_segmentation
- Locater --> YoloDetector
- Locater --> LocateParameter
- @enduml
|