28 #ifndef UTIL3D_SURFACE_H_
29 #define UTIL3D_SURFACE_H_
31 #include <rtabmap/core/rtabmap_core_export.h>
33 #include <pcl/PolygonMesh.h>
34 #include <pcl/point_cloud.h>
35 #include <pcl/point_types.h>
36 #include <pcl/TextureMesh.h>
37 #include <pcl/pcl_base.h>
42 #include <rtabmap/core/Version.h>
65 const std::vector<pcl::Vertices> & polygons,
67 std::vector<std::set<int> > & neighborPolygons,
68 std::vector<std::set<int> > & vertexPolygons);
71 const std::vector<std::set<int> > & neighborPolygons,
72 int minClusterSize = 0);
75 const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
76 double angleTolerance,
78 int trianglePixelSize,
79 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0));
81 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
82 double angleTolerance =
M_PI/16,
84 int trianglePixelSize = 2,
85 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0));
87 const pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
88 double angleTolerance =
M_PI/16,
90 int trianglePixelSize = 2,
91 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0));
94 pcl::PointCloud<pcl::PointXYZRGBNormal> & cloudA,
95 std::vector<pcl::Vertices> & polygonsA,
96 const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloudB,
97 const std::vector<pcl::Vertices> & polygonsB);
99 pcl::PointCloud<pcl::PointXYZRGB> & cloudA,
100 std::vector<pcl::Vertices> & polygonsA,
101 const pcl::PointCloud<pcl::PointXYZRGB> & cloudB,
102 const std::vector<pcl::Vertices> & polygonsB);
106 const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud,
107 const std::vector<pcl::Vertices> & polygons,
108 pcl::PointCloud<pcl::PointXYZRGBNormal> & outputCloud,
109 std::vector<pcl::Vertices> & outputPolygons);
111 const pcl::PointCloud<pcl::PointXYZRGB> & cloud,
112 const std::vector<pcl::Vertices> & polygons,
113 pcl::PointCloud<pcl::PointXYZRGB> & outputCloud,
114 std::vector<pcl::Vertices> & outputPolygons);
116 const pcl::PointCloud<pcl::PointXYZRGB> & cloud,
117 const std::vector<pcl::Vertices> & polygons,
118 pcl::PointCloud<pcl::PointXYZRGB> & outputCloud,
119 std::vector<pcl::Vertices> & outputPolygons);
122 const pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloud,
123 const std::vector<pcl::Vertices> & polygons,
126 bool keepLatestInRadius);
129 const std::vector<pcl::Vertices> & polygons);
131 pcl::PolygonMesh::Ptr RTABMAP_CORE_EXPORT
createMesh(
132 const pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloudWithNormals,
133 float gp3SearchRadius = 0.025,
135 int gp3MaximumNearestNeighbors = 100,
136 float gp3MaximumSurfaceAngle =
M_PI/4,
137 float gp3MinimumAngle =
M_PI/18,
138 float gp3MaximumAngle = 2*
M_PI/3,
139 bool gp3NormalConsistency =
true);
142 const pcl::PolygonMesh::Ptr & mesh,
143 const std::map<int, Transform> & poses,
144 const std::map<int, CameraModel> & cameraModels,
145 const std::map<int, cv::Mat> & cameraDepths,
146 float maxDistance = 0.0f,
148 float maxAngle = 0.0f,
149 int minClusterSize = 50,
150 const std::vector<float> & roiRatios = std::vector<float>(),
151 const ProgressState *
state = 0,
152 std::vector<std::map<int, pcl::PointXY> > * vertexToPixels = 0,
153 bool distanceToCamPolicy =
false);
155 const pcl::PolygonMesh::Ptr & mesh,
156 const std::map<int, Transform> & poses,
157 const std::map<
int, std::vector<CameraModel> > & cameraModels,
158 const std::map<int, cv::Mat> & cameraDepths,
159 float maxDistance = 0.0f,
161 float maxAngle = 0.0f,
162 int minClusterSize = 50,
163 const std::vector<float> & roiRatios = std::vector<float>(),
164 const ProgressState *
state = 0,
165 std::vector<std::map<int, pcl::PointXY> > * vertexToPixels = 0,
166 bool distanceToCamPolicy =
false);
172 pcl::TextureMesh & textureMesh,
176 const std::list<pcl::TextureMesh::Ptr> & meshes);
179 pcl::TextureMesh & mesh,
const cv::Size & imageSize,
int textureSize,
int maxTextures,
float & scale, std::vector<bool> * materialsKept=0);
182 const std::vector<pcl::Vertices> & polygons);
184 const std::vector<std::vector<pcl::Vertices> > & polygons);
186 const std::vector<std::vector<RTABMAP_PCL_INDEX> > & polygons);
188 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & tex_polygons);
191 const cv::Mat & cloudMat,
192 const std::vector<std::vector<std::vector<RTABMAP_PCL_INDEX> > > & polygons,
193 #
if PCL_VERSION_COMPARE(>=, 1, 8, 0)
196 const std::vector<std::vector<Eigen::Vector2f> > & texCoords,
202 const cv::Mat & cloudMat,
203 const std::vector<std::vector<RTABMAP_PCL_INDEX> > & polygons);
210 pcl::TextureMesh & mesh,
211 const std::map<int, cv::Mat> & images,
212 const std::map<int, CameraModel> & calibrations,
213 const Memory * memory = 0,
214 const DBDriver * dbDriver = 0,
215 int textureSize = 4096,
216 int textureCount = 1,
217 const std::vector<std::map<int, pcl::PointXY> > & vertexToPixels = std::vector<std::map<int, pcl::PointXY> >(),
218 bool gainCompensation =
true,
219 float gainBeta = 10.0f,
221 bool blending =
true,
222 int blendingDecimation = 0,
223 int brightnessContrastRatioLow = 0,
224 int brightnessContrastRatioHigh = 0,
226 const ProgressState *
state = 0,
227 unsigned char blankValue = 255,
228 bool clearVertexColorUnderTexture =
true,
229 std::map<
int, std::map<int, cv::Vec4d> > * gains = 0,
230 std::map<
int, std::map<int, cv::Mat> > * blendingGains = 0,
231 std::pair<float, float> * contrastValues = 0);
233 pcl::TextureMesh & mesh,
234 const std::map<int, cv::Mat> & images,
235 const std::map<
int, std::vector<CameraModel> > & calibrations,
236 const Memory * memory = 0,
237 const DBDriver * dbDriver = 0,
238 int textureSize = 4096,
239 int textureCount = 1,
240 const std::vector<std::map<int, pcl::PointXY> > & vertexToPixels = std::vector<std::map<int, pcl::PointXY> >(),
241 bool gainCompensation =
true,
242 float gainBeta = 10.0f,
244 bool blending =
true,
245 int blendingDecimation = 0,
246 int brightnessContrastRatioLow = 0,
247 int brightnessContrastRatioHigh = 0,
249 const ProgressState *
state = 0,
250 unsigned char blankValue = 255,
251 bool clearVertexColorUnderTexture =
true,
252 std::map<
int, std::map<int, cv::Vec4d> > * gains = 0,
253 std::map<
int, std::map<int, cv::Mat> > * blendingGains = 0,
254 std::pair<float, float> * contrastValues = 0);
260 const std::string & outputOBJPath,
261 const pcl::PCLPointCloud2 & cloud,
262 const std::vector<pcl::Vertices> & polygons,
263 const std::map<int, Transform> & cameraPoses,
264 const std::vector<std::map<int, pcl::PointXY> > & vertexToPixels,
265 const std::map<int, cv::Mat> & images,
266 const std::map<
int, std::vector<CameraModel> > & cameraModels,
267 const Memory * memory = 0,
268 const DBDriver * dbDriver = 0,
269 int textureSize = 8192,
270 const std::string & textureFormat =
"jpg",
271 const std::map<
int, std::map<int, cv::Vec4d> > & gains = std::map<
int, std::map<int, cv::Vec4d> >(),
272 const std::map<
int, std::map<int, cv::Mat> > & blendingGains = std::map<
int, std::map<int, cv::Mat> >(),
273 const std::pair<float, float> & contrastValues = std::pair<float, float>(0,0),
274 bool gainRGB =
true);
303 const std::string & outputOBJPath,
304 const pcl::PCLPointCloud2 & cloud,
305 const std::vector<pcl::Vertices> & polygons,
306 const std::map<int, Transform> & cameraPoses,
307 const std::vector<std::map<int, pcl::PointXY> > & vertexToPixels,
308 const std::map<int, cv::Mat> & images,
309 const std::map<
int, std::vector<CameraModel> > & cameraModels,
310 const Memory * memory = 0,
311 const DBDriver * dbDriver = 0,
312 unsigned int textureSize = 8192,
313 unsigned int textureDownscale = 2,
314 const std::string & nbContrib =
"1 5 10 0",
315 const std::string & textureFormat =
"jpg",
316 const std::map<
int, std::map<int, cv::Vec4d> > & gains = std::map<
int, std::map<int, cv::Vec4d> >(),
317 const std::map<
int, std::map<int, cv::Mat> > & blendingGains = std::map<
int, std::map<int, cv::Mat> >(),
318 const std::pair<float, float> & contrastValues = std::pair<float, float>(0,0),
320 unsigned int unwrapMethod = 0,
321 bool fillHoles =
false,
322 unsigned int padding = 5,
323 double bestScoreThreshold = 0.1,
324 double angleHardThreshold = 90.0,
325 bool forceVisibleByAllVertices =
false);
328 const cv::Mat & laserScan,
331 pcl::PointCloud<pcl::Normal>::Ptr RTABMAP_CORE_EXPORT
computeNormals(
332 const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
334 float searchRadius = 0.0f,
335 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
336 pcl::PointCloud<pcl::Normal>::Ptr RTABMAP_CORE_EXPORT
computeNormals(
337 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
339 float searchRadius = 0.0f,
340 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
341 pcl::PointCloud<pcl::Normal>::Ptr RTABMAP_CORE_EXPORT
computeNormals(
342 const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
344 float searchRadius = 0.0f,
345 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
346 pcl::PointCloud<pcl::Normal>::Ptr RTABMAP_CORE_EXPORT
computeNormals(
347 const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
348 const pcl::IndicesPtr & indices,
350 float searchRadius = 0.0f,
351 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
352 pcl::PointCloud<pcl::Normal>::Ptr RTABMAP_CORE_EXPORT
computeNormals(
353 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
354 const pcl::IndicesPtr & indices,
356 float searchRadius = 0.0f,
357 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
358 pcl::PointCloud<pcl::Normal>::Ptr RTABMAP_CORE_EXPORT
computeNormals(
359 const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
360 const pcl::IndicesPtr & indices,
362 float searchRadius = 0.0f,
363 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
366 const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
368 float searchRadius = 0.0f,
369 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
371 const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
373 float searchRadius = 0.0f,
374 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
376 const pcl::PointCloud<pcl::PointXYZ>::Ptr & cloud,
378 float searchRadius = 0.0f,
379 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
381 const pcl::PointCloud<pcl::PointXYZI>::Ptr & cloud,
383 float searchRadius = 0.0f,
384 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
387 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
388 float maxDepthChangeFactor = 0.02f,
389 float normalSmoothingSize = 10.0f,
390 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
392 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
393 const pcl::IndicesPtr & indices,
394 float maxDepthChangeFactor = 0.02f,
395 float normalSmoothingSize = 10.0f,
396 const Eigen::Vector3f & viewPoint = Eigen::Vector3f(0,0,0));
399 const LaserScan & scan,
401 cv::Mat * pcaEigenVectors = 0,
402 cv::Mat * pcaEigenValues = 0);
404 const pcl::PointCloud<pcl::Normal> & normals,
407 cv::Mat * pcaEigenVectors = 0,
408 cv::Mat * pcaEigenValues = 0);
410 const pcl::PointCloud<pcl::PointNormal> & cloud,
413 cv::Mat * pcaEigenVectors = 0,
414 cv::Mat * pcaEigenValues = 0);
416 const pcl::PointCloud<pcl::PointXYZINormal> & cloud,
419 cv::Mat * pcaEigenVectors = 0,
420 cv::Mat * pcaEigenValues = 0);
422 const pcl::PointCloud<pcl::PointXYZRGBNormal> & cloud,
425 cv::Mat * pcaEigenVectors = 0,
426 cv::Mat * pcaEigenValues = 0);
428 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr RTABMAP_CORE_EXPORT
mls(
429 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
430 float searchRadius = 0.0f,
431 int polygonialOrder = 2,
432 int upsamplingMethod = 0,
433 float upsamplingRadius = 0.0f,
434 float upsamplingStep = 0.0f,
435 int pointDensity = 0,
436 float dilationVoxelSize = 1.0f,
437 int dilationIterations = 0);
438 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr RTABMAP_CORE_EXPORT
mls(
439 const pcl::PointCloud<pcl::PointXYZRGB>::Ptr & cloud,
440 const pcl::IndicesPtr & indices,
441 float searchRadius = 0.0f,
442 int polygonialOrder = 2,
443 int upsamplingMethod = 0,
444 float upsamplingRadius = 0.0f,
445 float upsamplingStep = 0.0f,
446 int pointDensity = 0,
447 float dilationVoxelSize = 1.0f,
448 int dilationIterations = 0);
452 const LaserScan & scan,
453 const Eigen::Vector3f & viewpoint,
454 bool forceGroundNormalsUp);
456 const LaserScan & scan,
457 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0),
458 float groundNormalsUp = 0.0f);
461 pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
462 const Eigen::Vector3f & viewpoint,
463 bool forceGroundNormalsUp);
465 pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
466 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0),
467 float groundNormalsUp = 0.0f);
470 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
471 const Eigen::Vector3f & viewpoint,
472 bool forceGroundNormalsUp);
474 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
475 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0),
476 float groundNormalsUp = 0.0f);
479 pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
480 const Eigen::Vector3f & viewpoint,
481 bool forceGroundNormalsUp);
483 pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
484 const Eigen::Vector3f & viewpoint = Eigen::Vector3f(0,0,0),
485 float groundNormalsUp = 0.0f);
488 const std::map<int, Transform> & poses,
489 const std::vector<int> & cameraIndices,
490 pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
491 float groundNormalsUp = 0.0f);
493 const std::map<int, Transform> & poses,
494 const std::vector<int> & cameraIndices,
495 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
496 float groundNormalsUp = 0.0f);
498 const std::map<int, Transform> & poses,
499 const std::vector<int> & cameraIndices,
500 pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
501 float groundNormalsUp = 0.0f);
504 const std::map<int, Transform> & poses,
505 const pcl::PointCloud<pcl::PointXYZ>::Ptr & rawCloud,
506 const std::vector<int> & rawCameraIndices,
507 pcl::PointCloud<pcl::PointNormal>::Ptr & cloud,
508 float groundNormalsUp = 0.0f);
510 const std::map<int, Transform> & poses,
511 const pcl::PointCloud<pcl::PointXYZ>::Ptr & rawCloud,
512 const std::vector<int> & rawCameraIndices,
513 pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr & cloud,
514 float groundNormalsUp = 0.0f);
516 const std::map<int, Transform> & poses,
517 const pcl::PointCloud<pcl::PointXYZ>::Ptr & rawCloud,
518 const std::vector<int> & rawCameraIndices,
519 pcl::PointCloud<pcl::PointXYZINormal>::Ptr & cloud,
520 float groundNormalsUp = 0.0f);
523 const std::map<int, Transform> & viewpoints,
524 const LaserScan & rawScan,
525 const std::vector<int> & viewpointIds,
527 float groundNormalsUp = 0.0f);
529 pcl::PolygonMesh::Ptr RTABMAP_CORE_EXPORT
meshDecimation(
const pcl::PolygonMesh::Ptr & mesh,
float factor);
531 template<
typename po
intT>
533 const pcl::PointCloud<pointT> & cloud,
534 const std::vector<pcl::Vertices> & polygons,
535 const pcl::PointXYZ & viewPoint = pcl::PointXYZ(0,0,0));
537 template<
typename po
intRGBT>
539 pcl::PolygonMeshPtr & mesh,
540 float meshDecimationFactor = 0.0f,
541 int maximumPolygons = 0,
542 const typename pcl::PointCloud<pointRGBT>::Ptr & cloud = pcl::PointCloud<pointRGBT>::Ptr(),
543 float transferColorRadius = 0.05f,
544 bool coloredOutput =
true,
545 bool cleanMesh =
true,
546 int minClusterSize = 50,
547 ProgressState * progressState = 0);
572 const Eigen::Vector3f & p,
573 const Eigen::Vector3f & dir,
574 const Eigen::Vector3f & v0,
575 const Eigen::Vector3f & v1,
576 const Eigen::Vector3f & v2,
578 Eigen::Vector3f & normal);
580 template<
typename Po
intT>
582 const Eigen::Vector3f & origin,
583 const Eigen::Vector3f & dir,
584 const typename pcl::PointCloud<PointT> & cloud,
585 const std::vector<pcl::Vertices> & polygons,
586 bool ignoreBackFaces,
588 Eigen::Vector3f & normal,
592 const std::string &file_name,
593 const pcl::TextureMesh &tex_mesh,
597 const std::string &file_name,
598 const pcl::PolygonMesh &mesh,