计算点云面积时,cloud compare采取的策略是将点云网格化,然后计算网格面积。这样构网的情况往往会影响到后续面积的计算精度。这里采取了一种凹包面积计算的策略。主要步骤包括:
1、将点云旋转至与z轴相垂直的平面
2、计算旋转后点云的凹多边形边界点
3、利用cgal库计算凹多边形面积
这里采用了cgal中Polygon::area()算法,仅接受二维点输入。
原始点云
旋转后点云
凹包点
计算结果
#pragma warning(disable : 4996)
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/IO/read_ply_points.h>
#include <CGAL/Plane_3.h>
#include <CGAL/Polygon_2.h>
#include <CGAL/convex_hull_2.h>
#include <CGAL/Convex_hull_traits_adapter_2.h>
#include <pcl/surface/concave_hull.h>
#include <pcl/io/pcd_io.h>
#include <stdlib.h>
#include <fstream>
using namespace pcl;
using namespace std;
// types
typedef CGAL::Exact_predicates_inexact_constructions_kernel myKernel;
typedef myKernel::FT FT;
typedef myKernel::Point_3 Point3;
typedef myKernel::Point_2 Point2;
typedef myKernel::Plane_3 Plane;
typedef Eigen::Vector3d Normal_vec;
typedef CGAL::Polygon_2<myKernel> Polygon_2;
bool Read_data(std::string filepath, std::vector<Point3> &points)
{
ifstream in(filepath, ios_base::binary);
if (!in ||
!CGAL::read_ply_points(in,
std::back_inserter(points))
)
{
std::cerr << "Error: cannot read fi