locate_uml.wsd 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. @startuml
  2. title 摆扫测量模块类图
  3. class Task_Base
  4. {
  5. +~Task_Base();
  6. +virtual Error_manager init();//初始化任务单,初始任务单类型为 UNKONW_TASK
  7. +Error_manager update_statu(Task_statu task_statu,std::string statu_information="");//更新任务单
  8. +Task_type get_task_type();//获取任务类型
  9. +Task_statu get_statu();//获取任务单状态
  10. +std::string get_statu_information();//获取状态说明
  11. }
  12. class Locate_task
  13. {
  14. +Locate_task();
  15. +~Locate_task();
  16. //设置测量输入点云()
  17. +Error_manager set_locate_cloud(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud);
  18. //获取输入点云()
  19. +pcl::PointCloud<pcl::PointXYZ>::Ptr get_locate_cloud();
  20. //获取测量结果()
  21. +Locate_information get_locate_information();
  22. //设置测量结果()
  23. +Error_manager set_locate_information(Locate_information information);
  24. //获取文件存放路径()
  25. +std::string get_save_path();
  26. //设置文件村昂路径()
  27. +Error_manager set_save_path(std::string path);
  28. -pcl::PointCloud<pcl::PointXYZ>::Ptr m_locate_cloud_ptr;//测量算法输入点云
  29. -Locate_information m_locate_information;//测量结果存放结构体
  30. -std::string m_save_path;//测量中间文件存放路径
  31. }
  32. class Detector
  33. {
  34. std::shared_ptr<void> detector_gpu_ptr;//yolo测量网络指针
  35. std::deque<std::vector<bbox_t>> prev_bbox_vec_deque;
  36. const int cur_gpu_id;
  37. float nms = .4;
  38. bool wait_stream;
  39. + Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
  40. + ~Detector();
  41. + std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
  42. + std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
  43. + image_t load_image(std::string image_filename);
  44. + void free_image(image_t m);
  45. + int get_net_width() const;
  46. + int get_net_height() const;
  47. + int get_net_color_depth() const;
  48. + std::vector<bbox_t> tracking_id(std::vector<bbox_t> cur_bbox_vec, bool const change_history = true,
  49. int const frames_story = 5, int const max_dist = 40);
  50. + void *get_cuda_context();
  51. //+ bool send_json_http(std::vector<bbox_t> cur_bbox_vec, std::vector<std::string> obj_names, int frame_id,
  52. // std::string filename = std::string(), int timeout = 400000, int port = 8070);
  53. //重置图像大小,并识别()
  54. +std::vector<bbox_t> detect_resized(image_t img, int init_w, int init_h, float thresh = 0.2, bool use_mean = false);
  55. }
  56. class YoloDetector
  57. {
  58. +YoloDetector(std::string cfg,std::string weights,float minx,float maxx,float miny,float maxy,float freq);
  59. +//设置输入点云的边界,识别的时候根据边界投影到图像()
  60. +//输入边界的长款比必须是1:1,否则会出现图像扭曲()
  61. +//freq:表示多长一个像素点()
  62. +Error_manager set_region(float minx, float maxx, float miny, float maxy,float freq);
  63. +virtual ~YoloDetector();
  64. +//识别函数, 将点云数据转换成图像格式保存,该函数已经过期(第一版算法,点云由两个雷达扫描)
  65. +//l:左边雷达扫描数据; r:右边雷达扫描数据()
  66. +//save_dir:中间数据保存路径()
  67. +Error_manager detect(cv::Mat& l, cv::Mat& r, std::vector<YoloBox>& boxes,std::string save_dir);
  68. +//将点云投影成图像, 识别车辆外接矩形框()
  69. +Error_manager detect(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in, std::vector<YoloBox>& boxes, std::string save_dir);
  70. -//释放图像内存()
  71. -void free_img(image_t img);
  72. -//opencv图像类型转换成 image_t 格式,并调整大小()
  73. -std::shared_ptr<image_t> mat_to_image_resize(cv::Mat mat) const
  74. -static std::shared_ptr<image_t> mat_to_image(cv::Mat img_src)
  75. -static image_t ipl_to_image(IplImage* src)
  76. -static image_t make_empty_image(int w, int h, int c)
  77. -static image_t make_image_custom(int w, int h, int c)
  78. -Detector* m_pDetector;
  79. -float m_minx;
  80. -float m_maxx;
  81. -float m_miny;
  82. -float m_maxy;
  83. -float m_freq;
  84. }
  85. class PointSifter
  86. {
  87. +//初始化PointSift()
  88. +//point_num:pointsift输入点数()
  89. +//cls_num:PointSift输出类别数()
  90. +PointSifter(int point_num, int cls_num);
  91. +~PointSifter();
  92. +//加载网络参数()
  93. +//meta:tensorflow网络结构定义文件()
  94. +//cpkt:tensorflow网络权重()
  95. +bool Load(std::string meta, std::string cpkt);
  96. +//预测()
  97. +//data:输入数据,大小为 输入点数*3()
  98. +//output:输出数据,大小为 输入点数*类别数()
  99. +bool Predict(float* data, float* output);
  100. +//错误原因()
  101. +std::string LastError();
  102. -PointSifter();
  103. -std::mutex m_mutex;
  104. -std::string m_error;
  105. -bool m_bInit;
  106. -int m_point_num;
  107. -int m_cls_num;
  108. -void* m_sess;
  109. }
  110. note right of PointSifter
  111. sift识别类,导入类
  112. 负责pointsift网络的加载识别,
  113. 内部加锁,保证只有一个识别任务占有
  114. end note
  115. class Point_sift_segmentation
  116. {
  117. +Point_sift_segmentation(int point_size,int cls,float freq,pcl::PointXYZ minp,pcl::PointXYZ maxp);
  118. +//设置要识别的点云区域()
  119. +Error_manager set_region(pcl::PointXYZ minp, pcl::PointXYZ maxp);
  120. +//初始化网络, 加载网络权重()
  121. +virtual Error_manager init(std::string graph,std::string cpkt);
  122. +//分割函数,输入点云,输出各类的点云,并保存中间文件方便查看识别结果()
  123. +//cloud:输入点云()
  124. +//clouds:输出分类好的多个点云(附带颜色,红色为杂物,绿色为车,白色为地面)
  125. +virtual Error_manager seg(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,
  126. + std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& clouds, std::string save_dir);
  127. +virtual ~Point_sift_segmentation();
  128. -//将点云数据转换到float*()
  129. -//cloud:输入点云()
  130. -//output:转换结果保存地址,函数内不负责内存的分配与释放()
  131. -bool Create_data(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, float* output);
  132. -//将float*转换成点云()
  133. -//output:点云对应的类别,大小为 点数*类别()
  134. -//cloud:点云数据(xyz)()
  135. -//cloud_seg::输入带颜色的点云()
  136. -bool RecoveryCloud(float* output, float* cloud, std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_seg);
  137. -bool FilterObs(std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr>& cloud_seg, std::string save_dir);
  138. -float m_freq;
  139. -pcl::PointXYZ m_minp;
  140. -pcl::PointXYZ m_maxp;
  141. }
  142. note bottom of Point_sift_segmentation
  143. * 封装PointSift点云分割网络,输入点云,分割出汽车,检验结果
  144. * 功能包括将pcl点云数据格式转换成原始数据格式float*
  145. * 将识别数据转换成点云数据并用不同颜色区分
  146. end note
  147. class LocateParameter
  148. {
  149. +获取各个配置参数()
  150. +序列化配置到文件()
  151. +从文件流读取配置()
  152. }
  153. note left of LocateParameter
  154. 测量算法参数配置类
  155. 格式protobuf,
  156. 详见locater_parameter.proto文件
  157. end note
  158. class Locater
  159. {
  160. +ocater();
  161. +Locater();
  162. +/初始化测量算法参数()
  163. +Error_manager init(Measure::LocateParameter parameter);
  164. +/获取测量模块状态(错误码);返回是否能执行任务,以及不能执行任务的原因()
  165. +Error_manager get_error();
  166. +//执行任务,()
  167. +//task:测量任务()
  168. +//time_out:超时时间,单位秒()
  169. +Error_manager execute_task(Task_Base* task,double time_out=5);
  170. -//测量算法函数()
  171. -//cloud_in:输入点云()
  172. -//locate_information:测量结果()
  173. -//work_dir:中间文件保存路径()
  174. -Error_manager locate(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
  175. -Locate_information& locate_information, std::string work_dir);
  176. -//yolo定位车辆外接矩形()
  177. -//cloud_in:输入点云,定位算法内部不会修改点云内容()
  178. -//boxes:定位到的外接box框()
  179. -//work_dir:中间文件输出路径()
  180. -Error_manager locate_yolo(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in,
  181. - std::vector<YoloBox>& boxes, std::string work_dir);
  182. -//根据yolo识别结果, 利用PointSift从场景中分割车辆点云()
  183. -//cloud:输入点云()
  184. -//boxes:yolo识别结果()
  185. -//cloud_target:车辆点云()
  186. -//work_dir:中间文件保存路径()
  187. -Error_manager locate_sift(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, std::vector<YoloBox> boxes,
  188. - pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_wheel,pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud_car,
  189. - std::string work_dir);
  190. -//输入汽车点云,识别轮胎,并计算轴长,宽,中心,旋转角()
  191. -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);
  192. -//根据汽车点云计算车高()
  193. -//cloud_car:车辆点云()
  194. -Error_manager measure_height(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_car,float& height);
  195. -// 保存点云成txt到文件()
  196. -static void save_cloud_txt(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,std::string save_file);
  197. -Measure::LocateParameter m_locate_parameter;
  198. -Point_sift_segmentation* mp_point_sift;
  199. -YoloDetector* mp_yolo_detector;
  200. -Cnn3d_segmentation* mp_cnn3d;
  201. -std::mutex m_mutex_lock;
  202. }
  203. Locate_task --|> Task_Base
  204. YoloDetector --> Detector
  205. Point_sift_segmentation --|> PointSifter
  206. Locater --> Point_sift_segmentation
  207. Locater --> YoloDetector
  208. Locater --> LocateParameter
  209. @enduml