C++實現(xiàn)點云添加高斯噪聲功能
0 添加高斯噪聲后的點云
紅色為添加的高斯噪聲點,白色為原始點
1 什么是高斯噪聲
高斯噪聲是指它的概率密度函數(shù)服從高斯分布(即正態(tài)分布)的一類噪聲。(百度百科)
高斯分布,也稱正態(tài)分布,又稱常態(tài)分布,記為 N ( μ , σ 2 ) ),其中 μ , σ 2 為分布的參數(shù),分別為高斯分布的期望和方差,其中 σ > 0 ,稱為標準差。當 μ , σ 有確定值時,p ( x ) 也就確定了,特別當 μ = 0 , σ 2 = 1時,x 的分布為標準正態(tài)分布。
高斯分布函數(shù)
2 怎樣添加高斯噪聲
磨刀不誤砍柴工,將添加高斯噪聲封裝到 CreatGaussNoise類 中,只需在main.cpp中設(shè)置輸入點云(要添加噪聲的點云)、設(shè)置高斯噪聲參數(shù)(μ , σ)即可。
實現(xiàn)代碼
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; //創(chuàng)建高斯噪聲對象agn pcl::PointCloud<pcl::PointXYZ> cloud_out; //保存結(jié)果的點云 agn.setInputCloud(cloud_in); //設(shè)置輸入點云 agn.setParameters(0,2); //設(shè)置高斯噪聲參數(shù)mu,sigma agn.addGaussNoise(cloud_out); //執(zhí)行添加高斯噪聲,并將結(jié)果保存在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> //隨機數(shù)所需頭文件 class AddGaussNoise { public: /** * @brief : 設(shè)置輸入點云 * @param[I]: cloud_in (輸入點云) * @param[O]: none * @return : none * @note : **/ void setInputCloud(pcl::PointCloud<pcl::PointXYZ> &cloud_in); /** * @brief : 設(shè)置高斯噪聲參數(shù) * @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 : 執(zhí)行添加高斯噪聲 * @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; //是否設(shè)置輸入點云 double m_mu, m_sigma; //高斯分布參數(shù) bool is_setParameters = false; //是否設(shè)置高斯分布參數(shù) };
add_gauss_noise.cpp
#include "add_gauss_noise.h" /** * @brief : 設(shè)置輸入點云 * @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 : 設(shè)置高斯噪聲參數(shù) * @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應(yīng)大于0!\a\n"); system("pause"); abort(); } } /** * @brief : 執(zhí)行添加高斯噪聲 * @param[I]: cloud_out (添加高斯噪聲后的點云) * @param[O]: none * @return : none * @note : **/ void AddGaussNoise::addGaussNoise(pcl::PointCloud<pcl::PointXYZ> &cloud_out) { boost::mt19937 zgy; //等分布均勻偽隨機數(shù)發(fā)生器 zgy.seed(static_cast<unsigned int>(time(0))); //隨機種子 boost::normal_distribution<> nd(m_mu, m_sigma); //定義正態(tài)分布,均值為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高斯正態(tài)分布函數(shù)用法詳解
總結(jié)
到此這篇關(guān)于C++實現(xiàn)點云添加高斯噪聲功能的文章就介紹到這了,更多相關(guān)C++點云高斯噪聲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法
C++ 標準庫沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法,需要的朋友可以參考下2021-12-12C++之std::vector刪除元素的幾種方式及區(qū)別說明
這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08