Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions apps/multi_view_tls_registration/multi_view_tls_registration.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,18 +107,25 @@ void save_intersection(

void save_separately_to_las(const Session& session, fs::path outwd, std::string extension)
{
for (auto& p : session.point_clouds_container.point_clouds)
const auto& clouds = session.point_clouds_container.point_clouds;
if (clouds.size() > 65535)
{
std::cerr << "warning: more than 65535 scans, point_source_ID capped at 65535\n";
}
for (size_t scan_idx = 0; scan_idx < clouds.size(); ++scan_idx)
{
const auto& p = clouds[scan_idx];
if (p.visible)
{
const unsigned short psid = static_cast<unsigned short>(std::min<size_t>(scan_idx, 65535));
fs::path file_path_in = p.file_name;
fs::path file_path_put = outwd;
file_path_put /= (file_path_in.stem().string() + "_processed" + extension);
std::cout << "file_in: " << file_path_in << std::endl;
std::cout << "file_out: " << file_path_put << std::endl;
std::cout << "start save_processed_pc" << std::endl;
bool compressed = (extension == ".laz");
save_processed_pc(file_path_in, file_path_put, p.m_pose, session.point_clouds_container.offset, compressed);
save_processed_pc(file_path_in, file_path_put, p.m_pose, session.point_clouds_container.offset, compressed, psid);
std::cout << "save_processed_pc finished" << std::endl;
}
}
Expand All @@ -134,12 +141,21 @@ void save_trajectories_to_laz(
std::vector<Eigen::Vector3d> pointcloud;
std::vector<unsigned short> intensity;
std::vector<double> timestamps;
std::vector<unsigned short> point_source_ids;

const auto& clouds = session.point_clouds_container.point_clouds;
if (clouds.size() > 65535)
{
std::cerr << "warning: more than 65535 scans, point_source_ID capped at 65535\n";
}

float consecutive_distance = 0;
for (auto& p : session.point_clouds_container.point_clouds)
for (size_t scan_idx = 0; scan_idx < clouds.size(); ++scan_idx)
{
const auto& p = clouds[scan_idx];
if (p.visible)
{
const unsigned short psid = static_cast<unsigned short>(std::min<size_t>(scan_idx, 65535));
for (int i = 0; i < p.local_trajectory.size(); i++)
{
const auto& pp = p.local_trajectory[i].m_pose.translation();
Expand Down Expand Up @@ -185,6 +201,7 @@ void save_trajectories_to_laz(
pointcloud.push_back(vp);
intensity.push_back(0);
timestamps.push_back(p.local_trajectory[i].timestamps.first);
point_source_ids.push_back(psid);
}
else
{
Expand All @@ -194,6 +211,7 @@ void save_trajectories_to_laz(
pointcloud.push_back(vp);
intensity.push_back(0);
timestamps.push_back(p.local_trajectory[i].timestamps.first);
point_source_ids.push_back(psid);
}
}
}
Expand All @@ -207,7 +225,8 @@ void save_trajectories_to_laz(
timestamps,
session.point_clouds_container.offset.x(),
session.point_clouds_container.offset.y(),
session.point_clouds_container.offset.z()))
session.point_clouds_container.offset.z(),
&point_source_ids))
{
std::cout << "problem with saving file: " << output_file_name << std::endl;
}
Expand Down
34 changes: 28 additions & 6 deletions core/include/Core/export_laz.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include <Core/session.h>

#include <algorithm>
#include <filesystem>
#include <iostream>
#include <string>
Expand Down Expand Up @@ -79,12 +80,19 @@ class LazWriter
}

bool writePoint(
const Eigen::Vector3d& position, unsigned short intensity, double timestamp, double offset_x, double offset_y, double offset_z)
const Eigen::Vector3d& position,
unsigned short intensity,
double timestamp,
double offset_x,
double offset_y,
double offset_z,
unsigned short point_source_id = 0)
{
point_->intensity = intensity;
point_->return_number = 1;
point_->number_of_returns = 1;
point_->gps_time = timestamp * 1e9;
point_->point_source_ID = point_source_id;

laszip_F64 coordinates[3];
coordinates[0] = position.x() + offset_x;
Expand Down Expand Up @@ -155,15 +163,17 @@ inline bool exportLaz(
const std::vector<double>& timestamps,
double offset_x = 0.0,
double offset_y = 0.0,
double offset_alt = 0.0)
double offset_alt = 0.0,
const std::vector<unsigned short>* point_source_ids = nullptr)
{
LazWriter writer;
if (!writer.open(filename, offset_x, offset_y, offset_alt))
return false;

for (size_t i = 0; i < pointcloud.size(); i++)
{
if (!writer.writePoint(pointcloud[i], intensity[i], timestamps[i], offset_x, offset_y, offset_alt))
const unsigned short psid = (point_source_ids && i < point_source_ids->size()) ? (*point_source_ids)[i] : 0;
if (!writer.writePoint(pointcloud[i], intensity[i], timestamps[i], offset_x, offset_y, offset_alt, psid))
return false;
}

Expand All @@ -175,7 +185,8 @@ inline void save_processed_pc(
const fs::path& file_path_put,
const Eigen::Affine3d& m_pose,
const Eigen::Vector3d& offset,
bool override_compressed = false)
bool override_compressed = false,
unsigned short point_source_id = 0)
{
std::cout << "processing: " << file_path_in << std::endl;

Expand Down Expand Up @@ -292,6 +303,7 @@ inline void save_processed_pc(
output_point->classification = input_point->classification;
output_point->num_extra_bytes = input_point->num_extra_bytes;
output_point->gps_time = input_point->gps_time;
output_point->point_source_ID = point_source_id;
memcpy(output_point->extra_bytes, input_point->extra_bytes, output_point->num_extra_bytes);

if (laszip_write_point(laszip_writer))
Expand Down Expand Up @@ -396,15 +408,23 @@ inline void save_all_to_las(const Session& session, std::string output_las_name,
bool found_first_pose = false;

const auto& offset = session.point_clouds_container.offset;
const auto& clouds = session.point_clouds_container.point_clouds;

if (clouds.size() > 65535)
{
std::cerr << "warning: more than 65535 scans, point_source_ID capped at 65535\n";
}

LazWriter writer;
if (!writer.open(output_las_name, offset.x(), offset.y(), offset.z()))
{
std::cout << "problem with saving file: " << output_las_name << std::endl;
return;
}

for (const auto& p : session.point_clouds_container.point_clouds)
for (size_t scan_idx = 0; scan_idx < clouds.size(); ++scan_idx)
{
const auto& p = clouds[scan_idx];
if (p.visible)
{
if (!found_first_pose)
Expand All @@ -413,6 +433,8 @@ inline void save_all_to_las(const Session& session, std::string output_las_name,
first_pose = p.m_pose;
}

const unsigned short psid = static_cast<unsigned short>(std::min<size_t>(scan_idx, 65535));

for (size_t i = 0; i < p.points_local.size(); ++i)
{
if (skip_ts_0)
Expand All @@ -428,7 +450,7 @@ inline void save_all_to_las(const Session& session, std::string output_las_name,
unsigned short inten = (i < p.intensities.size()) ? p.intensities[i] : 0;
double ts = (i < p.timestamps.size()) ? p.timestamps[i] : 0.0;

if (!writer.writePoint(vp, inten, ts, offset.x(), offset.y(), offset.z()))
if (!writer.writePoint(vp, inten, ts, offset.x(), offset.y(), offset.z(), psid))
return;
}
}
Expand Down
Loading