@@ -260,13 +260,15 @@ std::shared_ptr<geometry::VoxelGrid> UniformTSDFVolume::ExtractVoxelGrid()
260260 // Create a vector to hold voxels for each thread in the parallel region,
261261 // since access to voxel_grid->voxels_ (std::unordered_map) is not
262262 // thread-safe.
263- std::vector<std::vector<geometry::Voxel>> per_thread_voxels;
263+ std::vector<std::vector<std::pair<Eigen::Vector3i, geometry::Voxel> >> per_thread_voxels;
264264
265- #pragma omp parallel num_threads(utility::EstimateMaxThreads())
265+ int num_threads = utility::EstimateMaxThreads ();
266+
267+ #pragma omp parallel num_threads(num_threads)
266268 {
267269#pragma omp single
268- { per_thread_voxels.resize (utility::GetNumThreads () ); }
269- int thread_id = utility::GetThreadNum ();
270+ { per_thread_voxels.resize (num_threads ); }
271+ auto &thread_voxels = per_thread_voxels[ utility::GetThreadNum ()] ;
270272
271273#ifdef _WIN32
272274#pragma omp for schedule(static)
@@ -283,17 +285,22 @@ std::shared_ptr<geometry::VoxelGrid> UniformTSDFVolume::ExtractVoxelGrid()
283285 double c = (f + 1.0 ) * 0.5 ;
284286 Eigen::Vector3d color (c, c, c);
285287 Eigen::Vector3i index (x, y, z);
286- per_thread_voxels[thread_id].emplace_back (index, color);
288+ thread_voxels.emplace_back (
289+ std::make_pair (index, geometry::Voxel (index, color)));
287290 }
288291 }
289292 }
290293 }
291294 }
292295
296+ size_t total_voxels = 0 ;
293297 for (const auto &thread_vector : per_thread_voxels) {
294- for (const auto &voxel : thread_vector) {
295- voxel_grid->voxels_ [voxel.grid_index_ ] = voxel;
296- }
298+ total_voxels += thread_vector.size ();
299+ }
300+ voxel_grid->voxels_ .reserve (total_voxels);
301+
302+ for (const auto &thread_vector : per_thread_voxels) {
303+ voxel_grid->voxels_ .insert (thread_vector.begin (), thread_vector.end ());
297304 }
298305
299306 return voxel_grid;
0 commit comments