27 #include <opencv2/opencv.hpp> 32 #include "modules/perception/lidar/lib/detector/ncut_segmentation/proto/ncut_config.pb.h" 33 #include "modules/perception/lidar/lib/detector/ncut_segmentation/proto/ncut_param.pb.h" 36 namespace perception {
43 bool Init(
const NCutParam& param);
45 int NumSegments()
const {
return static_cast<int>(_segment_pids.size()); }
49 float* height)
const {
50 NcutBoundingBox box = _segment_bbox[sid];
51 *length = std::get<1>(box) - std::get<0>(box);
52 *width = std::get<3>(box) - std::get<2>(box);
53 *height = std::get<5>(box) - std::get<4>(box);
65 bool only_check_pedestrian);
68 float* width,
float* height);
77 typedef std::tuple<float, float, float, float, float, float> NcutBoundingBox;
81 float _super_pixel_cell_size;
82 std::unique_ptr<LRClassifier> _classifier;
84 double _felzenszwalb_sigma;
85 double _felzenszwalb_k;
86 int _felzenszwalb_min_size;
88 double _sigma_feature;
90 double _connect_radius;
92 float _ncuts_stop_threshold;
93 double _ncuts_enable_classifier_threshold;
95 std::vector<std::vector<int>> _cluster_points;
97 std::vector<NcutBoundingBox> _cluster_bounding_box;
98 std::vector<std::string> _cluster_labels;
100 float _skeleton_cell_size;
102 cv::Mat _cv_feature_map;
104 std::vector<Eigen::MatrixXf> _cluster_skeleton_points;
105 std::vector<Eigen::MatrixXf> _cluster_skeleton_features;
107 double _overlap_factor;
109 std::vector<std::vector<int>> _segment_pids;
110 std::vector<std::string> _segment_labels;
111 std::vector<NcutBoundingBox> _segment_bbox;
112 std::vector<std::vector<int>> _outlier_pids;
114 void SampleByGrid(
const std::vector<int>& point_gids,
115 Eigen::MatrixXf* skeleton_coords,
116 Eigen::MatrixXf* skeleton_feature);
118 void PrecomputeAllSkeletonAndBbox();
120 bool Configure(
const NCutParam& ncut_param_);
124 std::vector<std::vector<int>>* super_pixels);
128 const FloodFill& ff_map, cv::Mat* cv_height_map,
129 std::vector<gridIndex>* point_pixel_indices);
132 void GetPatchFeature(
const Eigen::MatrixXf& points,
133 Eigen::MatrixXf* features);
136 NcutBoundingBox ComputeClusterBoundingBox(
const std::vector<int>& point_gids);
140 void NormalizedCut(
float ncuts_threshold,
bool use_classifier,
141 std::vector<std::vector<int>>* segment_clusters,
142 std::vector<std::string>* segment_labels);
144 void ComputeSkeletonWeights(Eigen::MatrixXf* weights);
146 float GetMinNcuts(
const Eigen::MatrixXf& in_weights,
147 const std::vector<int>* in_clusters, std::vector<int>* seg1,
148 std::vector<int>* seg2);
150 void LaplacianDecomposition(
const Eigen::MatrixXf& weights,
151 Eigen::MatrixXf* eigenvectors);
153 bool ComputeSquaredSkeletonDistance(
const Eigen::MatrixXf& in1_points,
154 const Eigen::MatrixXf& in1_features,
155 const Eigen::MatrixXf& in2_points,
156 const Eigen::MatrixXf& in2_features,
157 float* dist_point,
float* dist_feature);
159 bool IsMovableObstacle(
const std::vector<int>& cluster_ids,
162 inline bool IsPotentialPedestrianSize(
float length,
float width) {
163 return ((length > 0.5 && length < 1.5) && (width > 0.3 && width < 1));
166 inline bool IsPotentialBicyclistSize(
float length,
float width) {
167 return ((length > 1 && length < 2.5) && (width > 0.3 && width < 1.5));
170 inline bool IsPotentialCarSize(
float length,
float width) {
173 return ((length > 1.0 && length < 8.0) && (width > 1.0 && width < 3.5));
176 int GetComponentBoundingBox(
const std::vector<int>& cluster_ids,
177 NcutBoundingBox* box);
179 inline float GetBboxLength(
const NcutBoundingBox& box) {
180 return (std::get<1>(box) - std::get<0>(box));
183 inline float GetBboxWidth(
const NcutBoundingBox& box) {
184 return (std::get<3>(box) - std::get<2>(box));
187 inline float GetBboxHeight(
const NcutBoundingBox& box) {
188 return (std::get<5>(box) - std::get<4>(box));
191 std::string GetClustersLabel(
const std::vector<int>& cluster_ids);
193 void GetClustersPids(
const std::vector<int>& cids, std::vector<int>* pids);
int NumSegments() const
Definition: ncut.h:45
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
std::string GetSegmentLabel(int sid) const
Definition: ncut.h:46
Definition: point_cloud.h:264
std::shared_ptr< const PointFCloud > PointFCloudConstPtr
Definition: point_cloud.h:483
void Segment(base::PointFCloudConstPtr cloud)
void GetSegmentRoughSize(const base::PointFCloudPtr &cloud, float *length, float *width, float *height)
std::string GetPcRoughLabel(const base::PointFCloudPtr &cloud, bool only_check_pedestrian)
std::shared_ptr< PointFCloud > PointFCloudPtr
Definition: point_cloud.h:482
bool Init(const NCutParam ¶m)
base::PointFCloudPtr GetSegmentPointCloud(int sid) const
Definition: ncut.h:56
void GetSegmentSize(int sid, float *length, float *width, float *height) const
Definition: ncut.h:48
Definition: flood_fill.h:28