离散点云拟合三维平面参数推导(基于最小二乘)

1、背景介绍

      实际中,很多人工构造物是由平面结构构造而成,如下图所示,为一典型的由多个平面组成的人工构筑物。因此,根据离散点拟合成平面,获取拟合平面方程,是点云数据处理中非常常见的数据处理操作。

2、平面拟合参数推导

      基于若离散点,估算平面方程过程如下:

3、程序设计

      基于上述理论,使用C++、PCL编写的程序,下载链接如下:https://download.csdn.net/download/qq_32867925/89381863。

3.1 已知平面方程拟合测试

      本次首先给定平面方程为x+2y+3z+4=0 (x+4y+5z+6=0)的平面,在平面上随机生成50个点,利用这50个点拟合平面方程。部分结果与代码如下:

int main()
{//a*x+b*y+c*z+d=0  平面方程形式double a, b, c, d;a = 1;b = 4;c = 5;d = 6;//随机生成50个点// 初始化随机数生成器srand(static_cast<unsigned int>(time(nullptr)));vector<pcl::PointXYZ> pts;for (int i = 0; i < 50; i++){pcl::PointXYZ pt;pt.x= static_cast<double>(rand()) / RAND_MAX;pt.y = static_cast<double>(rand()) / RAND_MAX;pt.z = (-d - a * pt.x - b * pt.y) / c;pts.push_back(pt);}NormalEigenvalueCurvature planeparam = EstimateNormalEigenvalue(pts);cout << "在平面方程为" << a << "x+" << b << "y+" << c << "z+" << d << "=0" << "平面上产生的点,经过拟合后得到的平面参数如下:" << endl;cout << "拟合参数 a b c d 分别如下:" << endl << "a=" << planeparam.normal_x << "  b=" << planeparam.normal_y << "  c=" << planeparam.normal_z << "  d=" << planeparam.d << endl;system("pause");return 0;
}

      根据拟合可知,拟合得到的平面参数,与实现给定平面方程,几乎一致,只是参数a、b、c进行了单位归一化。证明了本方法的正确性。

3.2 法向量估算

      根据推导过程可知,平面方程ax+by+cz+d=0中参数a、b、c为平面法向量。使用kdtree搜索点云近邻点,利用近邻点拟合得到局部平面,将局部平面的法向量进行可视化,可以进一步验证估算法向量是否正确。部分代码与结果如下:

将估算的参数a、b、c作为法向量,并进行可视化代码示意:

vector<NormalEigenvalueCurvature> ptsNormal = PtsEstimateNormalEigenvalue(pts, 15);//估算每个点平面方程//增加点云法向量pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);normals->width = pts.size();normals->height = 1;normals->resize(normals->width * normals->height);for (int i = 0; i < ptsNormal.size(); i++){double normal_x = ptsNormal[i].normal_x;double normal_y = ptsNormal[i].normal_y;double normal_z = ptsNormal[i].normal_z;double length = sqrt(normal_x * normal_x + normal_y * normal_y + normal_z * normal_z);normal_x = normal_x / length;normal_y = normal_y / length;normal_z = normal_z / length;normals->points[i].normal_x = normal_x;normals->points[i].normal_y = normal_y;//将法向量调整都朝向if (normal_z >= 0){normals->points[i].normal_z = normal_z;}else{normals->points[i].normal_z = -normal_z;}}

所有点法向量估算示意图

      由上图可知,位于一个面上法向量是垂直于该平面的,证明估算法向量正确。

4、小结

     介绍了基于最小二乘估算平面方程的推导过程,以及测试结果。

基于PCL、C++编写的代码链接:https://download.csdn.net/download/qq_32867925/89381863

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/21880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Ability Kit(程序框架服务)【ExtensionAbility组件】

ExtensionAbility组件 ExtensionAbility组件是基于特定场景&#xff08;例如服务卡片、输入法等&#xff09;提供的应用组件&#xff0c;以便满足更多的使用场景。 每一个具体场景对应一个[ExtensionAbilityType]&#xff0c;开发者只能使用&#xff08;包括实现和访问&#…

WPS的excel表格设置了编辑权限,要怎么取消?

在日常生活和工作中&#xff0c;我们经常会使用WPS Office办公软件来处理各种文档&#xff0c;其中WPS Excel表格是我们进行数据处理和分析的重要工具。为了保护表格中的数据不被随意修改&#xff0c;我们有时会设置编辑权限。然而&#xff0c;随着时间的推移或需求的变更&…

基于FPGA的SystemVerilog练习

文章目录 一、认识SystemVerilogSystemVerilog的语言特性SystemVerilog的应用领域SystemVerilog的优势SystemVerilog的未来发展方向 二、流水灯代码流水灯部分testbench仿真文件 三、用systemVerilog实现超声波测距计时器测距部分led部分数码管部分采样部分顶层文件引脚绑定效果…

鲁教版七年级数学下册-笔记

文章目录 第七章 二元一次方程组1 二元一次方程组2 解二元一次方程组3 二元一次方程组的应用4 二元一次方程与一次函数5 三元一次方程组 第八章 平行线的有关证明1 定义与命题2 证明的必要性3 基本事实与定理4 平行线的判定定理5 平行限的性质定理6 三角形内角和定理 第九章 概…

dpdk uio整体分析及网卡加载

参考:https://zhuanlan.zhihu.com/p/477600165 一、Linux内核知识点 1. __attribute__ constructor/destructor (1)若函数被设定为constructor属性,则该函数会在 main()函数执行之前被自动的执行。 (2)若函数被设定为destructor属性,则该函数会在main()函数执…

开发和渗透偷懒利器utools

目录 1.前言 1.1 工具简介 1.2 核心特性 1.3 使用场景 1.4 安装与使用 1.4.1 下载&#xff1a; 1.4.2 安装&#xff1a; 1.4.3 配置&#xff1a; 1.4.4 插件市场&#xff1a; 2.懒狗插件介绍 基本介绍 2.1 数据模拟 2.2 随机生成虚假数据 2.3 API市场 2.4 Hoppscot…

【十二】图解mybatis日志模块之设计模式

图解mybatis日志模块之设计模式 概述 最近经常在思考研发工程师初、中、高级工程师以及系统架构师各个级别的工程师有什么区别&#xff0c;随着年龄增加我们的技术级别也在提升&#xff0c;但是很多人到了高级别反而更加忧虑&#xff0c;因为it行业35岁年龄是个坎这是行业里的共…

一文读懂数据库中的DB、DBMS、DBS、DBAS

目前数据库的应用非常广泛,几乎各行各业都在直接或间接地与数据库打交道,例如网上购物、银行业务、铁路购票和酒店住宿等。在实际应用中,数据库、数据库管理系统、数据库系统和数据库应用系统经常被统称为数据库,而实质上这4个概念是不一样的,它们具有不同的定义和含义。下…

暴力数据结构之排序大杂烩

1. 冒泡排序&#xff1a;O(N^2) 逻辑解析&#xff1a; 冒泡排序并没有什么实际意义&#xff0c;但是有教学意义&#xff0c;相信大部分小白在学习的初期第一个接触的排序就是冒泡排序。那么接下来我们了解一下他的底层逻辑&#xff1a; 冒泡排序顾名思义就是将最大&#xff08…

PID——调参的步骤

第一步&#xff1a;确定比例增益P 确定比例增益 P 时&#xff0c;首先去掉 PID 的积分项和微分项&#xff0c;一般是令 Ti0、 Td0&#xff08;具体见PID 的参数设定说明&#xff09;&#xff0c;使PID 为纯比例调节。 输入设定为系统允许的最大值60%~70%&#xff0c;由0逐渐加…

idea项目maven下载依赖报错

报错&#xff1a; 1、Failure to find bad.robot:simple-excel:jar:1.0 in https://maven.aliyun.com/repository/public was cached in the local repository, resolution will not be reattempted until the update interval of aliyunmaven has elapsed or updates are forc…

python的while循环与for循环总结

前两章中&#xff0c;我们跟着海绵宝宝的故事&#xff0c;掌握了 while 循环和 for 循环&#xff0c;这两种不同的循环模式。while 循环和 for 循环都需要有 循环体 和 缩进&#xff0c;我们来复习一下它俩的语法规则&#xff1a; while 循环与 for 循环辨析 学到这里&#x…

Microsoft Edge TTS引擎实现文字转语音小工具

Microsoft Edge TTS引擎实现文字转语音小工具 ​ 看了一篇文章关于使用Microsoft Edge TTS引擎进行文本转语音的介绍。正好单位工作上经常用到音视频的制作和转换。但是文字变成音频一直都是播音员口播实现。现在到了AI时代,各种功能强大的AI大模型已经应用到各个领域,大大提…

Docker镜像导入导出

Docker镜像导入导出 相关命令 docker export 容器id > x:/xx/xx.tar ##导出容器快照 docker import - x:/xx/xx.tar ##导入容器快照 docker save 镜像id > x:/xx/xx.tar ##导出镜像 docker load < x:/xx/xx.tar ##导入镜像命令详解 docker save …

在鲲鹏服务器搭建k8s高可用集群分享

高可用架构 本文采用kubeadm方式搭建k8s高可用集群&#xff0c;k8s高可用集群主要是对apiserver、etcd、controller-manager、scheduler做的高可用&#xff1b;高可用形式只要是为&#xff1a; 1. apiserver利用haproxykeepalived做的负载&#xff0c;多apiserver节点同时工作…

nginx反向代理了解

文章目录 Nginx反向代理反向代理系统调优Proxy Buffer相关指令 Nginx 具有高性能的http和反向代理的web服务器&#xff0c;同时也是一个pop3/smtp/imap代理服务器&#xff0c;使用c语言编写 **Web服务器&#xff1a;**也叫网页服务器&#xff0c;web server&#xff0c;主要功…

易联众智慧云胶片平台,助推医学影像服务“向云端”

在门诊室里,张女士焦急地告诉主治医师,自己忘了带CT胶片。“您别急,我用系统查询一下。”医生轻点几下鼠标进入云胶片平台,只用不到10秒就顺利完成了影像调取。“不仅我可以看到,您在手机上也能随时随地查阅。”张女士根据提示操作,不仅能调阅自己的影像档案,连抽血化验结果都可…

Spring MVC 启动流程?

在 web.xml 文件中给 Spring MVC 的 Servlet 配置了 load-on-startup&#xff0c;所以程序启动的时候会初始化 Spring MVC&#xff0c;在 HttpServletBean 中将配置的 contextConfigLocation属性设置到 Servlet 中&#xff0c;然后在FrameworkServlet 中创建了 WebApplicationC…

[GeoServer系列]Shapefile数据发布

【GeoServer系列】——安装与发布shapefile数据-CSDN博客 将待发布数据放置指定目录下 webapps\geoserver\data\data 创建存储仓库 新建矢量数据源 发布图层 设置边框 设置样式 使用 方式1 let highRoad new Cesium.WebMapServiceImageryProvider({url: http://local…

blender从视频中动作捕捉,绑定到人物模型

总共分为3个步骤&#xff1a; 1、从视频中捕捉动作模型 小K动画网-AIGC视频动捕平台 地址&#xff1a;https://xk.yunbovtb.com/ 需要注册 生成的FBX文件&#xff0c;不能直接导入到blender中&#xff0c; 方法有2种&#xff1a; 第一种&#xff1a;需要转换一下&#x…