PCL专栏目录及须知-优快云博客
1.原理
双边滤波的速度较慢。快速双边滤波使用近似计算的方法(下采样)提升双边滤波的速度。
(1)对有序点云进行下采样。
(2)同双边滤波一样,也是先计算空间领域,得到的空间领域内的所有点。
(3)在该领域范围内,计算操作点和空间邻域内所有点的强度差异是否在高斯权重的范围内,如果不在高斯权重的范围内,那么使用高斯权重平滑强度。
(4)得到最终结果。
2.使用场景
对点云进行强度的降噪平滑。
3.注意事项
(1)输入点云必须是有序点云。
(2)fast_bilateral同fast_bilateral_omp区别在于多了一个线程加速的功能,fast_bilateral_omp为fast_bilateral的子类。
fast_bilateral_omp类名为:FastBilateralFilterOMP
其中FastBilateralFilterOM特有的方法如下,参数为线程数。
setNumberOfThreads()
4.关键函数
(1)设置空间邻域的标准差(也就是高斯权重计算的那个窗口大小/邻域半径);用于确定空间邻域。
setSigmaS()
(2)设置强度邻域的标准差;用于确定当前领域内强度的变化权重。
setSigmaR()
5.代码
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/fast_bilateral.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
int main()
{
/****************快速双边滤波********************/
// 原始点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile("D:/code/csdn/data/kmeansTest.pcd", *cloud); // 加载原始点云数据
// 结果点云
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>);
// 快速双边滤波
pcl::FastBilateralFilter<pcl::PointXYZRGB> filters;
filters.setInputCloud(cloud);
filters.setSigmaS(0.1); // 设置空间邻域的标准差(也就是高斯权重计算的那个窗口大小)
filters.setSigmaR(0.3); // 设置强度邻域的标准差(也就是判断领域内点的强度差异是不是在一定范围内,在的话不处理,不在的话滤波)
filters.filter(*cloud_filtered); // 计算
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_raw(new pcl::visualization::PCLVisualizer("raw"));
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> raw_rgb(cloud);
view_raw->addPointCloud<pcl::PointXYZRGB>(cloud, raw_rgb, "raw cloud");
view_raw->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "raw cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> view_filtered(new pcl::visualization::PCLVisualizer("filter"));
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> filtered_rgb(cloud);
view_filtered->addPointCloud<pcl::PointXYZRGB>(cloud_filtered, filtered_rgb, "filtered cloud");
view_filtered->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "filtered cloud");
while (!view_raw->wasStopped())
{
view_raw->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
while (!view_filtered->wasStopped())
{
view_filtered->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return 0;
}