44 #include <pcl/common/point_tests.h>
45 #include <pcl/surface/reconstruction.h>
65 template <
typename Po
intInT>
69 using Ptr = shared_ptr<OrganizedFastMesh<PointInT> >;
70 using ConstPtr = shared_ptr<const OrganizedFastMesh<PointInT> >;
190 if (angle_tolerance > 0)
287 addTriangle (
int a,
int b,
int c,
int idx, std::vector<pcl::Vertices>& polygons)
289 assert (idx <
static_cast<int> (polygons.size ()));
290 polygons[idx].vertices.resize (3);
291 polygons[idx].vertices[0] = a;
292 polygons[idx].vertices[1] = b;
293 polygons[idx].vertices[2] = c;
305 addQuad (
int a,
int b,
int c,
int d,
int idx, std::vector<pcl::Vertices>& polygons)
307 assert (idx <
static_cast<int> (polygons.size ()));
308 polygons[idx].vertices.resize (4);
309 polygons[idx].vertices[0] = a;
310 polygons[idx].vertices[1] = b;
311 polygons[idx].vertices[2] = c;
312 polygons[idx].vertices[3] = d;
325 int field_x_idx = 0,
int field_y_idx = 1,
int field_z_idx = 2)
327 float new_value = value;
338 isShadowed (
const PointInT& point_a,
const PointInT& point_b)
342 Eigen::Vector3f dir_a =
viewpoint_ - point_a.getVector3fMap ();
343 Eigen::Vector3f dir_b = point_b.getVector3fMap () - point_a.getVector3fMap ();
344 float distance_to_points = dir_a.norm ();
345 float distance_between_points = dir_b.norm ();
349 float cos_angle = dir_a.dot (dir_b) / (distance_to_points*distance_between_points);
350 if (std::isnan(cos_angle))
354 bool check_distance =
true;
360 float d = distance_to_points;
362 d = std::max(point_a.z, point_b.z);
364 dist_thresh *= dist_thresh;
366 check_distance = (distance_between_points > dist_thresh);
368 valid = !(check_angle && check_distance);
380 valid = (distance_between_points <= dist_thresh);
421 isValidQuad (
const int& a,
const int& b,
const int& c,
const int& d)
472 #ifdef PCL_NO_PRECOMPILE
473 #include <pcl/surface/impl/organized_fast_mesh.hpp>
Define standard C methods to do angle calculations.
MeshConstruction represents a base surface reconstruction class.
bool check_tree_
A flag specifying whether or not the derived reconstruction algorithm needs the search object tree.
Simple triangulation/surface reconstruction for organized point clouds.
void addTriangle(int a, int b, int c, int idx, std::vector< pcl::Vertices > &polygons)
Add a new triangle to the current polygon mesh.
bool isShadowedQuad(const int &a, const int &b, const int &c, const int &d)
Check if a triangle is shadowed.
shared_ptr< OrganizedFastMesh< PointInT > > Ptr
void makeRightCutMesh(std::vector< pcl::Vertices > &polygons)
Create a right cut mesh.
float distance_tolerance_
distance tolerance for filtering out shadowed/occluded edges
bool isValidQuad(const int &a, const int &b, const int &c, const int &d)
Check if a quad is valid.
std::vector< pcl::Vertices > Polygons
bool use_depth_as_distance_
flag whether or not the points' depths are used instead of measured distances (points' distances to t...
void useDepthAsDistance(bool enable)
Use the points' depths (z-coordinates) instead of measured distances (points' distances to the viewpo...
void makeQuadMesh(std::vector< pcl::Vertices > &polygons)
Create a quad mesh.
float max_edge_length_b_
max length of edge, scalar component
Eigen::Vector3f viewpoint_
Viewpoint from which the point cloud has been acquired (in the same coordinate frame as the data).
float cos_angle_tolerance_
(Cosine of the) angle tolerance used when checking whether or not an edge between two points is shado...
int triangle_pixel_size_columns_
size of triangle edges (in pixels) for iterating over columns
void setViewpoint(const Eigen::Vector3f &viewpoint)
Set the viewpoint from where the input point cloud has been acquired.
void storeShadowedFaces(bool enable)
Store shadowed faces or not.
OrganizedFastMesh()
Constructor.
void addQuad(int a, int b, int c, int d, int idx, std::vector< pcl::Vertices > &polygons)
Add a new quad to the current polygon mesh.
void reconstructPolygons(std::vector< pcl::Vertices > &polygons)
Perform the actual polygonal reconstruction.
bool isValidTriangle(const int &a, const int &b, const int &c)
Check if a triangle is valid.
float max_edge_length_a_
max length of edge, scalar component
bool max_edge_length_dist_dependent_
flag whether or not max edge length is distance dependent.
void setTriangulationType(TriangulationType type)
Set the triangulation type (see TriangulationType)
shared_ptr< const OrganizedFastMesh< PointInT > > ConstPtr
void setTrianglePixelSize(int triangle_size)
Set the edge length (in pixels) used for constructing the fixed mesh.
typename pcl::PointCloud< PointInT >::Ptr PointCloudPtr
bool max_edge_length_set_
flag whether or not edges are limited in length
int triangle_pixel_size_rows_
size of triangle edges (in pixels) for iterating over rows.
void setMaxEdgeLength(float a, float b=0.0f, float c=0.0f)
Set a maximum edge length.
void setTrianglePixelSizeRows(int triangle_size)
Set the edge length (in pixels) used for iterating over rows when constructing the fixed mesh.
bool distance_dependent_
flag whether or not distance_tolerance_ is distance dependent (multiplied by the squared distance to ...
bool store_shadowed_faces_
Whether or not shadowed faces are stored, e.g., for exploration.
const Eigen::Vector3f & getViewpoint() const
Get the viewpoint from where the input point cloud has been acquired.
void setDistanceTolerance(float distance_tolerance, bool depth_dependent=false)
bool isShadowedTriangle(const int &a, const int &b, const int &c)
Check if a triangle is shadowed.
float max_edge_length_c_
max length of edge, scalar component
void setTrianglePixelSizeColumns(int triangle_size)
Set the edge length (in pixels) used for iterating over columns when constructing the fixed mesh.
void setAngleTolerance(float angle_tolerance)
Set the angle tolerance used for checking whether or not an edge is occluded.
bool isShadowed(const PointInT &point_a, const PointInT &point_b)
Check if a point is shadowed by another point.
void performReconstruction(std::vector< pcl::Vertices > &polygons) override
Create the surface.
TriangulationType triangulation_type_
Type of meshing scheme (quads vs.
void makeAdaptiveCutMesh(std::vector< pcl::Vertices > &polygons)
Create an adaptive cut mesh.
void unsetMaxEdgeLength()
void makeLeftCutMesh(std::vector< pcl::Vertices > &polygons)
Create a left cut mesh.
~OrganizedFastMesh() override=default
Destructor.
void resetPointData(const int &point_index, pcl::PolygonMesh &mesh, const float &value=0.0f, int field_x_idx=0, int field_y_idx=1, int field_z_idx=2)
Set (all) coordinates of a particular point to the specified value.
PointCloudConstPtr input_
The input point cloud dataset.
shared_ptr< PointCloud< PointT > > Ptr
float deg2rad(float alpha)
Convert an angle from degrees to radians.
bool isFinite(const PointT &pt)
Tests if the 3D components of a point are all finite param[in] pt point to be tested return true if f...
std::vector<::pcl::PCLPointField > fields
std::vector< std::uint8_t > data
::pcl::PCLPointCloud2 cloud