[python][pcl]python-pcl案例之基于多项式重构的平滑和正态估计重采样

该代码示例演示了如何在Python中利用PCL库(版本1.12.1)对点云数据进行移动最小二乘(MLS)平滑处理并估计法向量。首先加载bun0.pcd文件,然后创建KD-Tree以便搜索,接着设置MLS参数如搜索半径,并执行处理。最后,保存处理后的点云数据到bun0-mls.pcd文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境:

pcl==1.12.1

python-pcl==0.3.1

python==3.7

代码:

# -*- coding: utf-8 -*-
# Smoothing and normal estimation based on polynomial reconstruction
# http://pointclouds.org/documentation/tutorials/resampling.php#moving-least-squares

import numpy as np
import pcl
import random


def main():
    # // Load input file into a PointCloud<T> with an appropriate type
    # pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
    # // Load bun0.pcd -- should be available with the PCL archive in test
    # pcl::io::loadPCDFile ("bun0.pcd", *cloud);
    cloud = pcl.load('bun0.pcd')
    print('cloud(size) = ' + str(cloud.size))

    # // Create a KD-Tree
    # pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
    tree = cloud.make_kdtree()
    # tree = cloud.make_kdtree_flann()
    # blankCloud = pcl.PointCloud()
    # tree = blankCloud.make_kdtree()

    # // Output has the PointNormal type in order to store the normals calculated by MLS
    # pcl::PointCloud<pcl::PointNormal> mls_points;
    # mls_points = pcl.PointCloudNormal()
    # // Init object (second point type is for the normals, even if unused)
    # pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
    # mls.setComputeNormals (true);
    #
    # // Set parameters
    # mls.setInputCloud (cloud);
    # mls.setPolynomialFit (true);
    # mls.setSearchMethod (tree);
    # mls.setSearchRadius (0.03);
    #
    # // Reconstruct
    # mls.process (mls_points);
    mls = cloud.make_moving_least_squares()
    # print('make_moving_least_squares')
    mls.set_Compute_Normals(True)
    mls.set_polynomial_fit(True)
    mls.set_Search_Method(tree)
    mls.set_search_radius(0.03)
    print('set parameters')
    mls_points = mls.process()

    # Save output
    # pcl::io::savePCDFile ("bun0-mls.pcd", mls_points);
    pcl.save_PointNormal(mls_points, 'bun0-mls.pcd')


if __name__ == "__main__":
    # import cProfile
    # cProfile.run('main()', sort='time')
    main()

运行结果:

cloud(size) = 112586
set parameters

bun0.pcd文件需要去这个地址下载:https://github.com/strawlab/python-pcl/blob/master/examples/official/Surface/bun0.pcd

### 使用PCL库中的MovingLeastSquares方法进行点云重采样 #### 实现过程 为了利用`pcl::MovingLeastSquares`类执行点云的重采样操作,需先创建该类的一个实例并设置必要的参数。此过程中涉及的关键步骤包括指定输入数据集、定义搜索半径以及配置输出属性。 ```cpp #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/radius_outlier_removal.h> #include <pcl/features/normal_3d.h> #include <pcl/surface/mls.h> int main(int argc, char** argv){ // 加载原始点云文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud) == -1) { PCL_ERROR("Couldn't read file input.pcd \n"); return (-1); } // 创建目标容器用于存储处理后的点云 pcl::PointCloud<pcl::PointNormal> mls_points; // 初始化MLS对象 pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls; // 设置输入点云 mls.setInputCloud(cloud); // 定义树结构加速最近邻查询 mls.setSearchMethod(pcl::search::KdTree<pcl::PointXYZ>::Ptr(new pcl::search::KdTree<pcl::PointXYZ>())); // 设定搜索半径,在这个范围内寻找近邻点来计算多项式拟合 mls.setSearchRadius(0.03); // 启用投影模式,即通过移动最小二乘法重新定位每个点的位置 mls.setComputeNormals(true); // 执行滤波平滑化 mls.process(mls_points); // 将结果保存到新的PCD文件中 pcl::io::savePCDFileASCII ("mls_output.pcd", mls_points); } ``` 上述代码展示了如何加载一个`.pcd`格式的点云集作为输入,并应用移动最小二乘算法对其进行平滑重采样[^2]。值得注意的是,这里设置了`setSearchRadius()`函数以控制局部区域内的点数影响程度;而启用常量计算(`setComputeNormals()`)则有助于改善最终模型的质量。 #### 参数调整的影响 不同的参数设定会对最终的结果产生显著差异。例如增大或减小搜索半径会改变参与每一点附近拟合的样本数量,从而影响表面细节保留度与噪声去除效率之间的平衡。此外,开启或关闭法线估计也会影响生成网格的质量速度[^1]。 #### 类间关系说明 在PCL框架下,`pcl::MovingLeastSquares`继承自抽象基类`pcl::CloudSurfaceProcessing`,这意味着它实现了特定于曲面重建的功能接口。同时,此类还依赖其他组件如`pcl::search::KdTree`来进行高效的邻居查找操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值