CGAL 计算点云平均密度

本文介绍了如何使用CGAL库中的compute_average_spacing函数计算点云的平均密度。通过示例展示了两种不同的代码实现,一种是基本版本,另一种考虑了并发处理。在示例中,点云数据从XYZ文件读取,平均密度对于理解和调整三维重建参数至关重要。
摘要由CSDN通过智能技术生成

一、主要函数

头文件

#include <CGAL/compute_average_spacing.h>

函数

FT CGAL::compute_average_spacing  ( const PointRange &  points,  
  unsigned int  k,  
  const NamedParameters &  np = parameters::default_values()  
 ) 
  • points:输入点云
  • k:邻域点数,k需要大于2。
      函数compute_average_spacing()计算所有输入点到它们的k个最近邻点的平均间距,k由用户指定。该函数提供了一个点集密度的阶数,用于曲面重构管道的下游,自动确定曲面重构的输出网格尺寸等参数。

二、代码实现

1、版本一

#include <vector>
#include <CGAL/Point_set_3.h>
#include <CGAL/Point_set_3/IO.h>
#include <CGAL/compute_average_spacing.h> // 计算平均密度

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;


int main()
{
	CGAL::Point_set_3<Kernel::Point_3> point_set;		//创建一个三维点云容器
	if (!CGAL::IO::read_XYZ("cgal//kitten.xyz", point_set))
	{
		std::cerr << "点云读取失败\n" << std::endl;
		return -1;
	}
	std::cout << "加载点云的点数:" << point_set.size() << std::endl;

	int k = 6; // 进行密度计算的邻域点数
	double spacing = CGAL::compute_average_spacing<CGAL::Sequential_tag>(point_set, k);

	std::cout << "点云的平均密度为:" << spacing << std::endl;

	return 0;
}

2、版本二

#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/compute_average_spacing.h>
#include <CGAL/IO/read_points.h>

#include <vector>
#include <fstream>
#include <boost/tuple/tuple.hpp>

// Types
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::FT FT;
typedef Kernel::Point_3 Point;

// Data type := index, followed by the point, followed by three integers that
// define the Red Green Blue color of the point.
typedef boost::tuple<int, Point, int, int, int> IndexedPointWithColorTuple;

// Concurrency
typedef CGAL::Parallel_if_available_tag Concurrency_tag;

int main(int argc, char* argv[])
{
	const std::string fname = (argc > 1) ? argv[1] : CGAL::data_file_path("points_3/sphere_20k.xyz");

	// Reads a file in points.
	// As the point is the second element of the tuple (that is with index 1)
	// we use a property map that accesses the 1st element of the tuple.

	std::vector<IndexedPointWithColorTuple> points;
	if (!CGAL::IO::read_points(fname, std::back_inserter(points),
		CGAL::parameters::point_map(CGAL::Nth_of_tuple_property_map<1, IndexedPointWithColorTuple>())))
	{
		std::cerr << "Error: cannot read file " << fname << std::endl;
		return EXIT_FAILURE;
	}

	// Initialize index and RGB color fields in tuple.
	// As the index and RGB color are respectively the first and third-fifth elements
	// of the tuple we use a get function from the property map that accesses the 0
	// and 2-4th elements of the tuple.
	for (unsigned int i = 0; i < points.size(); i++)
	{
		points[i].get<0>() = i; // set index value of tuple to i

		points[i].get<2>() = 0; // set RGB color to black
		points[i].get<3>() = 0;
		points[i].get<4>() = 0;
	}

	// Computes average spacing.
	const unsigned int nb_neighbors = 6; // 1 ring
	FT average_spacing = CGAL::compute_average_spacing<Concurrency_tag>(
		points, nb_neighbors,
		CGAL::parameters::point_map(CGAL::Nth_of_tuple_property_map<1, IndexedPointWithColorTuple>()));

	std::cout << "Average spacing: " << average_spacing << std::endl;

	return EXIT_SUCCESS;
}

三、结果展示

加载点云的点数:5210
点云的平均密度为:0.0168572
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值