精华内容
下载资源
问答
  • RANSAC三维点云平面拟合

    一、算法原理

    1、概述

      随机抽样一致性算法RANSAC(Random sample consensus)是一种迭代的方法来从一系列包含有离异值的数据中计算数学模型参数的方法。
      RANSAC算法本质上由两步组成,不断进行循环:
      (1)从输入数据中随机选出能组成数学模型的最小数目的元素,使用这些元素计算出相应模型的参数。选出的这些元素数目是能决定模型参数的

    展开全文
  • 在分析激光雷达点云空间分布特征的基础上,提出了基于斜率的激光点云平面拟合过滤算法,并利用该算法对机栽激光雷达点云的特征提取进行了实验研究。结果表明,此算法能有效地拟舍激光点云的连续平滑的水平平面、倾斜...
  • 我有一个来自现实世界的点云,我想在它们上面拟合并计算点的曲线(!).因为点在现实世界中,因此点的x,y和z之间的差异幅度非常大,当我在here中使用代码时,我在matlab中遇到以下错误:Warning: Rank deficient, rank = 2...

    我有一个来自现实世界的点云,我想在它们上面拟合并计算点的曲线(!).

    因为点在现实世界中,因此点的x,y和z之间的差异幅度非常大,当我在

    here中使用代码时,我在matlab中遇到以下错误:

    Warning: Rank deficient, rank = 2, tol = 7.9630e-007.

    这意味着我的数据状况不佳.

    我的一些数据是:

    32512032.3900000 5401399.69000000 347.030000000000

    32512033.1400000 5401399.79000000 346.920000000000

    32512036.3000000 5401399.62000000 346.840000000000

    32512037.3900000 5401399.95000000 346.870000000000

    32512034.4800000 5401400 346.930000000000

    32512035.6000000 5401400.05000000 346.950000000000

    32512036.6900000 5401400.38000000 346.980000000000

    32512037.9600000 5401400.30000000 346.910000000000

    32512033.7600000 5401400.42000000 346.880000000000

    32512034.8700000 5401400.48000000 346.960000000000

    我也在matlab中使用了fit公式.

    sf = fit( [x, y], z, 'poly23');

    并看到同样的错误:

    Warning: Equation is badly conditioned. Remove repeated data points

    or try centering and scaling.

    这种类型的点是否适合曲面或平滑曲线?

    展开全文
  • 利用点云库PCL,使用VS2015完成的C++代码,测试文件(.obj)已经在本站上传资源,...对于不平整表面,利用ransac平面拟合,然后将三维不平整表面近似为一个平面,并将表面上的点投影到该平面,并进行显示 详见本人博客
  • 针对常用的平面拟合方法在点云数据存在误差或异常值时产生拟合不稳定的现象,提出了结合最小二乘法的随机抽取一致性(random sample consensus,RANSAC)平面拟合算法. 该方法先用RANSAC 算法检测并剔除异常数据点,再...
  • 点云法向量估计的主要思路是对K-近邻的N个点进行平面拟合(平面过N点重心),平面法向量即为所求;所以求法向量就是变相的求拟合平面。 下面我们用最小二乘法求k近邻点云的拟合平面: 当 ||x||=1时,Ax=0的最小...

         点云法向量估计的主要思路是对K-近邻的N个点进行平面拟合(平面过N点重心),平面法向量即为所求;所以求法向量就是变相的求拟合平面。

    下面我们用最小二乘法求k近邻点云的拟合平面:

    当 ||x||=1时,Ax=0的最小二乘解是ATA的最小特征值对应的特征向量等同于:ATA的最小特征值所对应的特征向量可使||Ax||最小。

    结论:假设k-近邻点矩阵B,B为k*3的矩阵,则根据B拟合平面的法向量就是BTB对应的最小特征向量;

    同理我们可以得出BTB对应的最大特征向量就是拟合平面的方向向量。(这里的前提是:B已经去中心化)


    实际上,求一组点的拟合平面的过程,就是求其PCA的过程。因为PCA也是可以通过最小化投影距离推导出来的。即样本点到这个超平面的距离足够近。

    PCA的推导:基于最小投影距离

    重建:

                                  

         上式中的x'其实表示原样本点在新的基下的拉伸程度系数,我们把拉伸系数再乘上对应的基向量(在原坐标系下的方向向量),就相当于求出投影后的样本点在原坐标系下的坐标。以三维坐标为例,将点P(x,y,z)投影到一个平面内,变成二维坐标M(x',y'),平面使用2个基向量(基向量是3维)表示,(x',y')再与2个基向量相乘求和,就得到点M在原三维空间的坐标。

    即样本点到这个超平面的距离足够近。

    展开全文
  • // 拟合平面 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); pcl::PointIndices::Ptr inliers(new pcl::PointIndices); // FittingPlane(cloud, coefficients, inliers); Eigen::Vector3d...

    不使用法线

    #include <pcl/io/pcd_io.h>
    #include <pcl/common/centroid.h>
    #include <pcl/segmentation/sac_segmentation.h>
    #include <pcl/visualization/pcl_visualizer.h>
    
    void visualization(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
                       const pcl::ModelCoefficients::Ptr coefficients,
                       const pcl::PointIndices::Ptr inliers) {
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Plane"));
      viewer->setBackgroundColor(0, 0, 0);
      
      Eigen::Vector4f centroid;
      pcl::compute3DCentroid(*cloud, centroid);
      pcl::PointXYZ p1(centroid[0], centroid[1], centroid[2]);
      pcl::PointXYZ p2(centroid[0] + coefficients->values[0],
                       centroid[1] + coefficients->values[1],
                       centroid[2] + coefficients->values[2]);
      viewer->addArrow(p2, p1, 1, 0, 0, false);
    
      viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");
    
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr inlier_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
      pcl::copyPointCloud(*cloud, *inliers, *inlier_cloud);
      viewer->addPointCloud<pcl::PointXYZRGB>(inlier_cloud, "inlier_cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "inlier_cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "inlier_cloud");
    
      while (!viewer->wasStopped()) {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
      }
    }
    
    void FittingPlane(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
                      pcl::ModelCoefficients::Ptr& coefficients,
                      pcl::PointIndices::Ptr& inliers) {
      // Create the segmentation object
      pcl::SACSegmentation<pcl::PointXYZRGB> seg;
      // Optional
      seg.setOptimizeCoefficients(true);
      // Mandatory
      seg.setModelType(pcl::SACMODEL_PLANE);
      seg.setMethodType(pcl::SAC_RANSAC);
    
      seg.setDistanceThreshold(0.03);
      seg.setMaxIterations(1000);
    
      seg.setInputCloud(cloud);
      seg.segment(*inliers, *coefficients);
    }
    
    void FittingPlane(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
                      const Eigen::Vector3d& init_normal, const double& eps_angle_in_rad,
                      pcl::ModelCoefficients::Ptr& coefficients,
                      pcl::PointIndices::Ptr& inliers) {
      pcl::SACSegmentation<pcl::PointXYZRGB> seg;
      seg.setOptimizeCoefficients(true);
      // seg.setModelType(pcl::SACMODEL_PLANE);
      seg.setModelType(pcl::SACMODEL_PERPENDICULAR_PLANE);
      seg.setMethodType(pcl::SAC_RANSAC);
    
      seg.setDistanceThreshold(0.03);
      seg.setMaxIterations(1000);
    
      seg.setAxis(init_normal.cast<float>());
      seg.setEpsAngle(eps_angle_in_rad);
    
      seg.setInputCloud(cloud);
      seg.segment(*inliers, *coefficients);
    }
    
    int main(int argc, char**argv) {
      // 加载点云模型
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
      if (pcl::io::loadPCDFile<pcl::PointXYZRGB>("/tmp/color.pcd", *cloud) == -1) {
        std::cerr << "can't load point cloud file" << std::endl;
        return -1;
      }
      std::cout << "loaded " << cloud->width * cloud->height << " points" << std::endl;
      std::cout << "field: " << pcl::getFieldsList(*cloud) << std::endl;
    
      // 拟合平面
      pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
      pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
      // FittingPlane(cloud, coefficients, inliers);
      Eigen::Vector3d init_normal;
      init_normal << 0, 0, 1;
      double eps_angle_in_rad = 10 * M_PI / 180; // 估计的法线和初始法线相差10°以内
      FittingPlane(cloud, init_normal, eps_angle_in_rad, coefficients, inliers);
      std::cout << "Model coefficients: " << coefficients->values[0] << " " 
                                          << coefficients->values[1] << " "
                                          << coefficients->values[2] << " " 
                                          << coefficients->values[3];
    
      // 点云渲染和可视化
      visualization(cloud, coefficients, inliers);
    
      return 0;
    }

    使用法线

    #include <pcl/io/pcd_io.h>
    #include <pcl/common/centroid.h>
    #include <pcl/features/normal_3d.h>
    #include <pcl/segmentation/sac_segmentation.h>
    #include <pcl/visualization/pcl_visualizer.h>
    
    void EstimateNormal(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
                        pcl::PointCloud<pcl::Normal>::Ptr normals) {
      pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> normal_est;
      normal_est.setInputCloud(cloud);
      normal_est.setRadiusSearch(0.5); // 对于每一个点都用半径为5cm的近邻搜索方式
      // normal_est.setKSearch(50); // 点云法向计算时,需要搜索的近邻点数目
      pcl::search::KdTree<pcl::PointXYZRGB>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZRGB>);
      normal_est.setSearchMethod(kdtree); // 建立kdtree来进行近邻点集搜索
      normal_est.compute(*normals);
    }
    
    void FittingPlane(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
                      const pcl::PointCloud<pcl::Normal>::Ptr normals,
                      pcl::ModelCoefficients::Ptr& coefficients,
                      pcl::PointIndices::Ptr& inliers) {
      pcl::SACSegmentationFromNormals<pcl::PointXYZRGB, pcl::Normal> seg;
      seg.setOptimizeCoefficients(true);
      seg.setModelType(pcl::SACMODEL_PLANE);
      seg.setMethodType(pcl::SAC_RANSAC);
      seg.setNormalDistanceWeight(0.1);  //设置表面法线权重系数
      seg.setInputNormals(normals);
      seg.setDistanceThreshold(0.03);
      seg.setMaxIterations(1000);
      seg.setInputCloud(cloud);
      seg.segment(*inliers, *coefficients);
    }
    
    void visualization(const pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud,
                       const pcl::PointCloud<pcl::Normal>::Ptr& normals,
                       const pcl::ModelCoefficients::Ptr coefficients,
                       const pcl::PointIndices::Ptr inliers) {
      boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Plane"));
      viewer->setBackgroundColor(0, 0, 0);
      
      Eigen::Vector4f centroid;
      pcl::compute3DCentroid(*cloud, centroid);
      // std::cout << "centroid2: " << centroid[0] << ", " << centroid[1] << ", " << centroid[2] << ", " << centroid[3] << std::endl;
      pcl::PointXYZ p1(centroid[0], centroid[1], centroid[2]);
      pcl::PointXYZ p2(centroid[0] + coefficients->values[0],
                       centroid[1] + coefficients->values[1],
                       centroid[2] + coefficients->values[2]);
      viewer->addArrow(p2, p1, 1, 0, 0, false);
    
      viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "cloud");
    
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr inlier_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
      pcl::copyPointCloud(*cloud, *inliers, *inlier_cloud);
      viewer->addPointCloud<pcl::PointXYZRGB>(inlier_cloud, "inlier_cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "inlier_cloud");
      viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "inlier_cloud");
    
      viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 5, 0.03, "normals");
    
      while (!viewer->wasStopped()) {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
      }
    }
    
    int main(int argc, char**argv) {
      // 加载点云模型
      pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
      if (pcl::io::loadPCDFile<pcl::PointXYZRGB>("/tmp/color.pcd", *cloud) == -1) {
        std::cerr << "can't load point cloud file" << std::endl;
        return -1;
      }
      std::cout << "loaded " << cloud->width * cloud->height << " points" << std::endl;
      std::cout << "field: " << pcl::getFieldsList(*cloud) << std::endl;
    
      // 计算法线
      pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
      EstimateNormal(cloud, normals);
    
      // 拟合平面
      pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
      pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
      FittingPlane(cloud, normals, coefficients, inliers);
      std::cout << "Model coefficients: " << coefficients->values[0] << " " 
                                          << coefficients->values[1] << " "
                                          << coefficients->values[2] << " " 
                                          << coefficients->values[3];
    
      // 点云渲染和可视化
      visualization(cloud, normals, coefficients, inliers);
    
      return 0;
    }

    展开全文
  • //大部分数据点在一个平面效果测试(方法3,4有问题) X=[1,1,1,2,2,2,3,3,3]; Y=[1,2,3,1,2,3,1,2,3]; Z=[5,5,5,5,5,5,5,8,8]; 矩阵S=[1,1,5;1,2,5;1,3,5;2,1,5;2,2,5;2,3,5;3,1,5;3,2,8;3,3,8]; S=[1,1,5;1,2,5;...
  • 参考链接(Ransac拟合):https://blog.csdn.net/weixin_41758695/article/details/85322304 ...利用开源的点云库PCL,使用VS2015完成的C++代码,测试文件(.obj)已经在本站(csdn)上传资源,供大...
  • 1.基于halcon算法平台;...@描述: 该方法支持点云平面拟合以及深度图平面拟合。 @来源:欢迎关注微信公众号 AmazingRobot+ 获取更多机器人视觉知识。 *********************************/ read_image (imageR
  • * @描述: 该方法支持点云平面拟合以及深度图平面拟合。 **********************************/* read_image (imageReal, './replay_38893_2021-6-7.tif') xResolution:=0.06 yResolution:=0.06 zResolution:=0.001 ...
  • 点云拟合—平面拟合

    万次阅读 2019-05-13 16:44:16
    平面方程:Ax+By+Cz+D=0 方程本身不复杂,原理推导别人已经写得很明白了,我这里只贴地址了,不重复推导。 拟合方法一——最小二乘: https://blog.csdn.net/konglingshneg/article/details/82585868 构建系数...
  • 3D点云几何拟合

    千次阅读 2020-05-25 15:11:56
    3D点云几何拟合 Supervised Fitting of Geometric Primitives to 3D Point Clouds 论文地址: ...摘要 将几何基元拟合到三维点云数据可以在底层三维形状的低层数字化三维数据和高层结
  • 用matlab进行离散数据的平面拟合,得到平面拟合方程的系数
  • 可以自己用RANSAC迭代,用三个非共线的点进行寻找内点数量最多的平面,也可以直接用PCL中的平面拟合函数直接进行计算;这里采用第二种; 1. 在项目中包含PCL库 find_package(PCL REQUIRED) include_...
  • 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样  1. 参数:leafsize  2. 意义:Voxel Grid的leafsize参数,物理意义是下采样网格的大小,直接影响处理后点云密集程度,并对后期各种...
  • @文档名称: 3D点云拟合直线。 @作者: hugo @版本: 1.1 @日期: 2021-7-26 @描述: 该方法支持3DROI创建以及点云拟合直线。 @来源:欢迎关注微信公众号 robotvision+ 获取更多机器人视觉知识。 **********************...
  • 在这种情况下,拟合无约束的二次曲面可能会导致出现不良曲面,例如双曲面,扁平椭圆形或平面。 约束表面的一种方法是使用具有贝叶斯先验概率的概率模型拟合表面参数。 可以在本文中找到更多信息, 二次拟合示例 下图...
  • PCL求解规则点云拟合

    千次阅读 2020-11-06 20:58:43
    PCL中可通过RANSAC算法来计算一些规则点云的数学模型,并返回模型的参数,因此RANSAC算法可用来从点云中提取圆形点云并得到圆形点云的圆心、半径及圆所在平面的法向量(适合于3D Circle)。在PCL的RANSAC算法模型中
  • 该脚本将点云平面拟合,在水平方向上旋转平面并检索旋转点的坐标。 现在评论是意大利语。 输入:.ASC格式的点云; 输出:.ASC 和.DAT 格式的旋转点云坐标。 该脚本使用以下库: 大卫·罗格兰 (2019)。 geom3d ...
  • 3维点云拟合平面

    2021-04-24 16:17:06
    思路:用已知的三维点坐标拟合一个平面 三维平面方程 cos⁡α⋅Xi+cos⁡β⋅Yi+cos⁡γ⋅Zi−d=0\cos \alpha \cdot X_i+\cos \beta \cdot Y_i+\cos \gamma \cdot Z_i - d=0cosα⋅Xi​+cosβ⋅Yi​+cosγ⋅Zi​−d=...
  • 取局部点云,对点云进行平面拟合(采用的是SVD分解),利用最小特征值对应的特征向量为平面法向量 利用深度相机获取点云二维图像 深度相机原理介绍 安装深度相机(Kinect V1)驱动 借鉴创客智造的博客:链接 ...
  • 它适合点云中的原始形状(例如平面,长方体和圆柱体)以适应多种应用:3D猛击,3D重建,对象跟踪等。 特征: 安装 要求:脾气暴躁 用安装: pip3 install pyransac3d 看一看: 示例1-平面RANSAC import pyransac...
  • 基于RANSAC算法PCL点云拟合平面整理

    万次阅读 多人点赞 2018-11-30 13:51:50
    文章目录前言首先讲一下PCL是什么接下来是RANSAC算法解决思路PCL拟合平面手写RANSAC算法代码流程然而,出现了问题!!!发现问题mt19937 is what? 前言 这个项目,跟我专业不大相关,准确的说,是帮助学姐的做一...
  • 确实因为halcon的文档写的太好了,所以网上关于halcon的博客就很少,点云拟合平面的文档上介绍的比较详细,但是如何从平面模型中读取法向量可确实是难到了,找了三个小时人傻了,然后发现还是一行函数。 首先来说...
  • 基于三维点的一个更加鲁棒的平面拟合方法(Fitting a plane to many points in 3D)
  • 点云拟合平面-最小二乘法

    千次阅读 2020-11-18 17:23:33
    #求解X [a,c] b=b0+b1*a A_inv=np.linalg.inv(A) X = np.dot(A_inv, b) print(X[0,0],X[1,0]) # print('平面拟合结果为:z = %.3f * x + %.3f * y + %.3f'%(X[0,0],X[1,0],X[2,0])) # Ax+By+Cz+D=0,则其法向量为(A...
  • 1.平面拟合算法   三维平面方程为z=ax+by+cz=ax+by+cz=ax+by+c。希望通过LIDAR测得的多组(x,y,z)(x,y,z)(x,y,z)来拟合(a,b,c)(a,b,c)(a,b,c)。 测量误差为ej=z^j−zj=(a^+b^xj+c^yj)−zjj=1…n\begin{aligned} e_...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,756
精华内容 702
关键字:

点云平面拟合