沿着法向量的方向投影到某一平面pcl

本文介绍了如何在C++中使用PCL库求解点云的法向量,选定平面并投影点云到该平面上,最后通过可视化展示处理过程。作者展示了关键步骤如计算法向量、确定平面方程以及投影操作的代码片段。
摘要由CSDN通过智能技术生成

1,先求法向量,利用computePointNormal得到的前三个参数就是法向量(a,b,c)

2,选定一点,这个点是用来定位平面的,通过这个点求出平面ax+by+cz+d=0的d

3,将点云沿着法向量的方向投影到选择的平面上

4,可视化一下

部分代码如下:

1,先求法向量,利用computePointNormal得到的前三个参数就是法向量(a,b,c)

    pcl::console::TicToc time; time.tic();    
    CP cloudAfter(new CloudT);

    int cloud_size = cloudIn->size();
    Vector4f planePara;
    float wuyong;
    vector<int> indices(cloud_size);

    #pragma omp parallel for
    for (int i = 0; i < cloudIn->size(); i++)
    {
        indices[i] = i;
    }
    computePointNormal(*cloudIn, indices, planePara, wuyong);

2,选定一点,这个点是用来定位平面的,通过这个点求出平面ax+by+cz+d=0的d

    double x0 = cloudIn->points[int(cloud_size / 2)].x;
    double y0 = cloudIn->points[int(cloud_size / 2)].y;
    double z0 = cloudIn->points[int(cloud_size / 2)].z;
    double A = planePara(0);    
    double B = planePara(1);
    double C = planePara(2);
    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());
    coefficients->values.resize(4);
    coefficients->values[0] = A;
    coefficients->values[1] = B;
    coefficients->values[2] = C;
    coefficients->values[3] = -(A * x0 + B * y0 + C * z0);

3,将点云沿着法向量的方向投影到选择的平面上

    pcl::ProjectInliers<pcl::PointXYZ> proj;
    proj.setModelType(pcl::SACMODEL_PLANE);
    proj.setInputCloud(cloudIn);
    proj.setModelCoefficients(coefficients);
    proj.filter(*cloudAfter);
    cout << "投影时间:" << time.toc() << "ms" << endl;

4,可视化一下

    pcl::visualization::PCLVisualizer viewer;
    viewer.setBackgroundColor(0.05, 0.05, 0.05);
    viewer.addPointCloud(cloudIn,             pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloudIn, 255, 0, 0), "cloudIn");
    viewer.addPointCloud(cloudAfter, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(cloudAfter, 0, 255, 0), "cloudAfterNormal");
    while (!viewer.wasStopped()) {
        viewer.spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    cloudIn = cloudAfter;

    normal_plane.emplace_back(A);
    normal_plane.emplace_back(B);
    normal_plane.emplace_back(C);
    normal_plane.emplace_back(coefficients->values[3]);

  • 19
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值