9 #include <aliceVision/system/Logger.hpp>
11 #include <Eigen/Dense>
13 #include <E57SimpleData.h>
14 #include <E57SimpleReader.h>
24 unsigned short idMesh;
25 Eigen::Vector3d coords;
30 E57Reader(
const std::vector<std::string>& paths)
34 _countMeshesForFile(0),
35 _requiredIntensity(0.0)
42 _countMeshesForFile = 0;
45 bool getNext(Eigen::Vector3d& sensorPosition, std::vector<PointInfo>& vertices, Eigen::Matrix<size_t, -1, -1>& grid)
51 if (_idMesh >=
static_cast<int>(_countMeshesForFile))
55 if (_idPath >=
static_cast<int>(_paths.size()))
61 _reader = std::make_unique<e57::Reader>(_paths[_idPath], e57::ReaderOptions());
62 if (!_reader->IsOpen())
68 if (!_reader->GetE57Root(root))
74 _countMeshesForFile = _reader->GetData3DCount();
77 if (_idMesh >=
static_cast<int>(_countMeshesForFile))
88 e57::Data3D scanHeader;
89 if (!_reader->ReadData3D(_idMesh, scanHeader))
91 ALICEVISION_LOG_ERROR(
"Error reading mesh #" << _idMesh);
96 Eigen::Quaternion<double> q(scanHeader.pose.rotation.w, scanHeader.pose.rotation.x, scanHeader.pose.rotation.y, scanHeader.pose.rotation.z);
98 Eigen::Matrix3d R = q.normalized().toRotationMatrix();
101 t(0) = scanHeader.pose.translation.x;
102 t(1) = scanHeader.pose.translation.y;
103 t(2) = scanHeader.pose.translation.z;
106 int64_t maxColumns = 0;
107 int64_t countPoints = 0;
108 int64_t countGroups = 0;
109 int64_t maxGroupSize = 0;
112 if (!_reader->GetData3DSizes(0, maxRows, maxColumns, countPoints, countGroups, maxGroupSize, isColumnIndex))
114 ALICEVISION_LOG_ERROR(
"Error reading content of mesh #" << _idMesh);
118 e57::Data3DPointsFloat data3DPoints(scanHeader);
119 e57::CompressedVectorReader datareader = _reader->SetUpData3DPointsData(_idMesh, countPoints, data3DPoints);
123 vertices.reserve(countPoints);
126 grid.resize(maxRows, maxColumns);
127 grid.fill(std::numeric_limits<size_t>::max());
129 unsigned int readCount = 0;
130 while ((readCount = datareader.read()) > 0)
133 if (data3DPoints.sphericalRange !=
nullptr)
135 ALICEVISION_LOG_ERROR(
"Data contains spherical coordinates, this is not currently supported");
139 if (data3DPoints.cartesianX ==
nullptr)
141 ALICEVISION_LOG_ERROR(
"Data contains no cartesian coordinates");
145 if (data3DPoints.columnIndex ==
nullptr)
147 ALICEVISION_LOG_ERROR(
"Data contains no 2d column coordinates");
151 if (data3DPoints.rowIndex ==
nullptr)
153 ALICEVISION_LOG_ERROR(
"Data contains no 2d row coordinates");
157 if (data3DPoints.intensity ==
nullptr)
159 ALICEVISION_LOG_ERROR(
"Data contains no intensities");
163 for (
unsigned int pos = 0; pos < readCount; pos++)
165 if (data3DPoints.cartesianInvalidState[pos])
170 if (data3DPoints.intensity[pos] < _requiredIntensity)
176 pt(0) = data3DPoints.cartesianX[pos];
177 pt(1) = data3DPoints.cartesianY[pos];
178 pt(2) = data3DPoints.cartesianZ[pos];
182 pi.coords = (R * pt + t);
184 pi.intensity = data3DPoints.intensity[pos],
186 grid(data3DPoints.rowIndex[pos], data3DPoints.columnIndex[pos]) = vertices.size();
187 vertices.push_back(pi);
196 bool getNext(Eigen::Vector3d& sensorPosition)
202 if (_idMesh >=
static_cast<int>(_countMeshesForFile))
206 if (_idPath >=
static_cast<int>(_paths.size()))
212 _reader = std::make_unique<e57::Reader>(_paths[_idPath], e57::ReaderOptions());
213 if (!_reader->IsOpen())
219 if (!_reader->GetE57Root(root))
225 _countMeshesForFile = _reader->GetData3DCount();
228 if (_idMesh >=
static_cast<int>(_countMeshesForFile))
239 e57::Data3D scanHeader;
240 if (!_reader->ReadData3D(_idMesh, scanHeader))
242 ALICEVISION_LOG_ERROR(
"Error reading mesh #" << _idMesh);
248 t(0) = scanHeader.pose.translation.x;
249 t(1) = scanHeader.pose.translation.y;
250 t(2) = scanHeader.pose.translation.z;
257 int getIdMesh() {
return _idMesh; }
259 void setRequiredIntensity(
double requirement) { _requiredIntensity = requirement; }
262 std::vector<std::string> _paths;
263 std::unique_ptr<e57::Reader> _reader;
267 size_t _countMeshesForFile;
268 double _requiredIntensity;