PCL求解规则点云的拟合圆

点云直线检测:PCL+RANSAC三维几何拟合实战指南 点云直线检测是三维感知中基础而关键的几何理解任务,其本质是在无序、稀疏、含噪的三维散点中鲁棒地恢复物理世界的真实直线结构。该技术依赖于点云处理原理(如邻域搜索、距离度量)、几何建模方法(如SACMODEL_LINE参数化)与鲁棒估计理论(如RANSAC迭代机制),具备高精度、强可解释性和低计算开销的技术价值。典型应用场景包括工业质检中的边缘形变分析、自动驾驶的三维车道线解析,以及BIM逆向建模中的梁柱中心线提取。本文聚焦PCL与OpenCV协同下的3DLineDetection工程实现,深入解析从点云滤波、 阅读详情
AI摘要

本文介绍如何使用PCL库中的RANSAC算法提取2D和3D圆形点云模型。通过示例代码展示了如何计算圆心坐标、半径及圆所在平面的法向量等关键参数。

该文章引用自https://blog.youkuaiyun.com/Asher_zheng/article/details/100019353,https://blog.youkuaiyun.com/baidu_40840693/article/details/103928636
仅作为学习记录

前言

PCL中可通过RANSAC算法来计算一些规则点云的数学模型,并返回模型的参数。
RANSAC算法可用来从点云中提取圆形点云并得到圆形点云的圆心、半径及圆所在平面的法向量
(适合于3D Circle)。
在PCL的RANSAC算法模型中,有2D Circle和3D Circle两种圆形模型,以下分作简要介绍。

2D Circle模型

2D Circle模型是从原点云中提取表达式为 (x-a)²+(y-b)²=r² 的点云圆,因此得到的点云是一个圆柱体的侧面,使用方式如下:
(1) 包含头文件:

#include <pcl/sample_consensus/sac_model_circle.h>

(2) 定义模型:

pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>::Ptr model_circle2D
             (new pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>(cloud));
///cloud为要求解拟合圆的点云        

(3) RANSAC提取2D圆形点云:

pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_circle2D);
ransac.setDistanceThreshold(.01);
ransac.computeModel();
ransac.getInliers(inliers);

(4) 得到圆心坐标及半径并输出:

Eigen::VectorXf modelParas;
ransac.getModelCoefficients(modelParas);
std::cout << modelParas<< "\n\n";

演示结果为:

第一个原始点云如最左边图所示,右边两张图为此点云应用RANSAC得出2D Circle模型的不同角度,可以看出是一个圆柱体的侧面:
在这里插入图片描述
所计算出的圆心坐标及半径如下:
在这里插入图片描述

3D Circle模型

3D Circle模型得到的是三维空间的圆形点云,其数学模型可由圆心,半径及圆所在平面的法向量表示,具体计算方式如下:

(1) 包含头文件:

#include <pcl/sample_consensus/sac_model_circle.h>

(2) 定义模型:

pcl::SampleConsensusModelCircle3D<pcl::PointXYZ>::Ptr
		model_circle3D(new pcl::SampleConsensusModelCircle3D<pcl::PointXYZ>(cloud));

(3) RANSAC提取3D圆形点云:

pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_circle3D);
ransac.setDistanceThreshold(.01);
ransac.computeModel();
ransac.getInliers(inliers);

(4) 得到模型参数并打印出模型参数:

Eigen::VectorXf modelParas;
ransac.getModelCoefficients(modelParas);
std::cout << modelParas<< "\n\n";

演示结果为:

在这里插入图片描述
所计算出的圆心坐标及半径如下,前三个数值为圆心坐标(x, y, z),第四个数值为计算出的圆形点云的半径,最后三个为圆形点云所在平面的法向量:

在这里插入图片描述

具体实例

    ///定义了final点云,存放最后的结果
    pcl::PointCloud<pcl::PointXYZ>::Ptr final (new pcl::PointCloud<pcl::PointXYZ>);
    ///存放拟合圆
    std::vector<int> inliersCircle3D;
    
    ///oriCloud_inliers:待求解拟合圆的原始点云
    pcl::SampleConsensusModelCircle3D<PointT>::Ptr socCircle3D(new pcl::SampleConsensusModelCircle3D<PointT> (oriCloud_inliers));
    
    ///求解拟合圆
    pcl::RandomSampleConsensus<PointT>::Ptr ransac ( new pcl::RandomSampleConsensus<PointT> (socCircle3D) );
    ransac->setDistanceThreshold(0.1f);
    ransac->computeModel();
    ransac->getInliers(inliersCircle3D);
    
    ///获取拟合圆的参数
    Eigen::VectorXf circle_coeff;
    ransac->getModelCoefficients(circle_coeff);
   
    PointCloud::Ptr finalCircle3D(new PointCloud);
    pcl::copyPointCloud (*oriCloud_inliers, inliersCircle3D, *finalCircle3D);
    std::cout<<"circle_coeff "<<"rows="<<circle_coeff.rows()<<"cols="<<circle_coeff.cols()<<"coefficeints="<<circle_coeff.size()<<std::endl;
    
    ///可视化
    pcl::visualization::PointCloudColorHandlerCustom<PointT> color_handler5(finalCircle3D, 230, 50, 12);//红色
    view->addPointCloud(finalCircle3D, color_handler5, "CH5");

copyPointCloud()函数

常见的使用方法有两种:

Part 1:完全拷贝到新的点云之中:pcl::copyPointCloud (const pcl::PointCloud &cloud_in,pcl::PointCloud &cloud_out)

pcl::PointCloud<pcl::PointXYZ>::Ptr src(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointNormal>::Ptr src_PN(new pcl::PointCloud<pcl::PointNormal>);

pcl::io::loadPCDFile("src.pcd",*src);//载入原数据
pcl::io::loadPCDFile("src_pn.pcd", *src_PN);//载入原数据

pcl::copyPointCloud(*src, *src_PN);//src中的xyz覆盖掉src_PN中的xyz值

pcl::io::savePCDFile("src_with_normal.pcd", *src_PN);

Part 2:部分索引的使用:pcl::copyPointCloud (const pcl::PointCloud &cloud_in, const std::vector &indices,pcl::PointCloud &cloud_out)

pcl::PointCloud<pcl::PointXYZ>::Ptr src(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile("src.pcd",*src);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudout(new pcl::PointCloud<pcl::PointXYZ>);
std::vector<int>indexs = { 0,2,6 };//索引
pcl::copyPointCloud(*src, indexs, *cloudout);
pcl::io::savePCDFile("cloud_out.pcd", *cloudout);//只取src中的第1,第3个,第7个点赋值到新的cloudout中。
点云拟合NURBS曲面:从原理到工程落地的完整指南 在三维扫描与逆向工程中,散乱点云只是离散的坐标集合,难以直接用于CAD/CAM。传统的网格重建虽能呈现形状,却缺乏参数连续性,无法满足工程设计、数控加工与结构分析的精度要求。NURBS曲线曲面作为工业级参数化建模的标准,通过控制点、权因子与节点向量的协同作用,可将离散点云转化为光滑可编辑的参数曲面。实现这一过程需要完成点云去噪、参数化映射、自适应节点插入、最小二乘控制点反算以及误差迭代评估等关键步骤,并结合PCL、OpenNURBS等工具链落地。从汽车内饰到建筑立面,NURBS拟合技术在处理非均匀点云、局部 阅读详情

相关推荐

PCL 第十讲-surface表面

本文介绍了PCL(Point Cloud Library)Surface模块中的多种曲面重建与拟合算法,包括基于多项式重构的移动最小二乘法(MLS)平滑与法线估计、平面点云的凸/凹包提取、贪婪投影三角化、B样条曲线拟合等。MLS算法通过局部高阶多项式拟合实现点云平滑和法线估计;凸/凹包算法可提取平面点云的外轮廓;贪婪投影三角化用于快速曲面重建;B样条曲线拟合适用于复杂曲面参数化建模。文章还提供了详细的代码实现,展示了MLS算法的核心参数设置和使用方法,包括搜索半径、多项式阶数等关键参数的调整策略。

jiyanghao19的博客 320

pcl采样一致性模型介绍

采样一致性可以简单高效的检测出一些数学模型,主要是针对具有数学表达式的目标模型。pcl中sample consensus模块中不仅包含各种的采样一致性估计方法,也包含了一些已经编写好的数学模型,下面主要介绍一下pcl中的采样一致性模型。

com1098247427的博客 1419

CloudCompare&PCL RANSAC拟合圆(三维)

CloudCompare&PCL RANSACE拟合圆(三维)

dayuhaitang1的博客 1798

PCL点云库之框架

PCL系列文章之框架

u012660296的博客 1174

PCL RANSAC算法实现二维圆拟合

本文将介绍如何使用PCL(点云库)中的RANSAC算法实现二维圆拟合,并提供相应的源代码。本文介绍了如何使用PCL库中的RANSAC算法实现二维圆拟合,并提供了相应的源代码。其中包含了RANSAC算法的实现,用于点云的模型拟合、平面分割、形状识别等任务。通过对输入点云数据应用RANSAC算法进行二维圆拟合,我们可以得到圆心坐标和半径的估计值。根据实际应用需求,可以进一步优化模型参数和采样策略,提高圆拟合的精度和鲁棒性。以上是PCL RANSAC算法实现二维圆拟合的相关内容,细节请参考附带的源代码。

BitSlinger的博客 781

3D视觉测量:PCL空间圆孔拟合圆(附源码)

空间圆拟合(Spatial Circle Fitting)是一个用于拟合三维空间中的圆的数学和计算机视觉技术。

lddx_123456的博客 1627

3D点云系列——pcl:点云平滑及法线估计

// 对点云重采样 pcl::search::KdTree<PointT>::Ptr treeSampling (new pcl::search::KdTree<PointT>); // 创建用于最近邻搜索的KD-Tree pcl::PointCloud<PointT> mls_points; //输出MLS pcl::MovingLeastSquare...

xiaohu的博客 9622

PCL:实现最小二乘拟合二维圆(附完整源码)

PCL:实现最小二乘拟合二维圆(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 936

ubuntu18 PCL库安装与基于点云的B-spline曲面拟合

这里写自定义目录标题 1:由源码安装PCL: Ubuntu18.04安装PCL库(C++版)教程 https://blog.youkuaiyun.com/Boys_Wu/article/details/122000682 得到的pcl文件夹放在/home下就行 注意!!!cmake时不要用默认的 cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \ -DBUILD_GPU=ON-DBUILD_apps=ON -DBUILD_examples=ON \ -

惟岸可居的博客 1284

PCL 点云多项式曲面拟合

PCL 点云多项式曲面拟合

dayuhaitang1的博客 470

基于PCL的点云煤堆体积计算思路与原理

本文介绍了一套基于PCL库的三维点云处理系统,用于煤堆体积的自动化测算。系统通过体素栅格下采样预处理点云数据,采用分层切割确定基准平面,并创新性地运用K近邻聚类与微分法将不规则煤堆分割为多个几何单元进行体积累加。该方案实现了从点云读取、预处理、分割到体积计算的全流程自动化,输出结构化的CSV结果。系统核心在于将复杂的三维体积计算转化为局部几何特征的组合运算,既保证了计算精度又提高了效率。该技术思路可推广至其他不规则堆体的体积测算场景,具有较好的工程应用价值。

weixin_45196569的博客 128

PCL RANSAC算法实现点云粗配准

RANSAC,全称随机采样一致性(Random Sample Consensus),是一种通过采样的方式从含有大量异常数值的点云里面寻找出最优模型的方法。核心思想是:在一堆数据中找出“符合规则的好数据”,并估计出模型参数。

m0_46327660的博客 1100

【C++PCL】点云法向量可视化

摘要:本文详细介绍了使用C++ PCL库进行点云法向量计算与可视化的全流程。重点包括:1) 通过主成分分析(PCA)计算点云法向量;2) 解决法向量方向二义性问题;3) 法向量可视化方法。文章提供完整源码,并详细说明核心参数(如邻域半径、视点设置)的调试技巧,确保法向量计算结果准确可靠。该方法适用于点云处理、三维重建等工程应用,通过可视化可直观验证法向量计算效果,是点云处理的基础技术。

weixin_45196569的博客 72

PCL点云处理入门指南:从基础到实战技巧

无需配置环境即可在线运行PCL代码,支持实时预览和结果导出。实际测试中,其内置的模板能快速搭建基础处理流程,特别适合算法原型验证和教学演示。复制点云时注意使用pcl::copyPointCloud保持数据结构一致。评估配准质量时要同时看fitness score和RMSE两个指标。半径滤波要配合KD树使用,搜索半径通常取点云平均间距的2-3倍。需要最新特性可尝试PCL1.14.1+VS2022。区域生长分割的法线角度阈值建议15-30度区间。想快速验证点云算法?泊松重建生成水密网格。

PearlOwl67的博客 431

C++实现点云数据拟合圆柱体几何建模项目

对于含自定义字段的PCD文件,可通过查询偏移量,或注册新点类型:此举使PCL能识别新类型并正常加载。设圆柱的轴线由一点 $ \mathbf{p}_0 = (x_0, y_0, z_0) $ 和单位方向向量 $ \mathbf{d} = (d_x, d_y, d_z) $ 确定,满足 $ |\mathbf{d}| = 1 $。对于空间中任一点 $ \mathbf{p} = (x, y, z) $,其到该轴线的垂直距离应等于半径 $ R $ 才能落在圆柱表面上。

weixin_35706067的博客 1186

PromptBio实战:如何用AI对话搞定转录组数据分析(附详细操作截图)

本文详细介绍了如何利用PromptBio平台通过AI对话完成转录组数据分析,无需编程基础即可实现从数据上传到结果解读的全流程。文章包含详细的操作截图和参数配置建议,帮助科研人员快速掌握这一生信分析工具,显著提升研究效率。

weixin_30872157的博客 133

PCL预处理+Matlab椭球拟合:点云三维建模与形变检测实战

三维点云处理是计算机视觉与工业检测中的基础环节,而椭球拟合则是从离散点云中提取几何参数的核心技术,广泛应用于机械零件形变评估、医学影像建模和粒子探测器标定等场景。针对激光扫描获取的原始点云,直接拟合往往受离群点、密度不均和坐标尺度影响,导致结果偏离真实椭球。本文从最小二乘与奇异值分解(SVD)的数学原理出发,讲解如何通过PCL进行离群点剔除与降采样,再结合Matlab矩阵运算和优化工具箱完成从代数拟合到非线性精修的完整流程。文章重点剖析了无约束拟合导致双曲面解的问题,并给出特征值修正和lsqnonlin精修

weixin_42659194的博客 220

国产操作系统应用迁移与适配

了解国产操作系统的背景及意义

2301_77609559的博客 2677

PCL --FPFH查找对应点对SVD进行配准

本文提出了一种基于PCL FPFH特征和SVD分解的点云粗配准方法。该方法通过以下步骤实现高效的点云对齐: 预处理阶段:去除无效点并进行体素下采样,减少计算量 特征提取:使用多线程计算法向量和33维FPFH特征直方图 特征匹配:采用双向最近邻匹配确保对应点对的可靠性 变换求解:通过SVD分解计算最优刚性变换矩阵 该方法相比传统欧式距离匹配具有更强的抗噪声能力,通过特征描述子实现鲁棒匹配,为后续精配准提供良好初始位姿。实验表明,该方法能有效处理不同尺度点云的粗配准问题。

weixin_45590420的博客 754

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 413

【StreamSet】ETL之StreamSet之Pipelines的状态监听之WebHook钉钉篇

介绍下StreamSets的状态监听以及钉钉的webhook的互联,这位博友问的恰是时候,不久前我刚刚对接过钉钉的机器人,这次看到这个问题,对我来说,应该轻车熟路了,那就有了这篇博文,状态监听之钉钉篇。...

m0_54252387的博客 487

点头算法应用,旋转矩阵左乘右乘,欧拉角,三维点,线,面求解算法,手眼标定,点云匹配及三角剖分、结构光和TOF深度图

1:Point Process 直通滤波器 体素滤波器 统计滤波器 条件滤波 半径滤波器 双边滤波 高斯滤波 均匀采样滤波 移动最小二乘法光滑滤波 基于权重局部优化投影 (WLOP) 简化算法 DoN算法 以及各种通过规则进行点调整或者删除的都可以成为滤波算法 直通滤波器:对于在空间分布有一定空间特征的点云数据,比如使用线结构光扫描的方式采集点云,沿z向分布较广,但x,y向的分布处于有限范围内。此时可使用直通滤波器,确定点云在x或y方向上的范围,可较快剪除离群点,达到第一步粗处理的目的。 体素滤波器:

人生得意须尽欢 3515

基于 51 单片机的智能手势控制小车设计与实现

智能手势控制小车以STC89C52RC 单片机为控制核心,通过手势识别模块采集用户手势指令,经单片机处理后驱动电机执行前进、后退、左转、右转等动作。该项目融合了传感器技术、单片机编程和电机驱动技术,具有成本低、易实现、互动性强的特点,适合作为嵌入式系统入门实践案例。本项目成功实现了基于 51 单片机的智能手势控制小车,通过 APDS-9960 模块采集手势信号,经单片机处理后驱动电机完成基本动作,验证了 “传感器 + 单片机 + 执行器” 的嵌入式系统设计思路。

weixin_42300449的博客 177
上一篇: PCL窗口显示点云及可视化问题
下一篇: For循环重定义问题
Candyerer
博客等级 码龄7年 20粉丝 40原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值