@@ -260,13 +260,16 @@ 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>>>
264+ per_thread_voxels;
264265
265- #pragma omp parallel num_threads(utility::EstimateMaxThreads())
266+ int num_threads = utility::EstimateMaxThreads ();
267+
268+ #pragma omp parallel num_threads(num_threads)
266269 {
267270#pragma omp single
268- { per_thread_voxels.resize (utility::GetNumThreads () ); }
269- int thread_id = utility::GetThreadNum ();
271+ { per_thread_voxels.resize (num_threads ); }
272+ auto &thread_voxels = per_thread_voxels[ utility::GetThreadNum ()] ;
270273
271274#ifdef _WIN32
272275#pragma omp for schedule(static)
@@ -283,17 +286,22 @@ std::shared_ptr<geometry::VoxelGrid> UniformTSDFVolume::ExtractVoxelGrid()
283286 double c = (f + 1.0 ) * 0.5 ;
284287 Eigen::Vector3d color (c, c, c);
285288 Eigen::Vector3i index (x, y, z);
286- per_thread_voxels[thread_id].emplace_back (index, color);
289+ thread_voxels.emplace_back (std::make_pair (
290+ index, geometry::Voxel (index, color)));
287291 }
288292 }
289293 }
290294 }
291295 }
292296
297+ size_t total_voxels = 0 ;
293298 for (const auto &thread_vector : per_thread_voxels) {
294- for (const auto &voxel : thread_vector) {
295- voxel_grid->voxels_ [voxel.grid_index_ ] = voxel;
296- }
299+ total_voxels += thread_vector.size ();
300+ }
301+ voxel_grid->voxels_ .reserve (total_voxels);
302+
303+ for (const auto &thread_vector : per_thread_voxels) {
304+ voxel_grid->voxels_ .insert (thread_vector.begin (), thread_vector.end ());
297305 }
298306
299307 return voxel_grid;
0 commit comments