C++实现点云添加高斯噪声功能

时间:2022-11-07 13:25:43

0 添加高斯噪声后的点云

红色为添加的高斯噪声点,白色为原始点

C++实现点云添加高斯噪声功能

1 什么是高斯噪声

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。(百度百科)

高斯分布,也称正态分布,又称常态分布,记为 N ( μ , σ 2 ) ),其中 μ , σ 2 为分布的参数,分别为高斯分布的期望和方差,其中 σ > 0 ,称为标准差。当 μ , σ 有确定值时,p ( x ) 也就确定了,特别当 μ = 0 , σ 2 = 1时,x 的分布为标准正态分布。

C++实现点云添加高斯噪声功能

高斯分布函数

2 怎样添加高斯噪声

磨刀不误砍柴工,将添加高斯噪声封装到 CreatGaussNoise类 中,只需在main.cpp中设置输入点云(要添加噪声的点云)、设置高斯噪声参数(μ , σ)即可。

实现代码

main.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "add_gauss_noise.h"
 
int main()
{
    //-------------------加载点云-------------------
    pcl::PointCloud<pcl::PointXYZ> cloud_in;
    if (pcl::io::loadPCDFile("Armadillo.pcd", cloud_in) < 0)
    {
        PCL_ERROR("->点云文件不存在!\a\n");
        system("pause");
        return -1;
    }
 
    //-------------------添加高斯噪声-------------------
    AddGaussNoise agn;                          //创建高斯噪声对象agn
    pcl::PointCloud<pcl::PointXYZ> cloud_out; //保存结果的点云
    agn.setInputCloud(cloud_in);                //设置输入点云
    agn.setParameters(0,2);                     //设置高斯噪声参数mu,sigma
    agn.addGaussNoise(cloud_out);               //执行添加高斯噪声,并将结果保存在cloud_out中
    
    //-------------------保存添加高斯噪声后的点云-------------------
    pcl::io::savePCDFileBinary("addGaussNoise.pcd", cloud_out);
 
    return 0;
}

add_gauss_noise.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <boost/random.hpp>       //随机数所需头文件
 
class AddGaussNoise
{
public:
 
    /**
    * @brief   : 设置输入点云
    * @param[I]: cloud_in (输入点云)
    * @param[O]: none
    * @return  : none
    * @note    :
    **/
    void setInputCloud(pcl::PointCloud<pcl::PointXYZ> &cloud_in);
 
    /**
    * @brief   : 设置高斯噪声参数
    * @param[I]: mu (均值,默认0)
    * @param[I]: sigma (标准差,默认1)
    * @param[O]: none
    * @return  : none
    * @note    :
    **/
    void setParameters(double mu = 0.0, double sigma = 1.0);
 
    /**
    * @brief   : 执行添加高斯噪声
    * @param[I]: cloud_out (添加高斯噪声后的点云)
    * @param[O]: none
    * @return  : none
    * @note    :
    **/
    void addGaussNoise(pcl::PointCloud<pcl::PointXYZ> &cloud_out);
private:
 
    pcl::PointCloud<pcl::PointXYZ> m_cloud_in;        //输入点云
    bool is_setInputCloud = false;                  //是否设置输入点云
    double m_mu, m_sigma;                           //高斯分布参数
    bool is_setParameters = false;                  //是否设置高斯分布参数
};

add_gauss_noise.cpp

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include "add_gauss_noise.h"
 
/**
* @brief   : 设置输入点云
* @param[I]: cloud_in (输入点云)
* @param[O]: none
* @return  : none
* @note    :
**/
void AddGaussNoise::setInputCloud(pcl::PointCloud<pcl::PointXYZ> &cloud_in)
{
    m_cloud_in = cloud_in;
    is_setInputCloud = true;
}
 
/**
* @brief   : 设置高斯噪声参数
* @param[I]: mu (均值,默认0)
* @param[I]: sigma (标准差,默认1)
* @param[O]: none
* @return  : none
* @note    :
**/
void AddGaussNoise::setParameters(double mu, double sigma)
{
    if (sigma > 0)
    {
        m_mu = mu;
        m_sigma = sigma;
        is_setParameters = true;
    }
    else
    {
        PCL_ERROR("->sigma应大于0!\a\n");
        system("pause");
        abort();
    }
}
 
/**
* @brief   : 执行添加高斯噪声
* @param[I]: cloud_out (添加高斯噪声后的点云)
* @param[O]: none
* @return  : none
* @note    :
**/
void AddGaussNoise::addGaussNoise(pcl::PointCloud<pcl::PointXYZ> &cloud_out)
{
    boost::mt19937 zgy;                             //等分布均匀伪随机数发生器
    zgy.seed(static_cast<unsigned int>(time(0))); //随机种子
    boost::normal_distribution<> nd(m_mu, m_sigma);   //定义正态分布,均值为mu,标准差为sigma
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<>> gauss_noise(zgy, nd);   //生成高斯噪声
 
    pcl::PointCloud<pcl::PointXYZ> cloud_gauss;   //声明高斯噪声点云
    cloud_gauss = m_cloud_in;                   //将原始点云拷贝给高斯噪声点云,用于下面的平移               
 
    for (size_t i = 0; i < cloud_gauss.size(); i++)
    {
        cloud_gauss.points[i].x += static_cast<float> (gauss_noise());
        cloud_gauss.points[i].y += static_cast<float> (gauss_noise());
        cloud_gauss.points[i].z += static_cast<float> (gauss_noise());
    }
 
    cloud_out = m_cloud_in + cloud_gauss;   //将原始点云与噪声点云合并,得到添加高斯噪声后的点云
}

参考链接

C++ normal_distribution高斯正态分布函数用法详解

总结

到此这篇关于C++实现点云添加高斯噪声功能的文章就介绍到这了,更多相关C++点云高斯噪声内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_46098577/article/details/118682374