Point Cloud Library (PCL)
1.14.1-dev
|
Grid projection surface reconstruction method. More...
#include <pcl/surface/grid_projection.h>
Classes | |
struct | Leaf |
Data leaf. More... | |
Public Types | |
using | Ptr = shared_ptr< GridProjection< PointNT > > |
using | ConstPtr = shared_ptr< const GridProjection< PointNT > > |
using | PointCloudPtr = typename pcl::PointCloud< PointNT >::Ptr |
using | KdTree = pcl::KdTree< PointNT > |
using | KdTreePtr = typename KdTree::Ptr |
using | HashMap = std::unordered_map< int, Leaf, std::hash< int >, std::equal_to<>, Eigen::aligned_allocator< std::pair< const int, Leaf > >> |
Public Types inherited from pcl::SurfaceReconstruction< PointNT > | |
using | Ptr = shared_ptr< SurfaceReconstruction< PointNT > > |
using | ConstPtr = shared_ptr< const SurfaceReconstruction< PointNT > > |
Public Types inherited from pcl::PCLSurfaceBase< PointInT > | |
using | Ptr = shared_ptr< PCLSurfaceBase< PointInT > > |
using | ConstPtr = shared_ptr< const PCLSurfaceBase< PointInT > > |
using | KdTree = pcl::search::Search< PointInT > |
using | KdTreePtr = typename KdTree::Ptr |
Public Types inherited from pcl::PCLBase< PointInT > | |
using | PointCloud = pcl::PointCloud< PointInT > |
using | PointCloudPtr = typename PointCloud::Ptr |
using | PointCloudConstPtr = typename PointCloud::ConstPtr |
using | PointIndicesPtr = PointIndices::Ptr |
using | PointIndicesConstPtr = PointIndices::ConstPtr |
Public Member Functions | |
GridProjection () | |
Constructor. More... | |
GridProjection (double in_resolution) | |
Constructor. More... | |
~GridProjection () override | |
Destructor. More... | |
void | setResolution (double resolution) |
Set the size of the grid cell. More... | |
double | getResolution () const |
void | setPaddingSize (int padding_size) |
When averaging the vectors, we find the union of all the input data points within the padding area,and do a weighted average. More... | |
int | getPaddingSize () const |
void | setNearestNeighborNum (int k) |
Set this only when using the k nearest neighbors search instead of finding the point union. More... | |
int | getNearestNeighborNum () const |
void | setMaxBinarySearchLevel (int max_binary_search_level) |
Binary search is used in projection. More... | |
int | getMaxBinarySearchLevel () const |
const HashMap & | getCellHashMap () const |
const std::vector< Eigen::Vector3f, Eigen::aligned_allocator< Eigen::Vector3f > > & | getVectorAtDataPoint () const |
const std::vector< Eigen::Vector4f, Eigen::aligned_allocator< Eigen::Vector4f > > & | getSurface () const |
Public Member Functions inherited from pcl::SurfaceReconstruction< PointNT > | |
SurfaceReconstruction ()=default | |
Constructor. More... | |
~SurfaceReconstruction () override=default | |
Destructor. More... | |
void | reconstruct (pcl::PolygonMesh &output) override |
Base method for surface reconstruction for all points given in <setInputCloud (), setIndices ()> More... | |
virtual void | reconstruct (pcl::PointCloud< PointNT > &points, std::vector< pcl::Vertices > &polygons) |
Base method for surface reconstruction for all points given in <setInputCloud (), setIndices ()> More... | |
Public Member Functions inherited from pcl::PCLSurfaceBase< PointInT > | |
PCLSurfaceBase () | |
Empty constructor. More... | |
~PCLSurfaceBase () override=default | |
Empty destructor. More... | |
void | setSearchMethod (const KdTreePtr &tree) |
Provide an optional pointer to a search object. More... | |
KdTreePtr | getSearchMethod () |
Get a pointer to the search method used. More... | |
Public Member Functions inherited from pcl::PCLBase< PointInT > | |
PCLBase () | |
Empty constructor. More... | |
PCLBase (const PCLBase &base) | |
Copy constructor. More... | |
virtual | ~PCLBase ()=default |
Destructor. More... | |
virtual void | setInputCloud (const PointCloudConstPtr &cloud) |
Provide a pointer to the input dataset. More... | |
PointCloudConstPtr const | getInputCloud () const |
Get a pointer to the input point cloud dataset. More... | |
virtual void | setIndices (const IndicesPtr &indices) |
Provide a pointer to the vector of indices that represents the input data. More... | |
virtual void | setIndices (const IndicesConstPtr &indices) |
Provide a pointer to the vector of indices that represents the input data. More... | |
virtual void | setIndices (const PointIndicesConstPtr &indices) |
Provide a pointer to the vector of indices that represents the input data. More... | |
virtual void | setIndices (std::size_t row_start, std::size_t col_start, std::size_t nb_rows, std::size_t nb_cols) |
Set the indices for the points laying within an interest region of the point cloud. More... | |
IndicesPtr | getIndices () |
Get a pointer to the vector of indices used. More... | |
IndicesConstPtr const | getIndices () const |
Get a pointer to the vector of indices used. More... | |
const PointInT & | operator[] (std::size_t pos) const |
Override PointCloud operator[] to shorten code. More... | |
Protected Member Functions | |
void | getBoundingBox () |
Get the bounding box for the input data points, also calculating the cell size, and the gaussian scale factor. More... | |
bool | reconstructPolygons (std::vector< pcl::Vertices > &polygons) |
The actual surface reconstruction method. More... | |
void | performReconstruction (pcl::PolygonMesh &output) override |
Create the surface. More... | |
void | performReconstruction (pcl::PointCloud< PointNT > &points, std::vector< pcl::Vertices > &polygons) override |
Create the surface. More... | |
void | scaleInputDataPoint (double scale_factor) |
When the input data points don't fill into the 1*1*1 box, scale them so that they can be filled in the unit box. More... | |
void | getCellIndex (const Eigen::Vector4f &p, Eigen::Vector3i &index) const |
Get the 3d index (x,y,z) of the cell based on the location of the cell. More... | |
void | getCellCenterFromIndex (const Eigen::Vector3i &index, Eigen::Vector4f ¢er) const |
Given the 3d index (x, y, z) of the cell, get the coordinates of the cell center. More... | |
void | getVertexFromCellCenter (const Eigen::Vector4f &cell_center, std::vector< Eigen::Vector4f, Eigen::aligned_allocator< Eigen::Vector4f > > &pts) const |
Given cell center, caluate the coordinates of the eight vertices of the cell. More... | |
int | getIndexIn1D (const Eigen::Vector3i &index) const |
Given an index (x, y, z) in 3d, translate it into the index in 1d. More... | |
void | getIndexIn3D (int index_1d, Eigen::Vector3i &index_3d) const |
Given an index in 1d, translate it into the index (x, y, z) in 3d. More... | |
void | fillPad (const Eigen::Vector3i &index) |
For a given 3d index of a cell, test whether the cells within its padding area exist in the hash table, if no, create an entry for that cell. More... | |
void | getDataPtsUnion (const Eigen::Vector3i &index, pcl::Indices &pt_union_indices) |
Obtain the index of a cell and the pad size. More... | |
void | createSurfaceForCell (const Eigen::Vector3i &index, pcl::Indices &pt_union_indices) |
Given the index of a cell, exam it's up, left, front edges, and add the vertices to m_surface list.the up, left, front edges only share 4 points, we first get the vectors at these 4 points and exam whether those three edges are intersected by the surface. More... | |
void | getProjection (const Eigen::Vector4f &p, pcl::Indices &pt_union_indices, Eigen::Vector4f &projection) |
Given the coordinates of one point, project it onto the surface, return the projected point. More... | |
void | getProjectionWithPlaneFit (const Eigen::Vector4f &p, pcl::Indices &pt_union_indices, Eigen::Vector4f &projection) |
Given the coordinates of one point, project it onto the surface, return the projected point. More... | |
void | getVectorAtPoint (const Eigen::Vector4f &p, pcl::Indices &pt_union_indices, Eigen::Vector3f &vo) |
Given the location of a point, get it's vector. More... | |
void | getVectorAtPointKNN (const Eigen::Vector4f &p, pcl::Indices &k_indices, std::vector< float > &k_squared_distances, Eigen::Vector3f &vo) |
Given the location of a point, get it's vector. More... | |
double | getMagAtPoint (const Eigen::Vector4f &p, const pcl::Indices &pt_union_indices) |
Get the magnitude of the vector by summing up the distance. More... | |
double | getD1AtPoint (const Eigen::Vector4f &p, const Eigen::Vector3f &vec, const pcl::Indices &pt_union_indices) |
Get the 1st derivative. More... | |
double | getD2AtPoint (const Eigen::Vector4f &p, const Eigen::Vector3f &vec, const pcl::Indices &pt_union_indices) |
Get the 2nd derivative. More... | |
bool | isIntersected (const std::vector< Eigen::Vector4f, Eigen::aligned_allocator< Eigen::Vector4f > > &end_pts, std::vector< Eigen::Vector3f, Eigen::aligned_allocator< Eigen::Vector3f > > &vect_at_end_pts, pcl::Indices &pt_union_indices) |
Test whether the edge is intersected by the surface by doing the dot product of the vector at two end points. More... | |
void | findIntersection (int level, const std::vector< Eigen::Vector4f, Eigen::aligned_allocator< Eigen::Vector4f > > &end_pts, const std::vector< Eigen::Vector3f, Eigen::aligned_allocator< Eigen::Vector3f > > &vect_at_end_pts, const Eigen::Vector4f &start_pt, pcl::Indices &pt_union_indices, Eigen::Vector4f &intersection) |
Find point where the edge intersects the surface. More... | |
void | storeVectAndSurfacePoint (int index_1d, const Eigen::Vector3i &index_3d, pcl::Indices &pt_union_indices, const Leaf &cell_data) |
Go through all the entries in the hash table and update the cellData. More... | |
void | storeVectAndSurfacePointKNN (int index_1d, const Eigen::Vector3i &index_3d, const Leaf &cell_data) |
Go through all the entries in the hash table and update the cellData. More... | |
Protected Member Functions inherited from pcl::PCLBase< PointInT > | |
bool | initCompute () |
This method should get called before starting the actual computation. More... | |
bool | deinitCompute () |
This method should get called after finishing the actual computation. More... | |
Additional Inherited Members | |
Protected Attributes inherited from pcl::SurfaceReconstruction< PointNT > | |
bool | check_tree_ |
A flag specifying whether or not the derived reconstruction algorithm needs the search object tree. More... | |
Protected Attributes inherited from pcl::PCLSurfaceBase< PointInT > | |
KdTreePtr | tree_ |
A pointer to the spatial search object. More... | |
Protected Attributes inherited from pcl::PCLBase< PointInT > | |
PointCloudConstPtr | input_ |
The input point cloud dataset. More... | |
IndicesPtr | indices_ |
A pointer to the vector of point indices to use. More... | |
bool | use_indices_ |
Set to true if point indices are used. More... | |
bool | fake_indices_ |
If no set of indices are given, we construct a set of fake indices that mimic the input PointCloud. More... | |
Grid projection surface reconstruction method.
Definition at line 75 of file grid_projection.h.
using pcl::GridProjection< PointNT >::ConstPtr = shared_ptr<const GridProjection<PointNT> > |
Definition at line 79 of file grid_projection.h.
using pcl::GridProjection< PointNT >::HashMap = std::unordered_map<int, Leaf, std::hash<int>, std::equal_to<>, Eigen::aligned_allocator<std::pair<const int, Leaf> >> |
Definition at line 99 of file grid_projection.h.
using pcl::GridProjection< PointNT >::KdTree = pcl::KdTree<PointNT> |
Definition at line 86 of file grid_projection.h.
using pcl::GridProjection< PointNT >::KdTreePtr = typename KdTree::Ptr |
Definition at line 87 of file grid_projection.h.
using pcl::GridProjection< PointNT >::PointCloudPtr = typename pcl::PointCloud<PointNT>::Ptr |
Definition at line 84 of file grid_projection.h.
using pcl::GridProjection< PointNT >::Ptr = shared_ptr<GridProjection<PointNT> > |
Definition at line 78 of file grid_projection.h.
pcl::GridProjection< PointNT >::GridProjection |
Constructor.
Definition at line 49 of file grid_projection.hpp.
pcl::GridProjection< PointNT >::GridProjection | ( | double | in_resolution | ) |
Constructor.
in_resolution | set the resolution of the grid |
Definition at line 56 of file grid_projection.hpp.
|
override |
Destructor.
Definition at line 63 of file grid_projection.hpp.
|
protected |
Given the index of a cell, exam it's up, left, front edges, and add the vertices to m_surface list.the up, left, front edges only share 4 points, we first get the vectors at these 4 points and exam whether those three edges are intersected by the surface.
index | the input index |
pt_union_indices | the union of input data points within the cell and padding cells |
Definition at line 174 of file grid_projection.hpp.
References pcl::I_SHIFT_EDGE, and pcl::I_SHIFT_PT.
|
protected |
For a given 3d index of a cell, test whether the cells within its padding area exist in the hash table, if no, create an entry for that cell.
index | the index of the cell in (x,y,z) format |
Definition at line 555 of file grid_projection.hpp.
|
protected |
Find point where the edge intersects the surface.
level | binary search level |
end_pts | the two end points on the edge |
vect_at_end_pts | the vectors at the two end points |
start_pt | the starting point we use for binary search |
pt_union_indices | the union of input data points within the cell and padding cells |
intersection | the resultant intersection point |
Definition at line 507 of file grid_projection.hpp.
|
protected |
Get the bounding box for the input data points, also calculating the cell size, and the gaussian scale factor.
Definition at line 87 of file grid_projection.hpp.
References pcl::getMinMax3D().
|
inlineprotected |
Given the 3d index (x, y, z) of the cell, get the coordinates of the cell center.
index | the output 3d index |
center | the resultant cell center |
Definition at line 261 of file grid_projection.h.
|
inline |
Definition at line 179 of file grid_projection.h.
|
inlineprotected |
Get the 3d index (x,y,z) of the cell based on the location of the cell.
p | the coordinate of the input point |
index | the output 3d index |
Definition at line 249 of file grid_projection.h.
|
protected |
Get the 1st derivative.
p | the coordinate of the input point |
vec | the vector at point p |
pt_union_indices | the union of input data points within the cell and padding cells |
Definition at line 446 of file grid_projection.hpp.
|
protected |
Get the 2nd derivative.
p | the coordinate of the input point |
vec | the vector at point p |
pt_union_indices | the union of input data points within the cell and padding cells |
Definition at line 459 of file grid_projection.hpp.
|
protected |
Obtain the index of a cell and the pad size.
index | the input index |
pt_union_indices | the union of input data points within the cell and padding cells |
Definition at line 148 of file grid_projection.hpp.
|
inlineprotected |
Given an index (x, y, z) in 3d, translate it into the index in 1d.
index | the index of the cell in (x,y,z) 3d format |
Definition at line 283 of file grid_projection.h.
|
inlineprotected |
Given an index in 1d, translate it into the index (x, y, z) in 3d.
index_1d | the input 1d index |
index_3d | the output 3d index |
Definition at line 296 of file grid_projection.h.
|
protected |
Get the magnitude of the vector by summing up the distance.
p | the coordinate of the input point |
pt_union_indices | the union of input data points within the cell and padding cells |
Definition at line 430 of file grid_projection.hpp.
References M_E.
|
inline |
Definition at line 172 of file grid_projection.h.
|
inline |
Definition at line 157 of file grid_projection.h.
|
inline |
Definition at line 142 of file grid_projection.h.
|
protected |
Given the coordinates of one point, project it onto the surface, return the projected point.
Do a binary search between p and p+projection_distance to find the projected point
p | the coordinates of the input point |
pt_union_indices | the union of input data points within the cell and padding cells |
projection | the resultant point projected |
Definition at line 273 of file grid_projection.hpp.
|
protected |
Given the coordinates of one point, project it onto the surface, return the projected point.
Find the plane which fits all the points in pt_union_indices, projected p to the plane to get the projected point.
p | the coordinates of the input point |
pt_union_indices | the union of input data points within the cell and padding cells |
projection | the resultant point projected |
Definition at line 312 of file grid_projection.hpp.
References pcl::computeMeanAndCovarianceMatrix(), pcl::geometry::distance(), and pcl::eigen33().
|
inline |
Definition at line 122 of file grid_projection.h.
|
inline |
Definition at line 191 of file grid_projection.h.
|
inline |
Definition at line 185 of file grid_projection.h.
|
protected |
Given the location of a point, get it's vector.
p | the coordinates of the input point |
pt_union_indices | the union of input data points within the cell and padding cells |
vo | the resultant vector |
Definition at line 351 of file grid_projection.hpp.
References pcl::VectorAverage< real, dimension >::add(), pcl::VectorAverage< real, dimension >::getMean(), and M_E.
|
protected |
Given the location of a point, get it's vector.
p | the coordinates of the input point |
k_indices | the k nearest neighbors of the query point |
k_squared_distances | the squared distances of the k nearest neighbors to the query point |
vo | the resultant vector |
Definition at line 396 of file grid_projection.hpp.
References pcl::VectorAverage< real, dimension >::add(), pcl::VectorAverage< real, dimension >::getEigenVector1(), and M_E.
|
protected |
Given cell center, caluate the coordinates of the eight vertices of the cell.
cell_center | the coordinates of the cell center |
pts | the coordinates of the 8 vertices |
Definition at line 128 of file grid_projection.hpp.
|
protected |
Test whether the edge is intersected by the surface by doing the dot product of the vector at two end points.
Also test whether the edge is intersected by the maximum surface by examining the 2nd derivative of the intersection point
end_pts | the two points of the edge |
vect_at_end_pts | |
pt_union_indices | the union of input data points within the cell and padding cells |
Definition at line 472 of file grid_projection.hpp.
|
overrideprotectedvirtual |
Create the surface.
The 1st step is filling the padding, so that all the cells in the padding area are in the hash map. The 2nd step is store the vector, and projected point. The 3rd step is finding all the edges intersects the surface, and creating surface.
[out] | points | the resultant points lying on the surface |
[out] | polygons | the resultant polygons, as a set of vertices. The Vertices structure contains an array of point indices. |
Implements pcl::SurfaceReconstruction< PointNT >.
Definition at line 747 of file grid_projection.hpp.
References pcl::PointCloud< PointT >::header, pcl::PointCloud< PointT >::height, pcl::PointCloud< PointT >::is_dense, pcl::PointCloud< PointT >::resize(), pcl::PointCloud< PointT >::size(), and pcl::PointCloud< PointT >::width.
|
overrideprotectedvirtual |
Create the surface.
The 1st step is filling the padding, so that all the cells in the padding area are in the hash map. The 2nd step is store the vector, and projected point. The 3rd step is finding all the edges intersects the surface, and creating surface.
[out] | output | the resultant polygonal mesh |
Implements pcl::SurfaceReconstruction< PointNT >.
Definition at line 721 of file grid_projection.hpp.
References pcl::PolygonMesh::cloud, pcl::PolygonMesh::header, pcl::PointCloud< PointT >::height, pcl::PointCloud< PointT >::is_dense, pcl::PolygonMesh::polygons, pcl::PointCloud< PointT >::resize(), pcl::PointCloud< PointT >::size(), pcl::toPCLPointCloud2(), and pcl::PointCloud< PointT >::width.
|
protected |
The actual surface reconstruction method.
[out] | polygons | the resultant polygons, as a set of vertices. The Vertices structure contains an array of point indices. |
Definition at line 619 of file grid_projection.hpp.
References pcl::GridProjection< PointNT >::Leaf::data_indices, pcl::GridProjection< PointNT >::Leaf::pt_on_surface, and pcl::Vertices::vertices.
|
protected |
When the input data points don't fill into the 1*1*1 box, scale them so that they can be filled in the unit box.
Otherwise, it will be some drawing problem when doing visualization
scale_factor | scale all the input data point by scale_factor |
Definition at line 74 of file grid_projection.hpp.
|
inline |
Binary search is used in projection.
given a point x, we find another point which is 3*cell_size_ far away from x. Then we do a binary search between these two points to find where the projected point should be.
Definition at line 167 of file grid_projection.h.
|
inline |
Set this only when using the k nearest neighbors search instead of finding the point union.
k | The number of nearest neighbors we are looking for |
Definition at line 152 of file grid_projection.h.
|
inline |
When averaging the vectors, we find the union of all the input data points within the padding area,and do a weighted average.
Say if the padding size is 1, when we process cell (x,y,z), we will find union of input data points from (x-1) to (x+1), (y-1) to (y+1), (z-1) to (z+1)(in total, 27 cells). In this way, even the cells itself doesn't contain any data points, we will still process it because there are data points in the padding area. This can help us fix holes which is smaller than the padding size.
padding_size | The num of padding cells we want to create |
Definition at line 137 of file grid_projection.h.
|
inline |
Set the size of the grid cell.
resolution | the size of the grid cell |
Definition at line 116 of file grid_projection.h.
|
protected |
Go through all the entries in the hash table and update the cellData.
When creating the hash table, the pt_on_surface field store the center point of the cell.After calling this function, the projection operator will project the center point onto the surface, and the pt_on_surface field will be updated using the projected point.Also the vect_at_grid_pt field will be updated using the vector at the upper left front vertex of the cell.
index_1d | the index of the cell after flatting it's 3d index into a 1d array |
index_3d | the index of the cell in (x,y,z) 3d format |
pt_union_indices | the union of input data points within the cell and pads |
cell_data | information stored in the cell |
Definition at line 578 of file grid_projection.hpp.
References pcl::GridProjection< PointNT >::Leaf::pt_on_surface.
|
protected |
Go through all the entries in the hash table and update the cellData.
When creating the hash table, the pt_on_surface field store the center point of the cell.After calling this function, the projection operator will project the center point onto the surface, and the pt_on_surface field will be updated using the projected point.Also the vect_at_grid_pt field will be updated using the vector at the upper left front vertex of the cell. When projecting the point and calculating the vector, using K nearest neighbors instead of using the union of input data point within the cell and pads.
index_1d | the index of the cell after flatting it's 3d index into a 1d array |
index_3d | the index of the cell in (x,y,z) 3d format |
cell_data | information stored in the cell |
Definition at line 596 of file grid_projection.hpp.
References pcl::GridProjection< PointNT >::Leaf::pt_on_surface.