2020-10-16 pcl给点云加噪声
想学习滤波方法和原理
转成学习加噪声,尝试随机噪声和高斯噪声
但是点云指针Ptr和点云不能直接相加,需要转换
ptr→point cloud:cloud=*cloud——ptr
point cloud→ptr:cloud_ptr=cloud.makeShared()
可是即便类型一致,直接相加两个点云还是会得到点云的拼接
这是添加点云噪声的办法
(1条消息) PCL 添加噪声_josslyn的博客-CSDN博客 https://blog.csdn.net/josslyn/article/details/79920733
智能指针是可以直接相加的,而且发现了一个问题(运行中间出现absort()和!px=0报错)的解决办法:
进入添加点云噪声的循环之前,定义点云类型应当是带有new的智能指针
void addGaussnoise(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr icloud, size_t miu, size_t sigma)
{
icloud->points.resize(cloud->points.size());//将点云的cloud的size赋值给噪声
icloud->header = cloud->header;
icloud->width = cloud->width;
icloud->height = cloud->height;
boost::mt19937 zhongzi;
zhongzi.seed(static_cast<unsigned int>(time(0)));
boost::normal_distribution<> nd(miu, sigma);
boost::variate_generator<boost::mt19937&, boost::normal_distribution<>> ok(zhongzi, nd);
for (size_t i = 0; i < cloud->size(); ++i)
{
icloud->points[i].x = cloud->points[i].x + static_cast<float>(ok());
icloud->points[i].y = cloud->points[i].y + static_cast<float>(ok());
icloud->points[i].z = cloud->points[i].z + static_cast<float>(ok());
}
return;
}
int main(int argc, char** argv)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // 创建点云(指针)
readtxt("123.txt", cloud);//自定义函数
std::cout << "正确查找文件" << std::endl;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudfinal(new pcl::PointCloud<pcl::PointXYZ>);
//func new(Type) *Type
//它的作用是给一个类型分配内存,并返回指向这个类型的指针。
//而直接声明一个类型虽然也分配了内存,但是返回的不是指针
size_t a = 0;
size_t b = 1;
addGaussnoise(cloud, cloudfinal, 0, 1);
showAcloud(cloud, cloudfinal);//自定义函数
}
玫色是加了噪声之后的点云,绿色为原点云