3 #include <boost/format.hpp> 15 ScanDirectoryParser::~ScanDirectoryParser()
24 ScanDirectoryParser::ScanDirectoryParser(
const std::string& directory) noexcept
28 if(!exists(directory))
30 std::cout <<
timestamp <<
"Directory " << directory <<
" does not exist." << std::endl;
34 m_directory = directory;
38 m_pointExtension =
".txt";
39 m_poseExtension =
".dat";
40 m_pointPrefix =
"scan";
41 m_posePrefix =
"scan";
47 void ScanDirectoryParser::setPointCloudPrefix(
const std::string& prefix)
49 m_pointPrefix = prefix;
51 void ScanDirectoryParser::setPointCloudExtension(
const std::string& extension)
53 cout << extension << endl;
54 m_pointExtension = extension;
56 void ScanDirectoryParser::setPosePrefix(
const std::string& prefix)
58 m_posePrefix = prefix;
60 void ScanDirectoryParser::setPoseExtension(
const std::string& extension)
62 m_poseExtension = extension;
65 void ScanDirectoryParser::setStart(
int s)
69 void ScanDirectoryParser::setEnd(
int e)
75 size_t ScanDirectoryParser::examinePLY(
const std::string&
filename)
80 size_t ScanDirectoryParser::examineASCII(
const std::string&
filename)
86 PointBufferPtr ScanDirectoryParser::octreeSubSample(
const double& voxelSize,
const size_t& minPoints)
92 std::cout <<
timestamp <<
"Reading " << i->m_filename << std::endl;
93 ModelPtr model = ModelFactory::readModel(i->m_filename);
99 std::cout <<
timestamp <<
"Building octree with voxel size " << voxelSize <<
" from " << i->m_filename << std::endl;
104 std::cout <<
timestamp <<
"Transforming reduced point cloud" << std::endl;
105 out_model->m_pointCloud = reduced;
106 transformPointCloud<double>(out_model, i->m_pose);
109 std::stringstream name_stream;
110 Path p(i->m_filename);
111 name_stream << p.stem().string() <<
"_reduced" <<
".ply";
112 std::cout <<
timestamp <<
"Saving data to " << name_stream.str() << std::endl;
113 ModelFactory::saveModel(out_model, name_stream.str());
115 std::cout <<
timestamp <<
"Points written: " << reduced->numPoints() << std::endl;
127 size_t actual_points = 0;
129 for(
auto i : m_scans)
131 ModelPtr model = ModelFactory::readModel(i->m_filename);
142 float total_ratio = (float)i->m_numPoints / m_numPoints;
143 float target_ratio = total_ratio * tz;
146 target_size = (
int)(target_ratio + 0.5);
147 std::cout <<
timestamp <<
"Sampling " << target_size <<
" points from " << i->m_filename << std::endl;
154 std::cout <<
timestamp <<
"Using orignal points from " << i->m_filename << std::endl;
156 target_size = buffer->numPoints();
160 std::cout <<
timestamp <<
"Transforming point cloud" << std::endl;
161 out_model->m_pointCloud = reduced;
162 transformPointCloud<double>(out_model, i->m_pose);
165 std::stringstream name_stream;
166 Path p(i->m_filename);
167 name_stream << p.stem().string() <<
"_reduced" <<
".ply";
168 std::cout <<
timestamp <<
"Saving data to " << name_stream.str() << std::endl;
169 ModelFactory::saveModel(out_model, name_stream.str());
171 actual_points += target_size;
172 std::cout <<
timestamp <<
"Points written: " << actual_points <<
" / " << tz << std::endl;
176 return out_model->m_pointCloud;
179 void ScanDirectoryParser::parseDirectory()
181 std::cout <<
timestamp <<
"Parsing directory" << m_directory << std::endl;
182 std::cout <<
timestamp <<
"Point prefix and extension: " << m_pointPrefix <<
" " << m_pointExtension << std::endl;
183 std::cout <<
timestamp <<
"Pose prefix and extension: " << m_posePrefix <<
" " << m_poseExtension << std::endl;
186 for(
size_t i = m_start; i <= m_end; i++)
189 std::stringstream point_ss;
190 point_ss << m_pointPrefix << boost::format(
"%03d") % i << m_pointExtension;
191 std::string pointFileName = point_ss.str();
195 std::stringstream pose_ss;
196 pose_ss << m_posePrefix << boost::format(
"%03d") % i << m_poseExtension;
197 std::string poseFileName = pose_ss.str();
202 if(exists(pointPath))
204 std::cout <<
timestamp <<
"Counting points in file " << pointPath << std::endl;
205 if(pointPath.extension() ==
".3d" || pointPath.extension() ==
".txt" || pointPath.extension() ==
".pts")
207 n = examineASCII(pointPath.string());
209 else if(pointPath.extension() ==
".ply")
211 n = examinePLY(pointPath.string());
217 std::cout <<
timestamp <<
"Point cloud file " << pointPath <<
" does not exist." << std::endl;
225 matrix = getTransformationFromFile<double>(posePath.string());
226 std::cout <<
timestamp <<
"Found transformation: " << posePath <<
" @ " << std::endl << matrix << std::endl;
230 std::cout <<
timestamp <<
"Scan pose file " << posePath <<
"does not exist. Will not transfrom." << std::endl;
236 info->
m_filename = std::string(pointPath.string());
240 m_scans.push_back(info);
242 std::cout <<
timestamp <<
"Finished parsing. Directory contains " << m_scans.size() <<
" scans with " << m_numPoints <<
" points." << std::endl;
A class to handle point information with an arbitrarily large number of attribute channels...
static Timestamp timestamp
A global time stamp object for program runtime measurement.
PointBufferPtr getReducedPoints()
std::shared_ptr< PointBuffer > PointBufferPtr
Transform< double > Transformd
4x4 double precision transformation matrix
size_t getNumberOfPointsInPLY(const std::string &filename)
Get the Number Of Points (element points if present, vertex count otherwise) in a PLY file...
PointBufferPtr subSamplePointBuffer(PointBufferPtr src, const size_t &n)
Computes a random sub-sampling of a point buffer by creating a uniform distribution over all point in...
std::shared_ptr< Model > ModelPtr
boost::filesystem::path Path
size_t countPointsInFile(const boost::filesystem::path &inFile)
Counts the number of points (i.e. number of lines) in the given file.