6#include "reusex/core/logging.hpp"
8#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
9#include <CGAL/Shape_regularization/regularize_planes.h>
10#include <CGAL/property_map.h>
12#include <pcl/common/common.h>
13#include <pcl/point_cloud.h>
14#include <pcl/point_types.h>
15#include <range/v3/to_container.hpp>
16#include <range/v3/view/transform.hpp>
20template <
typename Kernel,
typename Scalar>
struct plane_map {
23 Eigen::Matrix<Scalar, 4, 1>;
29 boost::readable_property_map_tag;
31 using FT =
typename Kernel::FT;
41 p(0) =
static_cast<Scalar
>(CGAL::to_double(val.a()));
42 p(1) =
static_cast<Scalar
>(CGAL::to_double(val.b()));
43 p(2) =
static_cast<Scalar
>(CGAL::to_double(val.c()));
44 p(3) =
static_cast<Scalar
>(CGAL::to_double(val.d()));
48template <
typename Kernel,
typename Po
intT>
struct point_map {
53 using category = boost::readable_property_map_tag;
63 pt.x =
static_cast<typename PointT::ScalarType
>(CGAL::to_double(val.x()));
64 pt.y =
static_cast<typename PointT::ScalarType
>(CGAL::to_double(val.y()));
65 pt.z =
static_cast<typename PointT::ScalarType
>(CGAL::to_double(val.z()));
70template <
typename Scalar>
using Plane = Eigen::Matrix<Scalar, 4, 1>;
72template <
typename Scalar>
74 std::vector<Plane<Scalar>, Eigen::aligned_allocator<Plane<Scalar>>>;
76template <
typename Scalar,
typename Po
intT>
78 typename pcl::PointCloud<PointT>::ConstPtr points,
79 std::vector<pcl::IndicesPtr> &inliers,
80 double angle_threshold = 25.0,
81 double distance_threshold = 0.01) {
83 "Regularizing planes with threshold: {} degrees and {} distance",
84 angle_threshold, distance_threshold);
86 using Kernel = CGAL::Exact_predicates_inexact_constructions_kernel;
87 using FT =
typename Kernel::FT;
89 std::vector<int> point_plane_index(points->size(), -1);
90 for (
size_t i = 0; i < inliers.size(); ++i) {
91 for (
const auto &idx : *(inliers[i])) {
92 point_plane_index[idx] =
static_cast<int>(i);
96 CGAL::Shape_regularization::Planes::regularize_planes(
98 CGAL::Random_access_property_map(
105 FT(distance_threshold));
std::vector< Plane< Scalar >, Eigen::aligned_allocator< Plane< Scalar > > > PlaneVector
Eigen::Matrix< Scalar, 4, 1 > Plane
auto regularizePlanes(PlaneVector< Scalar > &planes, typename pcl::PointCloud< PointT >::ConstPtr points, std::vector< pcl::IndicesPtr > &inliers, double angle_threshold=25.0, double distance_threshold=0.01)
Eigen::Matrix< Scalar, 4, 1 > key_type
typename Kernel::Plane_3 value_type
friend value_type get(const plane_map &, const key_type &p)
friend void put(const plane_map &, key_type &p, const value_type &val)
value_type operator[](const key_type &p) const
boost::readable_property_map_tag category
friend void put(const point_map &, key_type &pt, const value_type &val)
boost::readable_property_map_tag category
friend value_type get(const point_map &, const key_type &pt)
typename Kernel::Point_3 value_type
value_type operator[](const key_type &pt) const