PCL 给点云添加高斯噪声(Common_CloudGenerator)

注意:PCL生成高斯噪声时,只是生成了一个原始点云点的位移量,需要将该位移量添加到原始点云点上,而不是直接生成了一个带有高斯噪声的新点云。

1.原理

对于当前点云,修改当前点云点的位置,符合高斯分布的噪声点云结果。

高斯分布(正态分布)的解释

均值、方差、标准差的解释

2.使用场景

生成高斯噪声数据(实际工作中使用较少)

3.注意事项

PCL生成高斯噪声时,只是生成了一个原始点云点的位移量,需要将该位移量添加到原始点云点上,而不是直接生成了一个带有高斯噪声的新点云。

因此下方代码中,分为生成高斯噪声添加高斯噪声两步,注意区别。

4.关键函数

(1)按照设定的均值和标准差,在xyz方向分别计算高斯噪声参数,最终生成高斯噪声的位移量

标准差越大,数据的高斯分布越分散,即生成的高斯噪声点云越分散

    // 生成高斯噪声位移量
	// 设置xyz方向的均值及标准差
	float xmean = 0, ymean = 0, zmean = 0;								
	float xstddev = 0.02, ystddev = 0.02, zstddev = 0.02;

	pcl::common::CloudGenerator<pcl::PointXYZ, pcl::common::NormalGenerator<float> > generator;			// 高斯噪声生成器
	uint32_t seed = static_cast<uint32_t> (time(NULL));													// 随机数种子
	pcl::common::NormalGenerator<float>::Parameters x_params(xmean, xstddev, seed++);					// 添加x方向的噪声
	generator.setParametersForX(x_params);
	pcl::common::NormalGenerator<float>::Parameters y_params(ymean, ystddev, seed++);					// 添加y方向的噪声
	generator.setParametersForY(y_params);
	pcl::common::NormalGenerator<float>::Parameters z_params(zmean, zstddev, seed++);					// 添加z方向的噪声
	generator.setParametersForZ(z_params);
	generator.fill((*cloud).width, (*cloud).height, *cloud_out);										// 生成高斯噪声

(2)将高斯噪声的位移量添加到原始点云坐标上,得到最终的符合高斯分布的噪声点云结果。

    // 给原始点云添加高斯噪声位移量
    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
        cloud_out->points[i].x += cloud->points[i].x;
        cloud_out->points[i].y += cloud->points[i].y;
        cloud_out->points[i].z += cloud->points[i].z;
    }

5.代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/random.h>
#include <pcl/common/generate.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>


int main()
{
    /****************添加高斯噪声********************/
    // 原始点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile("D:/code/csdn/data/person2.pcd", *cloud);   // 加载原始点云数据
    // 结果点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out(new pcl::PointCloud<pcl::PointXYZ>);

    // 生成高斯噪声位移量
	// 设置xyz方向的均值及标准差
	float xmean = 0, ymean = 0, zmean = 0;								
	float xstddev = 0.02, ystddev = 0.02, zstddev = 0.02;

	pcl::common::CloudGenerator<pcl::PointXYZ, pcl::common::NormalGenerator<float> > generator;			// 高斯噪声生成器
	uint32_t seed = static_cast<uint32_t> (time(NULL));													// 随机数种子
	pcl::common::NormalGenerator<float>::Parameters x_params(xmean, xstddev, seed++);					// 添加x方向的噪声
	generator.setParametersForX(x_params);
	pcl::common::NormalGenerator<float>::Parameters y_params(ymean, ystddev, seed++);					// 添加y方向的噪声
	generator.setParametersForY(y_params);
	pcl::common::NormalGenerator<float>::Parameters z_params(zmean, zstddev, seed++);					// 添加z方向的噪声
	generator.setParametersForZ(z_params);
	generator.fill((*cloud).width, (*cloud).height, *cloud_out);										// 生成高斯噪声

    // 给原始点云添加高斯噪声位移量
    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
        cloud_out->points[i].x += cloud->points[i].x;
        cloud_out->points[i].y += cloud->points[i].y;
        cloud_out->points[i].z += cloud->points[i].z;
    }

    pcl::io::savePCDFile("D:/code/csdn/data/person5.pcd", *cloud_out);                                  // 保存带有高斯噪声的点云

    /****************展示********************/
    boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
    view_raw->addPointCloud<pcl::PointXYZ>(cloud, "raw cloud");
    view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");

    boost::shared_ptr<pcl::visualization::PCLVisualizer> view_gauss(new pcl::visualization::PCLVisualizer("filter"));
    view_gauss->addPointCloud<pcl::PointXYZ>(cloud_out, "gauss cloud");
    view_gauss->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "filtered cloud");

    while (!view_raw->wasStopped() || !view_gauss->wasStopped())
    {
        view_raw->spinOnce(100);
        view_gauss->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;
}

6.结果点云

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
点云高斯噪声指的是点云数据中存在高斯分布的噪声。点云是由大量的点组成的三维空间数据,常用于三维重建、环境感知等领域。然而,在采集和处理点云数据的过程中,由于传感器的精度限制、环境干扰等因素,很容易导致点云数据中存在噪声。 高斯噪声是一种常见的噪声类型,其特点是具有高斯分布概率密度函数。在点云中,高斯噪声会使得原本清晰的点云轮廓模糊不清,使得点云的形状、边界等细节不再清晰可辨,对后续的数据处理与分析造成困扰。 针对点云高斯噪声的处理方法多种多样。其中一种常用的方法是通过滤波算法点云数据进行降噪。滤波算法可以基于点云数据的特点,如点密度、法线信息等,来去除高斯噪声。例如,平滑滤波算法可基于点的邻域信息对点云数据进行平滑处理,从而减少噪声的影响,提高数据的质量。 另外,也可以通过先验知识对点云数据进行处理。例如,在特定应用场景下,可以根据场景的几何约束或其他先验信息,去除认为是噪声的点。同时,还可以采用数据修复技术对局部缺失的点进行恢复,从而提高点云的完整性与质量。 综上所述,点云高斯噪声是指点云数据中存在的以高斯分布特征的噪声。通过采用适当的滤波算法和先验知识,可以有效降低或消除点云数据中的高斯噪声,提高数据的准确性与可用性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值