以下列出方法均有运行成功的代码,所有工程文件我都会放在如下链接:
https://github.com/gx-sun/classic-point-cloud-denoising-methods
欢迎star
持续补充中,目前最新为2021.12月。
1.移动最小二乘MLS
基于PCL
#include "stdafx.h"
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
int main(int argc, char** argv)
{// 将一个适当类型的输入文件加载到对象PointCloud中
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
// 加载bun0.pcd文件,加载的文件在 PCL的测试数据中是存在的
pcl::io::loadPCDFile("bunny_hi_noise.pcd", *cloud);
// 创建一个KD树
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
// 输出文件中有PointNormal类型,用来存储移动最小二乘法算出的法线
pcl::PointCloud<pcl::PointNormal> mls_points;
// 定义对象 (第二种定义类型是为了存储法线, 即使用不到也需要定义出来)
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
mls.setComputeNormals(true);
//设置参数
mls.setInputCloud(cloud);
mls.setPolynomialFit(true);
mls.setSearchMethod(tree);
mls.setSearchRadius(0.06);
// 曲面重建
mls.process(mls_points);
// 保存结果
pcl::io::savePCDFile("bunny_hi_noise_mls.pcd", mls_points);
}
2.双边滤波
2.1基于PCL
实验编译成功了,但是因为其需要intensity分量,一般都没有,故无法运行
#include "stdafx.h"
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include &l