15 std::vector<PointXYZ>& subsampled_points,
16 std::vector<float>& original_features,
17 std::vector<float>& subsampled_features,
18 std::vector<int>& original_classes,
19 std::vector<int>& subsampled_classes,
26 size_t N = original_points.size();
29 size_t fdim = original_features.size() / N;
30 size_t ldim = original_classes.size() / N;
40 (size_t)
floor((maxCorner.
x - originCorner.
x) / sampleDl) + 1;
42 (size_t)
floor((maxCorner.
y - originCorner.
y) / sampleDl) + 1;
47 bool use_feature = original_features.size() > 0;
48 bool use_classes = original_classes.size() > 0;
55 int nDisp =
static_cast<int>(N / 100);
58 std::unordered_map<size_t, SampledData> data;
60 for (
auto& p : original_points) {
61 size_t iX, iY, iZ, mapIdx;
64 iX = (size_t)
std::floor((p.x - originCorner.
x) / sampleDl);
65 iY = (size_t)
std::floor((p.y - originCorner.
y) / sampleDl);
66 iZ = (size_t)
std::floor((p.z - originCorner.
z) / sampleDl);
67 mapIdx = iX + sampleNX * iY + sampleNX * sampleNY * iZ;
70 if (data.count(mapIdx) < 1)
74 if (use_feature && use_classes)
75 data[mapIdx].update_all(p, original_features.begin() + i * fdim,
76 original_classes.begin() + i * ldim);
78 data[mapIdx].update_features(p,
79 original_features.begin() + i * fdim);
81 data[mapIdx].update_classes(p, original_classes.begin() + i * ldim);
83 data[mapIdx].update_points(p);
87 if (verbose > 1 && i % nDisp == 0)
88 std::cout <<
"\rSampled Map : " << std::setw(3) << i / nDisp <<
"%";
92 subsampled_points.reserve(data.size());
93 if (use_feature) subsampled_features.reserve(data.size() * fdim);
94 if (use_classes) subsampled_classes.reserve(data.size() * ldim);
95 for (
auto& v : data) {
96 subsampled_points.push_back(v.second.point * (1.0f / v.second.count));
98 float count = (float)v.second.count;
99 transform(v.second.features.begin(), v.second.features.end(),
100 v.second.features.begin(),
102 subsampled_features.insert(subsampled_features.end(),
103 v.second.features.begin(),
104 v.second.features.end());
107 for (
int i = 0; i < static_cast<int>(ldim); i++)
108 subsampled_classes.push_back(
109 max_element(v.second.labels[i].begin(),
110 v.second.labels[i].end(),
111 [](
const std::pair<int, int>& a,
112 const std::pair<int, int>& b) {
113 return a.second < b.second;
123 std::vector<PointXYZ>& subsampled_points,
124 std::vector<float>& original_features,
125 std::vector<float>& subsampled_features,
126 std::vector<int>& original_classes,
127 std::vector<int>& subsampled_classes,
128 std::vector<int>& original_batches,
129 std::vector<int>& subsampled_batches,
139 size_t N = original_points.size();
142 size_t fdim = original_features.size() / N;
143 size_t ldim = original_classes.size() / N;
146 if (max_p < 1) max_p =
static_cast<int>(N);
151 for (b = 0; b < static_cast<int>(original_batches.size()); b++) {
153 std::vector<PointXYZ> b_o_points = std::vector<PointXYZ>(
154 original_points.begin() + sum_b,
155 original_points.begin() + sum_b + original_batches[b]);
157 std::vector<float> b_o_features;
158 if (original_features.size() > 0) {
159 b_o_features = std::vector<float>(
160 original_features.begin() + sum_b * fdim,
161 original_features.begin() +
162 (sum_b + original_batches[b]) * fdim);
165 std::vector<int> b_o_classes;
166 if (original_classes.size() > 0) {
168 std::vector<int>(original_classes.begin() + sum_b * ldim,
169 original_classes.begin() + sum_b +
170 original_batches[b] * ldim);
174 std::vector<PointXYZ> b_s_points;
175 std::vector<float> b_s_features;
176 std::vector<int> b_s_classes;
180 b_o_classes, b_s_classes, sampleDl, 0);
186 if (
static_cast<int>(b_s_points.size()) <= max_p) {
187 subsampled_points.insert(subsampled_points.end(),
188 b_s_points.begin(), b_s_points.end());
190 if (original_features.size() > 0)
191 subsampled_features.insert(subsampled_features.end(),
192 b_s_features.begin(),
195 if (original_classes.size() > 0)
196 subsampled_classes.insert(subsampled_classes.end(),
200 subsampled_batches.push_back(
static_cast<int>(b_s_points.size()));
202 subsampled_points.insert(subsampled_points.end(),
204 b_s_points.begin() + max_p);
206 if (original_features.size() > 0)
207 subsampled_features.insert(subsampled_features.end(),
208 b_s_features.begin(),
209 b_s_features.begin() + max_p * fdim);
211 if (original_classes.size() > 0)
212 subsampled_classes.insert(subsampled_classes.end(),
214 b_s_classes.begin() + max_p * ldim);
216 subsampled_batches.push_back(max_p);
220 sum_b += original_batches[b];
static PointXYZ floor(const PointXYZ P)
PointXYZ min_point(std::vector< PointXYZ > points)
void batch_grid_subsampling(std::vector< PointXYZ > &original_points, std::vector< PointXYZ > &subsampled_points, std::vector< float > &original_features, std::vector< float > &subsampled_features, std::vector< int > &original_classes, std::vector< int > &subsampled_classes, std::vector< int > &original_batches, std::vector< int > &subsampled_batches, float sampleDl, int max_p)
void grid_subsampling(std::vector< PointXYZ > &original_points, std::vector< PointXYZ > &subsampled_points, std::vector< float > &original_features, std::vector< float > &subsampled_features, std::vector< int > &original_classes, std::vector< int > &subsampled_classes, float sampleDl, int verbose)
PointXYZ max_point(std::vector< PointXYZ > points)
MiniVec< float, N > floor(const MiniVec< float, N > &a)
Generic file read and write utility for python interface.