CloudCompare——基于八叉树的点云下采样

一、八叉树采样(1)

1.功能概述

   'octree'模式需要选择八叉树的细分级别,点云将在该细分级别内“简化”——在八叉树的每个体素单元中,保留距八叉树单元中心最近的点。

2.软件实现

1、找到采样滤波的功能
在这里插入图片描述
2、选择八叉树采样并设置相关参数
在这里插入图片描述

  • subbdivision level:八叉树层级,级别越高,体素越小,保留点越多。
  • 在32位版本的CloudCompare中,八叉树最大层级为10,在64位版本中为21。
  • 该下采样方法是用八叉树体素中心的最近邻点代替该体素单元格内所有的点。

3.结果展示

采样前
在这里插入图片描述
采样后
在这里插入图片描述

二、八叉树采样(2)

1.算法原理

   'Resample'模式需要选择八叉树的细分级别,可以实现将点云在该细分级别内下采样——在八叉树的每个体素单元中,保留八叉树单元的中心点。

2.软件实现

1、找到八叉树重采样功能
在这里插入图片描述
2、设置采样点个数
在这里插入图片描述

  • 设置采样点的个数
    此方法创建一个新的点云,其中的点不一定与输入点云中的点在空间中的位置相同。因此,不可能将输入点云的各种特征(颜色、法线、标量值等)附加到输出点上。(所以采样后为纯白色)

3.结果展示

采样前
在这里插入图片描述
采样后
在这里插入图片描述

三、算法源码

void MainWindow::doActionResampleWithOctree()
{
	bool ok;
	int pointCount = QInputDialog::getInt(this,"Resample with octree", "Points (approx.)", 1000000, 1, INT_MAX, 100000, &ok);
	if (!ok)
		return;

	ccProgressDialog pDlg(false, this);
	pDlg.setAutoClose(false);

	assert(pointCount > 0);
	unsigned aimedPoints = static_cast<unsigned>(pointCount);

	bool errors = false;

	for ( ccHObject *entity : getSelectedEntities() )
	{
		ccPointCloud* cloud = nullptr;

		/*if (ent->isKindOf(CC_TYPES::MESH)) //TODO
			cloud = ccHObjectCaster::ToGenericMesh(ent)->getAssociatedCloud();
		else */
		if (entity->isKindOf(CC_TYPES::POINT_CLOUD))
		{
			cloud = static_cast<ccPointCloud*>(entity);
		}

		if (cloud)
		{
			ccOctree::Shared octree = cloud->getOctree();
			if (!octree)
			{
				octree = cloud->computeOctree(&pDlg);
				if (!octree)
				{
					ccConsole::Error(QString("Could not compute octree for cloud '%1'").arg(cloud->getName()));
					continue;
				}
			}

			cloud->setEnabled(false);
			QElapsedTimer eTimer;
			eTimer.start();
			CCLib::GenericIndexedCloud* result = CCLib::CloudSamplingTools::resampleCloudWithOctree
			(
				cloud,
				aimedPoints,
				CCLib::CloudSamplingTools::CELL_GRAVITY_CENTER,
				&pDlg,
				octree.data()
			);

			if (result)
			{
				ccConsole::Print("[ResampleWithOctree] Timing: %3.2f s.", eTimer.elapsed() / 1.0e3);
				ccPointCloud* newCloud = ccPointCloud::From(result, cloud);

				delete result;
				result = nullptr;

				if (newCloud)
				{
					addToDB(newCloud);
					newCloud->setDisplay(cloud->getDisplay());
					newCloud->prepareDisplayForRefresh();
				}
				else
				{
					errors = true;
				}
			}
		}
	}

	if (errors)
		ccLog::Error("[ResampleWithOctree] Errors occurred during the process! Result may be incomplete!");

	refreshAll();
}

四、相关代码

[1] PCL 基于八叉树的体素滤波

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Three.js是一款基于WebGL的JavaScript 3D库,它提供了许多用于创建和渲染3D场景的工具和功能。而多分辨率八叉树是一种用于管理3D点云数据的数据结构,可以在不同的分辨率下快速访问和渲染点云数据。 在Three.js中,可以使用Potree库来实现多分辨率八叉树点云的加载和渲染。Potree库提供了一种方便的方法来加载点云数据,并自动将其转换为多分辨率八叉树表示。同时,它还提供了一些用于控制点云渲染和交互的工具和功能。 要加载点云数据,可以使用Potree.loadPointCloud()函数。例如: ```javascript Potree.loadPointCloud('path/to/pointcloud/', 'metadata.json', function(geometry, material) { var pointcloud = new Potree.PointCloudOctree(geometry, material); scene.add(pointcloud); }); ``` 这个函数会加载点云数据,并在加载完成后调用一个回调函数。在回调函数中,可以将点云数据转换为PointcloudOctree对象,并将其添加到场景中。 要控制点云的渲染和交互,可以使用Potree.Viewer类。例如: ```javascript var viewer = new Potree.Viewer(document.getElementById('potree_render_area')); viewer.setPointCloud(pointcloud); viewer.setEDLEnabled(true); ``` 这个代码创建了一个Potree.Viewer对象,并将其与先前加载的PointcloudOctree对象关联起来。它还启用了EDL(增强深度线)效果,以提高点云的可视性。 总的来说,使用Three.js和Potree库可以轻松地实现多分辨率八叉树点云的加载和渲染。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云侠

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

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

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

打赏作者

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

抵扣说明:

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

余额充值