23#ifndef VCL_ALGORITHMS_CORE_FITTING_H
24#define VCL_ALGORITHMS_CORE_FITTING_H
28#include <vclib/space/core/plane.h>
30#include <Eigen/Eigenvalues>
38template<
typename Scalar>
39Plane<Scalar> fitPlaneToPointCloud(
const std::vector<Point3<Scalar>>& pointVec)
41 Matrix33<Scalar> covMat = covarianceMatrixOfPointCloud(pointVec);
42 Point3<Scalar> b = polygonBarycenter(pointVec.begin(), pointVec.end());
44 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, 3, 3>> eig(covMat);
46 Eigen::Matrix<Scalar, 3, 1> eval = eig.eigenvalues();
47 Eigen::Matrix<Scalar, 3, 3> evec = eig.eigenvectors();
49 eval = eval.cwiseAbs();
51 eval.minCoeff(&minInd);
53 d[0] = evec(0, minInd);
54 d[1] = evec(1, minInd);
55 d[2] = evec(2, minInd);
57 return Plane<Scalar>(b, d);
64template<Po
int3Concept Po
intType>
65Plane<typename PointType::ScalarType> fitPlaneToWeightedPointCloud(
66 const std::vector<PointType>& pointVec,
67 const std::vector<typename PointType::ScalarType>& weights)
69 using Scalar =
typename PointType::ScalarType;
71 Matrix33<Scalar> covMat =
72 weightedCovarianceMatrixOfPointCloud(pointVec, weights);
76 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar, 3, 3>> eig(covMat);
78 Eigen::Matrix<Scalar, 3, 1> eval = eig.eigenvalues();
79 Eigen::Matrix<Scalar, 3, 3> evec = eig.eigenvectors();
81 eval = eval.cwiseAbs();
83 eval.minCoeff(&minInd);
85 d[0] = evec(0, minInd);
86 d[1] = evec(1, minInd);
87 d[2] = evec(2, minInd);
89 return Plane<Scalar>(b, d);
PointT weightedBarycenter(WIterator wBegin) const
Computes the weighted barycenter of the polygon.
Definition polygon.h:218