61 std::cerr <<
"Invalid ground detector parameters... " << std::endl;
68 unsigned int max_nr_samples) {
69 assert(min_nr_samples < max_nr_samples);
70 unsigned int size =
static_cast<unsigned int>(
indices.size());
71 unsigned int half = 0;
72 if (size > max_nr_samples) {
84 if (size > min_nr_samples) {
86 while (half > min_nr_samples) {
95 return static_cast<int>(
indices.size());
124 std::pair<int, int> *order) {
125 std::vector<std::pair<float, int>> map_dist;
132 for (i = 0; i < vg->
NrVoxel(); ++i) {
134 radius = voxel.dim_x_ * 0.5f;
135 cx = voxel.v_[0] + radius;
136 cy = voxel.v_[1] + radius;
137 dist2 = cx * cx + cy * cy;
138 map_dist.push_back(std::pair<float, int>(dist2, i));
140 sort(map_dist.begin(), map_dist.end(),
141 [](
const std::pair<float, int> &a,
const std::pair<float, int> &b) {
142 return a.first < b.first;
144 for (i = 0; i < map_dist.size(); ++i) {
145 id = map_dist[i].second;
147 order[i].first = voxel.iy_;
148 order[i].second = voxel.ix_;
157 unsigned int index = 0;
158 unsigned int capacity = 0;
243 memset(
reinterpret_cast<void *
>(
labels_), 0,
313 if (c > 0 && r > 0) {
320 inliers_ = IAllocAligned<int>(lap_size, 4);
322 a_array_.resize(lap_size * 2, lap_size);
325 for (
unsigned int i = 0; i < lap_size; ++i) {
345 IFree2<std::pair<float, bool>>(&
ground_z_);
357 const std::vector<int> &indices,
358 const float *z_values,
360 unsigned int nr_points,
361 unsigned int nr_point_element,
362 unsigned int nr_compares) {
366 unsigned int nr_contradi = 0;
367 unsigned int nr_z_comp_fail_threshold =
369 const float *ptr =
nullptr;
371 float delta_z = 0.0f;
372 std::vector<int>::const_iterator iter = indices.cbegin();
373 while (iter < indices.cend()) {
376 assert(pos <
static_cast<int>(nr_points));
379 ptr = point_cloud + (pos * nr_point_element);
389 if (nr_compares > nr_z_comp_fail_threshold) {
390 for (i = 0; i < nr_compares; ++i) {
391 delta_z =
IAbs(z_values[i] - z);
394 if (nr_contradi > nr_z_comp_fail_threshold) {
400 if (nr_contradi <= nr_z_comp_fail_threshold) {
416 float min_dist = 0.0f;
417 float max_dist = 0.0f;
422 dr =
static_cast<float>(r) - grid_rad;
425 dc =
static_cast<float>(c) - grid_rad;
446 k = k / (max_dist - min_dist);
449 b = (b - k * (min_dist + max_dist)) / 2;
460 const float *point_cloud,
float *height_above_ground,
461 unsigned int nr_points,
unsigned int nr_point_elements) {
464 for (r = 0; r < nr_points; ++r) {
465 height_above_ground[r] = std::numeric_limits<float>::max();
469 height_above_ground, 0, nr_points, nr_point_elements);
470 for (r = 1; r < nm1; ++r) {
473 height_above_ground, r, nr_points,
478 height_above_ground, nm1, nr_points,
485 float *height_above_ground,
unsigned int r,
unsigned int nr_points,
486 unsigned int nr_point_elements) {
492 const float *cptr =
nullptr;
493 float dist[] = {0, 0, 0, 0, 0};
494 const float *plane[] = {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr};
495 float min_abs_dist = 0.0f;
502 std::vector<int>::const_iterator iter = (*vg_coarse_)(r, 0).indices_.cbegin();
503 while (iter < (*
vg_coarse_)(r, 0).indices_.cend()) {
505 assert(pos <
static_cast<int>(nr_points));
507 cptr = point_cloud + (nr_point_elements * pos);
508 dist[0] = plane[0] !=
nullptr
510 : std::numeric_limits<float>::max();
511 min_abs_dist =
IAbs(dist[0]);
515 dist[1] = plane[1] !=
nullptr
517 : std::numeric_limits<float>::max();
518 dist[2] = plane[2] !=
nullptr
520 : std::numeric_limits<float>::max();
521 dist[3] = plane[3] !=
nullptr
523 : std::numeric_limits<float>::max();
524 for (i = 1; i < 4; ++i) {
525 if (min_abs_dist >
IAbs(dist[i])) {
526 min_abs_dist =
IAbs(dist[i]);
531 height_above_ground[pos] = dist[id];
535 for (c = 1; c < nm1; ++c) {
541 iter = (*vg_coarse_)(r, c).indices_.cbegin();
542 while (iter < (*
vg_coarse_)(r, c).indices_.cend()) {
544 assert(pos <
static_cast<int>(nr_points));
546 cptr = point_cloud + (nr_point_elements * pos);
547 dist[0] = plane[0] !=
nullptr
549 : std::numeric_limits<float>::max();
550 min_abs_dist =
IAbs(dist[0]);
553 dist[1] = plane[1] !=
nullptr
555 : std::numeric_limits<float>::max();
556 dist[2] = plane[2] !=
nullptr
558 : std::numeric_limits<float>::max();
559 dist[3] = plane[3] !=
nullptr
561 : std::numeric_limits<float>::max();
562 dist[4] = plane[4] !=
nullptr
564 : std::numeric_limits<float>::max();
565 for (i = 1; i < 5; ++i) {
566 if (min_abs_dist >
IAbs(dist[i])) {
567 min_abs_dist =
IAbs(dist[i]);
572 height_above_ground[pos] = dist[id];
577 plane[1] = cn[nm1 - 1].
IsValid() ? cn[nm1 - 1].
params :
nullptr;
580 iter = (*vg_coarse_)(r, nm1).indices_.cbegin();
581 while (iter < (*
vg_coarse_)(r, nm1).indices_.cend()) {
583 assert(pos <
static_cast<int>(nr_points));
585 cptr = point_cloud + (nr_point_elements * pos);
586 dist[0] = plane[0] !=
nullptr
588 : std::numeric_limits<float>::max();
589 min_abs_dist =
IAbs(dist[0]);
593 dist[1] = plane[1] !=
nullptr
595 : std::numeric_limits<float>::max();
596 dist[2] = plane[2] !=
nullptr
598 : std::numeric_limits<float>::max();
599 dist[3] = plane[3] !=
nullptr
601 : std::numeric_limits<float>::max();
602 for (i = 1; i < 4; ++i) {
603 if (min_abs_dist >
IAbs(dist[i])) {
604 min_abs_dist =
IAbs(dist[i]);
609 height_above_ground[pos] = dist[id];
615 const float *point_cloud,
617 unsigned int nr_points,
618 unsigned int nr_point_element) {
631 for (i = 0; i < vx.
NrPoints(); ++i) {
632 pos = vx.
indices_[i] * nr_point_element;
638 static_cast<int>(vx.
NrPoints()), &rseed);
640 for (i = 0; i < nr_samples; ++i) {
648 nr_points, nr_point_element, nr_samples);
664 nr_points, nr_point_element);
673 memset(
reinterpret_cast<void *
>(
labels_), 0,
689 unsigned int nr_points,
690 unsigned int nr_point_element,
699 float ptp_dist = 0.0f;
700 float fit_cost = 0.0f;
701 float fit_cost_best = dist_thre;
703 int nr_inliers_best = -1;
707 int indices_trial[] = {0, 0, 0};
710 int nr_inliers_termi =
IRound(
static_cast<float>(nr_samples) *
715 float *psrc =
nullptr;
717 for (i = 0; i < nr_samples; ++i) {
718 assert((*candi)[i] <
static_cast<int>(nr_points));
719 ICopy3(point_cloud + (nr_point_element * (*candi)[i]), pdst);
725 IScale3(indices_trial, dim_point_);
739 for (j = 0; j < nr_samples; ++j) {
741 if (ptp_dist < dist_thre) {
743 fit_cost += ptp_dist;
750 fit_cost = nr_inliers > 0 ? (fit_cost /
static_cast<float>(nr_inliers))
753 if (nr_inliers >= nr_inliers_best) {
754 if (nr_inliers == nr_inliers_best) {
755 if (fit_cost < fit_cost_best) {
756 nr_inliers_best = nr_inliers;
757 fit_cost_best = fit_cost;
758 *groundplane = plane;
761 nr_inliers_best = nr_inliers;
762 fit_cost_best = fit_cost;
763 *groundplane = plane;
766 if (nr_inliers_best > nr_inliers_termi) {
785 for (i = 0; i < nr_samples; ++i) {
787 if (ptp_dist < dist_thre) {
838 std::vector<std::pair<int, int>> *neighbors,
839 unsigned int nr_point_element) {
846 std::vector<int> filtered_indices;
847 filtered_indices.reserve(candi->
Size());
848 for (i = 0; i < neighbors->size(); ++i) {
849 r_n = (*neighbors)[i].first;
850 c_n = (*neighbors)[i].second;
857 avg_z /=
static_cast<float>(count);
860 for (i = 0; i < candi->
Size(); ++i) {
861 z = (point_cloud + (nr_point_element * (*candi)[i]))[2];
864 filtered_indices.push_back((*candi)[i]);
869 if (filtered_indices.size() != candi->
Size()) {
870 candi->
indices.assign(filtered_indices.begin(), filtered_indices.end());
880 return IAcos(numerator *
IRec(denominator));
885 unsigned int nr_points,
unsigned int nr_point_element,
float dist_thre) {
891 std::vector<std::pair<int, int>> neighbors;
909 float ptp_dist = 0.0f;
912 int nr_inliers_best = -1;
913 float angle_best = std::numeric_limits<float>::max();
916 int indices_trial[] = {0, 0, 0};
919 int nr_inliers_termi =
IRound(
static_cast<float>(nr_samples) *
924 float *psrc =
nullptr;
929 for (
int i = 0; i < nr_samples; ++i) {
930 assert(candi[i] <
static_cast<int>(nr_points));
931 ICopy3(point_cloud + (nr_point_element * candi[i]), pdst);
937 IScale3(indices_trial, dim_point_);
950 for (
int j = 0; j < nr_samples; ++j) {
952 if (ptp_dist < dist_thre) {
961 if (nr_inliers > nr_inliers_termi) {
966 for (
size_t i = 0; i < neighbors.size(); ++i) {
967 r_n = neighbors[i].first;
968 c_n = neighbors[i].second;
974 for (
int j = 0; j < nr_samples; ++j) {
977 if (ptp_dist < dist_thre) {
991 nr_inliers_best = -1;
992 for (
int i = 0; i < kNr_iter; ++i) {
993 if (!(hypothesis[i].IsValid())) {
997 if (nr_inliers >= nr_inliers_best) {
998 if (nr_inliers == nr_inliers_best) {
1000 if (angle < angle_best && angle > 0) {
1005 nr_inliers_best = nr_inliers;
1012 *groundplane = hypothesis[best];
1015 if (!groundplane->
IsValid()) {
1030 for (
int i = 0; i < nr_samples; ++i) {
1032 if (ptp_dist < dist_thre) {
1044 *groundplane = hypothesis[best];
1054 const auto &voxel_cur = (*vg_coarse_)(r, c);
1055 float radius = voxel_cur.dim_x_ * 0.5f;
1056 float cx = voxel_cur.v_[0] + radius;
1057 float cy = voxel_cur.v_[1] + radius;
1058 float cz = -(groundplane->
params[0] * cx + groundplane->
params[1] * cy +
1059 groundplane->
params[3]) /
1069 const std::vector<std::pair<int, int>> &neighbors) {
1070 float angle_dist = 0.0f;
1075 for (j = 0; j < neighbors.size(); ++j) {
1076 r_n = neighbors[j].first;
1077 c_n = neighbors[j].second;
1086 return angle_dist /
static_cast<float>(count);
1102 std::stringstream sstr;
1103 sstr <<
"[GroundFitInfo] " << std::to_string(
frame_timestamp_) << std::endl;
1110 sstr <<
"[FitInOrder] row = " << r <<
" col = " << c
1112 << (*vg_coarse_)(r, c).v_[0] + (*
vg_coarse_)(r, c).dim_x_ * 0.5f
1116 <<
" [AfterFilterCandidates] count = " <<
local_candis_[r][c].Size();
1118 float max_z = -5.0, min_z = 5.0;
1133 sstr <<
" sample_point_cooridinate = (" << x <<
", " << y
1134 <<
", " << z <<
")";
1137 sstr <<
" min_z = " << min_z <<
" max_z= " << max_z;
1154 <<
" [AfterGridPlaneFit] ground_z_valid = " <<
ground_z_[r][c].second
1155 <<
" ground_z_value = " <<
ground_z_[r][c].first
1157 <<
" plane_invalid_status = "
1168 AINFO << sstr.str();
1170 <<
" ground_count is " << count;
1177 int r,
int c,
int rows,
int cols,
1178 std::vector<std::pair<int, int>> *neighbors) {
1179 int left =
IMax(0, c - 1);
1180 int right =
IMin(cols - 1, c + 1);
1181 int up =
IMax(0, r - 1);
1182 int down =
IMin(rows - 1, r + 1);
1185 neighbors->reserve(8);
1186 for (x = left; x <= right; ++x) {
1187 for (y = up; y <= down; ++y) {
1188 if (x == c && y == r) {
1191 neighbors->push_back(std::pair<int, int>(y, x));
1219 for (c = 1; c < nm1; ++c) {
1256 int supports[] = {0, 0, 0, 0};
1257 float weights[] = {0.f, 0.f, 0.f, 0.f};
1263 int support_sum = 0;
1264 support_sum =
ISum4(supports);
1269 static_cast<float>(supports[0]) /
static_cast<float>(support_sum);
1271 static_cast<float>(supports[1]) /
static_cast<float>(support_sum);
1273 static_cast<float>(supports[2]) /
static_cast<float>(support_sum);
1275 static_cast<float>(supports[3]) /
static_cast<float>(support_sum);
1278 weights[2] * up.
theta + weights[3] * dn.
theta;
1279 gp->
phi = weights[0] * lt.
phi + weights[1] * rt.
phi + weights[2] * up.
phi +
1280 weights[3] * dn.
phi;
1281 gp->
d = weights[0] * lt.
d + weights[1] * rt.
d + weights[2] * up.
d +
1284 support_sum =
IMax(((support_sum + 2) >> 2), 1);
1295 int supports[] = {0, 0, 0, 0, 0};
1296 float weights[] = {0.f, 0.f, 0.f, 0.f, 0.f};
1318 int support_sum = 0;
1319 support_sum =
ISum4(supports);
1320 if (support_sum == 0) {
1324 support_sum += supports[4];
1326 static_cast<float>(supports[0]) /
static_cast<float>(support_sum);
1328 static_cast<float>(supports[1]) /
static_cast<float>(support_sum);
1330 static_cast<float>(supports[2]) /
static_cast<float>(support_sum);
1332 static_cast<float>(supports[3]) /
static_cast<float>(support_sum);
1334 static_cast<float>(supports[4]) /
static_cast<float>(support_sum);
1337 weights[2] * up.
theta + weights[3] * dn.
theta +
1338 weights[4] * g.
theta;
1339 gp->
phi = weights[0] * lt.
phi + weights[1] * rt.
phi + weights[2] * up.
phi +
1340 weights[3] * dn.
phi + weights[4] * g.
phi;
1341 gp->
d = weights[0] * lt.
d + weights[1] * rt.
d + weights[2] * up.
d +
1342 weights[3] * dn.
d + weights[4] * g.
d;
1344 support_sum =
IMax(((support_sum + 2) >> 3), 1);
1356 for (r = 1; r < nm1; ++r) {
1370 unsigned int offset = 0;
1371 for (
unsigned int i = 0; i < lap_size; ++i) {
1375 for (
unsigned int i = 0; i < lap_size; ++i) {
1379 for (
unsigned int i = 0; i < lap_size; ++i) {
1398 for (
unsigned int i = 0; i < lap_size; ++i) {
1406 Eigen::SparseMatrix<float> in;
1407 Eigen::SparseMatrix<float> out;
1408 memset((
void*)
weight_buffer_[0], 0, 2 * lap_size *
sizeof(
float));
1410 for (i = 0; i < lap_size; ++i) {
1412 std::exp((
inliers_[i] - 8) / 20) : 0.1;
1415 for (i = 0; i < lap_size; ++i) {
1421 for (i = 0; i < lap_size; ++i) {
1425 a_array_.coeffRef(i + lap_size, i) = 0.0;
1436 for (i = 0; i < lap_size; ++i) {
1438 b_array_.coeffRef(i + lap_size, 0) =
1440 b_array_.coeffRef(i + lap_size, 1) =
1442 b_array_.coeffRef(i + lap_size, 2) =
1445 b_array_.coeffRef(i + lap_size, 0) = 0.0;
1446 b_array_.coeffRef(i + lap_size, 1) = 0.0;
1447 b_array_.coeffRef(i + lap_size, 2) = 0.0;
1452 for (i = 0; i < lap_size; ++i) {
1465 float dist_thre = 0.0;
1466 float ptp_dist = 0.0;
1487 for (i = 0; i < nr_samples; ++i) {
1488 assert(candi[i] < (
int)nr_points);
1489 ICopy3(point_cloud + (nr_point_element * candi[i]), psrc);
1491 if (ptp_dist < dist_thre) {
1501 if (angle > threshold_rad) {
1514 unsigned int offset = 0;
1525 for (
unsigned int i = 0; i < lap_size; ++i) {
1529 for (
unsigned int i = 0; i < lap_size; ++i) {
1533 for (
unsigned int i = 0; i < lap_size; ++i) {
1556 int last_col =
IMax(0, col - 1);
1557 int next_col =
IMin(cols - 1, col + 1);
1558 int last_row =
IMax(0, row - 1);
1559 int next_row =
IMin(rows - 1, row + 1);
1591 parsing_ground_z - buffer);
1593 parsing_ground_z + buffer);
1600 float *height_above_ground,
1601 unsigned int nr_points,
1602 unsigned int nr_point_elements) {
1603 assert(point_cloud !=
nullptr);
1604 assert(height_above_ground !=
nullptr);
1606 assert(nr_point_elements >= 3);
1608 if (!
vg_fine_->
SetS(point_cloud, nr_points, nr_point_elements)) {
1612 if (!
vg_coarse_->
SetS(point_cloud, nr_points, nr_point_elements)) {
1681 float voxel_width_x_rec =
IRec(voxel_width_x);
1682 float voxel_width_y_rec =
IRec(voxel_width_y);
1684 *col =
IMin(grid_size - 1,
static_cast<int>(
1686 *row =
IMin(grid_size - 1,
static_cast<int>(
1710 return std::numeric_limits<float>::max();
1747 float ny_over_nz =
ITan(src.
phi);
1748 float nz =
ISqrt((1 - nx * nx) / (1 + ny_over_nz * ny_over_nz));
1749 float ny = nz * ny_over_nz;
PlaneFitGroundDetectorParam & param_
unsigned int GetGridDimX() const
int FitGrid(const float *point_cloud, PlaneFitPointCandIndices *candi, GroundPlaneLiDAR *groundplane, unsigned int nr_points, unsigned int nr_point_element, float dist_thre)
void SetGroundPlaneSpherParams(float *params)
Eigen::SparseMatrix< float > b_array_
unsigned int GetGridDimY() const
int SmoothLine(unsigned int up, unsigned int r, unsigned int dn)
float CalculateAngleDist(const GroundPlaneLiDAR &plane, const std::vector< std::pair< int, int > > &neighbors)
float * sampled_z_values_
const GroundPlaneLiDAR * GetGroundPlane(int r, int c) const
void GetInliers(int *inliers)
GroundPlaneLiDAR ** ground_planes_
~PlaneFitGroundDetector()
PlaneFitGroundDetector(PlaneFitGroundDetectorParam ¶m)
void UpdateParams(float parsing_ground_z, float buffer, double timestamp)
int FitLine(unsigned int r)
VoxelGridXY< float > * vg_fine_
unsigned int * map_fine_to_coarse_
bool Detect(const float *point_cloud, float *height_above_ground, unsigned int nr_points, unsigned int nr_point_elements)
void ComputeAdaptiveThreshold()
int CompleteGrid(const GroundPlaneSpherical <, const GroundPlaneSpherical &rt, const GroundPlaneSpherical &up, const GroundPlaneSpherical &dn, GroundPlaneSpherical *gp)
void ResetParams(float ori_z_lower, float ori_z_upper)
int FilterGrid(const Voxel< float > &vg, const float *point_cloud, PlaneFitPointCandIndices *candi, unsigned int nr_points, unsigned int nr_point_element)
void InitOrderTable(const VoxelGridXY< float > *vg, std::pair< int, int > *order)
Eigen::SimplicialLDLT< Eigen::SparseMatrix< float > > solver_
void ComputeSignedGroundHeight(const float *point_cloud, float *height_above_ground, unsigned int nr_points, unsigned int nr_point_elements)
int FitGridWithNeighbors(int r, int c, const float *point_cloud, GroundPlaneLiDAR *groundplane, unsigned int nr_points, unsigned int nr_point_element, float dist_thre)
std::vector< std::vector< unsigned int > > neighbors_
void GetNeighbors(int r, int c, int rows, int cols, std::vector< std::pair< int, int > > *neighbors)
std::pair< float, bool > ** ground_z_
const VoxelGridXY< float > * GetGrid() const
VoxelGridXY< float > * vg_coarse_
Eigen::SparseMatrix< float > a_array_
const char * GetLabel() const
int SmoothGrid(const GroundPlaneSpherical &g, const GroundPlaneSpherical <, const GroundPlaneSpherical &rt, const GroundPlaneSpherical &up, const GroundPlaneSpherical &dn, GroundPlaneSpherical *gp)
void GetGroundPlaneSpherParams(float *params)
PlaneFitPointCandIndices ** local_candis_
int FilterLine(unsigned int r)
GroundPlaneSpherical ** ground_planes_sphe_
int FilterCandidates(int r, int c, const float *point_cloud, PlaneFitPointCandIndices *candi, std::vector< std::pair< int, int > > *neighbors, unsigned int nr_point_element)
void ComputeSignedGroundHeightLine(const float *point_cloud, const GroundPlaneLiDAR *up, const GroundPlaneLiDAR *cn, const GroundPlaneLiDAR *dn, float *height_above_ground, unsigned int r, unsigned int nr_points, unsigned int nr_point_elements)
int CompareZ(const float *point_cloud, const std::vector< int > &point_indices, const float *z_values, PlaneFitPointCandIndices *candi, unsigned int nr_points, unsigned int nr_point_element, unsigned int nr_compares)
std::pair< int, int > * order_table_
void Pc2Voxel(float x, float y, float z, int *row, int *col)
PlaneFitPointCandIndices ** GetCandis() const
unsigned int NrVoxelX() const
unsigned int NrPoints() const
unsigned int NrVoxel() const
unsigned int NrPointElement() const
unsigned int NrVoxelY() const
bool SetS(const float *data, unsigned int nr_points, unsigned int nr_point_element)
const std::vector< Voxel< T > > & GetConstVoxels() const
const T * const_data() const
bool Alloc(unsigned int nr_voxel_x, unsigned int nr_voxel_y, T spatial_bound_x_min, T spatial_bound_x_max, T spatial_bound_y_min, T spatial_bound_y_max, T spatial_bound_z_min, T spatial_bound_z_max)
unsigned int NrPoints() const
std::vector< int > indices_
void IPlaneFitDestroyed(T *Xs, T *pi)
void IRandomizedShuffle1(T *A, int n, int *s)
void ICopy3(const T src[3], T dst[3])
void IPlaneEucliToSpher(const GroundPlaneLiDAR &src, GroundPlaneSpherical *dst)
double IL2Norm(const unsigned char *x, int n)
void IMinMaxElements(const T *a, int n, T *min_val, T *max_val)
float calculate_two_angles(const GroundPlaneLiDAR &p1, const GroundPlaneLiDAR &p2)
T IPlaneToPointDistanceWUnitNorm(const T *pi, const T *p)
float IDiv(float a, float b)
T IPlaneToPointSignedDistanceWUnitNorm(const T *pi, const T *p)
void IPlaneFitTotalLeastSquare(T *X, T *pi, int n)
float IAtan2(float y, float x)
void IScale3(T x[3], T sf)
void IPlaneSpherToEucli(const GroundPlaneSpherical &src, GroundPlaneLiDAR *dst)
void IRandomSample(int *sample, int n, int pool_size, int *s)
T IDot3(const T x[3], const T y[3])
void SetInvalidStatus(int flag)
void SetStatus(bool flag)
void SetOrigin(int origin)
int GetInvalidStatus() const
float GetDegreeNormalToZ() const
void ForcePositiveNormalZ()
void SetNrSupport(int nr)
void SetStatus(bool flag)
void SetNrSupport(int nr)
int nr_ransac_iter_threshold
unsigned int nr_samples_min_threshold
float planefit_dist_threshold_far
float termi_inlier_percen_threshold
unsigned int nr_grids_fine
unsigned int nr_z_comp_candis
unsigned int nr_inliers_min_threshold
float planefit_filter_threshold
float sample_region_z_lower
unsigned int nr_points_max
float planefit_dist_threshold_near
unsigned int nr_grids_coarse
float planefit_orien_threshold
float candidate_filter_threshold
unsigned int nr_samples_max_threshold
unsigned int nr_z_comp_fail_threshold
float sample_region_z_upper
std::vector< int > indices
unsigned int Size() const
int Prune(unsigned int min_nr_samples, unsigned int max_nr_samples)
void Reserve(unsigned int size)