点云引导滤波算法实现

25 篇文章 17 订阅
8 篇文章 2 订阅

引导滤波假设点云经过一个线性变换,具有很好的保留边缘信息功能。
参考文献:韩先锋博士学位论文《三维点云去噪处理及特征描述的研究》
伪代码:
在这里插入图片描述
代码是这样的

#include <iostream>
#include<pcl/io/pcd_io.h>
#include<pcl/point_cloud.h>
#include<pcl/point_types.h>
#include<pcl/kdtree/kdtree_flann.h>
using point = pcl::PointXYZ;
using cloud = pcl::PointCloud<point>;
int main()
{
    cloud cloud_in, cloud_out;

    pcl::io::loadPCDFile<point>("noisedchair.pcd", cloud_in);
    if (!cloud_in.size())
        return 0;
    pcl::KdTreeFLANN<point>kdtree;
    unsigned int k = 20;//参数1
    double epsilon = 0.05;//参数2
    kdtree.setInputCloud(cloud_in.makeShared());
    for (size_t i = 0; i < cloud_in.size(); ++i)
    {
        std::vector<int>indices(0,0);
        indices.reserve(k);
        std::vector<float>dist(0,0.0);
        cloud neigh_points;
        dist.reserve(k);
        if (kdtree.nearestKSearch(cloud_in.points[i], k, indices, dist) > 0)
        {
            pcl::copyPointCloud(cloud_in, indices, neigh_points);
            point point_mean(0.0, 0.0, 0.0);
            double neigh_mean_2=0.0;
            for (auto neigh_point : neigh_points)
            {
                point_mean.x += neigh_point.x;
                point_mean.y += neigh_point.y;
                point_mean.z += neigh_point.z;
                neigh_mean_2 += ((neigh_point.x) * double(neigh_point.x))+(double(neigh_point.y) * double(neigh_point.y))+(double(neigh_point.z) * double(neigh_point.z));

            }
            point_mean.x /= neigh_points.size();
            point_mean.y /= neigh_points.size();
            point_mean.z /= neigh_points.size();
            neigh_mean_2 /= neigh_points.size();

            double point_mean_2 = (point_mean.x * point_mean.x) + (point_mean.y*point_mean.y) +( point_mean.z * point_mean.z);
            double a = (neigh_mean_2 - point_mean_2) / (neigh_mean_2 - point_mean_2 + epsilon);
            point b;
            b.x = (1.0 - a) * point_mean.x;
            b.y = (1.0 - a) * point_mean.y;
            b.z = (1.0 - a) * point_mean.z;

            point smoothed_point(0.0, 0.0, 0.0);
            smoothed_point.x =a* cloud_in.points[i].x + b.x;
            smoothed_point.y = a * cloud_in.points[i].y + b.y;
            smoothed_point.z = a * cloud_in.points[i].z + b.z;
            cloud_out.push_back(smoothed_point);
       }
    }
    cloud_out.width = cloud_out.size();
    cloud_out.height = 1;
    cloud_out.resize(double(cloud_out.width) * double(cloud_out.height));
    pcl::io::savePCDFile<point>("smoothed_chair.pcd", cloud_out);
    std::cout << "Hello World!\n";
}

效果是这样的:
原始带噪点点云:
在这里插入图片描述
去噪后点云:
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值