C++实现点云添加高斯噪声功能
时间:2022-02-02 09:34:29|栏目:C代码|点击: 次
0 添加高斯噪声后的点云
红色为添加的高斯噪声点,白色为原始点
1 什么是高斯噪声
高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。(百度百科)
高斯分布,也称正态分布,又称常态分布,记为 N ( μ , σ 2 ) ),其中 μ , σ 2 为分布的参数,分别为高斯分布的期望和方差,其中 σ > 0 ,称为标准差。当 μ , σ 有确定值时,p ( x ) 也就确定了,特别当 μ = 0 , σ 2 = 1时,x 的分布为标准正态分布。
高斯分布函数
2 怎样添加高斯噪声
磨刀不误砍柴工,将添加高斯噪声封装到 CreatGaussNoise类 中,只需在main.cpp中设置输入点云(要添加噪声的点云)、设置高斯噪声参数(μ , σ)即可。
实现代码
main.cpp
#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
#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
#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++中cin/cout与scanf/printf的区别比较
栏 目:C代码
下一篇:C++实现链表版本通讯录
本文标题:C++实现点云添加高斯噪声功能
本文地址:http://www.codeinn.net/misctech/192093.html