David Doria, “A Point Set Processing Toolkit for VTK“. The VTK Journal, December 2009
In the last several years, an increasing number of tools produce 3D points as output. Examples include Light Detection and Ranging (LiDAR) scanners, Structure From Motion (SFM) algorithms, and Multi View Stereo (MVS) algorithms. These unordered point sets (or point “clouds”) are typically provided simply as a list of 3D coordinates. There are many factors in all of these processes that lead to many of the points that are provided being “outliers”. That is, several points do not seem to actually come from the surface that we expect. This will severely corrupt the results of many algorithms on this type of data. To remove outliers, we provide vtkOutlierRemoval. By definition, point sets do not contain any connectivity information. This makes it impossible to apply many algorithms for 3D data processing. At the very least, point normals at each point are required. That is, if there was a surface through the points, what would the normal of the surface be evaluated at the points in the point set? The vtkPointSetNormalEstimation class performs this estimation. The algorithm we use to compute these normals has no concept of “inside” and “outside” of the object, so the orientation of the normals from point to point my not be consistent. As many algorithms rely on this orientation, we must attempt to correct the normals so they are consistently oriented. This is the role of vtkPointSetNormalOrientation. Necessary for the orientation algorithm are two graph algorithm implementations, vtkEuclideanMinimumSpanningTree and vtkRiemannianGraphFilter. An estimate of the curvature of a point set is often a valuable tool. While the exact values of well defined mathematic quantities can be computed on a mesh, since we do not have connectivity information in a point set, an estimate will have to suffice. We provide vtkPointSetCurvatureEstimation to compute a heuristic idea of curvature at each point. This set of classes provides these basic functionalities as well as a basis for further point set and surface processing algorithms for VTK.
Dear David,
I try to use PoissonReconstruction algorithm but I have a problem. I notice that for having a correct output my point cloud needs also the normals, but I haven-t got, I had only the points 🙁
Do you know some workaround for creating the normals?
thank you very much
daniele
Daniele,
There is a class in the Point Set Processing Toolkit called vtkPointSetNormalEstimation that does exactly what you need – it estimates normals from a point set.
Hope that helps,
David
Hello David,
I want to reconstruct a surface from a set of points acquired using a tracked light detection scanner (only x,y,z coordinates). Have I understood you correctly: That the way of doing it is by calling vtkPointSetNormalEstimation, then vtkPointSetNormalOrientation, and finally vtkPoissonReconstruction? Like this:
vtkSmartPointer normalEstimation = vtkSmartPointer::New();
normalEstimation->SetInputData(points);
vtkSmartPointer normalOrientationFilter = vtkSmartPointer::New();
normalOrientationFilter->SetInputConnection(normalEstimation->GetOutputPort());
normalOrientationFilter->SetKNearestNeighbors(10);
vtkSmartPointer poissonFilter = vtkSmartPointer::New();
poissonFilter->SetDepth(depth);
poissonFilter->SetInputConnection(normalOrientationFilter->GetOutputPort());
poissonFilter->Update();
Thank you very much!
Mikael
Hi Mikael,
That is correct. Let me know if you have any more questions.
David
Thank you for the fast reply!
I have one question: Is it not possible to build .libs from the PointSetProcessing repo? Or maybe I am doing something wrong? Do I need to add that myself to the CMakeList.txt file?