Cgal - Point_set_3 object, functions fails to process?

Viewed 72

Currently trying to build upon the surface reconstruction tutorial and noticed a potential major issue in the tutorial which, in my experience do generalised outside of it: In the following tutorial: https://doc.cgal.org/latest/Manual/tuto_reconstruction.html (cgal 5.3), the author do some pre-processing before going into the mesh reconstruction, stuffs like outlier_removal, grid_simplify etc. However I noticed that no points are being removed during these steps. So I tried multiple parameters in the outlier_removal/grid_simplify and still, everytime, no points gets removed. However when working with a vector of point instead of a Point_set_3 object, I do manage to get points removed with the same parameters.

  1. Am I the only one who is unable to remove a point with outlier_removal/grid_simplify on a Point_set_3 object?
  2. If yes, can you show me an example how to make it work?
  3. If no, should I avoid using Point_set_3 objects? Or should I convert into a std::vector before doing the pre-processing steps? And how so?

Issue Details

The code runs fine. No errors.

Source Code

This code subset comes straight out of the tutorial. https://doc.cgal.org/latest/Manual/tuto_reconstruction.html

    #include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
    #include <CGAL/Point_set_3.h>
    #include <CGAL/Point_set_3/IO.h>
    #include <CGAL/remove_outliers.h>
    #include <CGAL/grid_simplify_point_set.h>
    #include <CGAL/jet_smooth_point_set.h>
    #include <CGAL/jet_estimate_normals.h>
    #include <CGAL/mst_orient_normals.h>
    #include <CGAL/poisson_surface_reconstruction.h>
    #include <CGAL/Advancing_front_surface_reconstruction.h>
    #include <CGAL/Scale_space_surface_reconstruction_3.h>
    #include <CGAL/Scale_space_reconstruction_3/Jet_smoother.h>
    #include <CGAL/Scale_space_reconstruction_3/Advancing_front_mesher.h>
    #include <CGAL/Surface_mesh.h>
    #include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>
    #include <cstdlib>
    #include <vector>
    #include <fstream>
    // types
    typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
    typedef Kernel::FT FT;
    typedef Kernel::Point_3 Point_3;
    typedef Kernel::Vector_3 Vector_3;
    typedef Kernel::Sphere_3 Sphere_3;
    typedef CGAL::Point_set_3<Point_3, Vector_3> Point_set;
    int main(int argc, char*argv[])
    {
      Point_set points;
      if (argc < 2)
      {
        std::cerr << "Usage: " << argv[0] << " [input.xyz/off/ply/las]" << std::endl;
        return EXIT_FAILURE;
      }
      const char* input_file = argv[1];
      std::ifstream stream (input_file, std::ios_base::binary);
      if (!stream)
      {
        std::cerr << "Error: cannot read file " << input_file << std::endl;
        return EXIT_FAILURE;
      }
      stream >> points;
      std::cout << "Read " << points.size () << " point(s)" << std::endl;
      if (points.empty())
        return EXIT_FAILURE;
      CGAL::remove_outliers<CGAL::Sequential_tag>
        (points,
         24, // Number of neighbors considered for evaluation
         points.parameters().threshold_percent (5.0)); // Percentage of points to remove
      std::cout << points.number_of_removed_points()
                << " point(s) are outliers." << std::endl;
      // Applying point set processing algorithm to a CGAL::Point_set_3
      // object does not erase the points from memory but place them in
      // the garbage of the object: memory can be freeed by the user.
      points.collect_garbage();
      // Compute average spacing using neighborhood of 6 points
      double spacing = CGAL::compute_average_spacing<CGAL::Sequential_tag> (points, 6);
      // Simplify using a grid of size 2 * average spacing
      CGAL::grid_simplify_point_set (points, 2. * spacing);
      std::cout << points.number_of_removed_points()
                << " point(s) removed after simplification." << std::endl;
      points.collect_garbage();
      CGAL::jet_smooth_point_set<CGAL::Sequential_tag> (points, 24);
      unsigned int reconstruction_choice
        = (argc < 3 ? 0 : atoi(argv[2]));
      if (reconstruction_choice == 0) // Poisson
      {
        CGAL::jet_estimate_normals<CGAL::Sequential_tag>
          (points, 24); // Use 24 neighbors
        // Orientation of normals, returns iterator to first unoriented point
        typename Point_set::iterator unoriented_points_begin =
          CGAL::mst_orient_normals(points, 24); // Use 24 neighbors
        points.remove (unoriented_points_begin, points.end());
    
    
      return EXIT_SUCCESS;
    }

Environment

I've replicated that issue in a debian VM as well as in a docker environment in macos (debian based as well). Pretty standard stuffs, I'm using the CMakeLists.txt already available in the tutorial_example.cpp folder and running:

Creates files that will show the compiler how to behave

 cmake -DCGAL_DIR=/app/cgal -DCMAKE_BUILD_TYPE=Release .

Build the exe

 make

I'm a self taught Python programmer so quite new to the C++ stuffs.

0 Answers
Related