三维空间中散点平面拟合方法

news2025/1/19 3:28:06

1、三点求平面方程、平面法向量和点到平面的距离
已知三点p1(x1,y1,z1),p2(x2,y2,z2),p3(x3,y3,z3),

要求确定的平面方程,关键在于求出平面的一个法向量

为此做向量p1p2(x2-x1,y2-y1,z2-z1), p1p3(x3-x1,y3-y1,z3-z1),平面法线和这两个向量垂直,因此法向量n:
在这里插入图片描述
平面方程:a(x-x1)+b(y-y1)+ c(z-z1)=0;

d=-ax1-by1-c*z1。
平面平面方程为 ax+by+cz+d=0。

//已知3点坐标,求平面ax+by+cz+d=0;
 
void get_panel(Point p1,Point p2,Point p3,double &a,double &b,double &c,double &d)
 
{
 
    a = (p2.y - p1.y)*(p3.z - p1.z) - (p2.z - p1.z)*(p3.y - p1.y);
 
    b = (p2.z - p1.z)*(p3.x - p1.x) - (p2.x - p1.x)*(p3.z - p1.z);
 
    c = (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x);
 
    d = 0 - (a * p1.x + b*p1.y + c*p1.z);
 
}
 
 
// 已知三点坐标,求法向量
 
Vec3 get_Normal(Point p1,Point p2,Point p3)
 
{
 
    a = (p2.y - p1.y)*(p3.z - p1.z) - (p2.z - p1.z)*(p3.y - p1.y);
 
    b = (p2.z - p1.z)*(p3.x - p1.x) - (p2.x - p1.x)*(p3.z - p1.z);
 
    c = (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x);
 
    return Vec3(a, b, c);
 
}
 
 
//点到平面距离
 
double dis_pt2panel(Point pt,double a,double b,double c,double d)
{
 
    return f_abs(a * pt.x + b*pt.y + c*pt.z + d) / sqrt(a * a + b * b + c * c);
 
}

设空间中一组带噪声的位于某个平面的散点 ( x i , y i , z i ) , i = 1 , 2 , . . . , N , (x_{i},y_{i},z_{i}),i=1,2,...,N, (xi,yi,zi),i=1,2,...,N对于平面方程的一般表达式 A x + B y + C z + D = 0 Ax+By+Cz+D=0 Ax+By+Cz+D=0,对于不过原点的平面有 A x + B y + C z + 1 = 0 Ax+By+Cz+1=0 Ax+By+Cz+1=0,于是问题就变成了求系数A,B,C使得散点尽可能的落在该平面上。下面笔者将从两种角度来推导最小二乘下的最优解。

求误差函数的极小值点的方法
设A,B,C为平面的最优参数,则对于每个点 ( x i , y i , z i ) , i = 1 , 2 , . . . , N (x_{i},y_{i},z_{i}),i=1,2,...,N (xi,yi,zi),i=1,2,...,N带人该平面表达式中存在误差 e i = A x i + B y i + C z i + 1 e_{i}=Ax_{i}+By_{i}+Cz_{i}+1 ei=Axi+Byi+Czi+1,我们将所有的误差的平方进行求和则有:
设A,B,C为平面的最优参数,则对于每个点带人该平面表达式中存在误差,我们将所有的误差的平方进行求和则有:
在这里插入图片描述
可见误差的平方和为A,B,C的函数,我们通过观察可以很容易的发现该函数是4维空间中的一个下凸超平面,且具有唯一的极小值,同时也是全局最小值。那么E对A,B,C的一阶偏导都为0,即:
在这里插入图片描述
展开整理可得:
在这里插入图片描述
我们令: x ˉ = 1 N ∑ i = 1 N x i , y ˉ = 1 N ∑ i = 1 N y i , z ˉ = 1 N ∑ i = 1 N z i , x 2 ˉ = 1 N ∑ i = 1 N x i 2 , y 2 ˉ = 1 N ∑ i = 1 N y i 2 , z 2 ˉ = 1 N ∑ i = 1 N z i 2 , x y ˉ = 1 N ∑ i = 1 N x i y i , x z ˉ = 1 N ∑ i = 1 N x i z i , y z ˉ = 1 N ∑ i = 1 N y i z i \bar{x}=\frac{1}{N}\sum_{i=1}^{N}x_{i},\bar{y}=\frac{1}{N}\sum_{i=1}^{N}y_{i},\bar{z}=\frac{1}{N}\sum_{i=1}^{N}z_{i},\bar{x^{2}}=\frac{1}{N}\sum_{i=1}^{N}x_{i}^{2},\bar{y^{2}}=\frac{1}{N}\sum_{i=1}^{N}y_{i}^{2},\bar{z^{2}}=\frac{1}{N}\sum_{i=1}^{N}z_{i}^{2},\bar{xy}=\frac{1}{N}\sum_{i=1}^{N}x_{i}y_{i},\bar{xz}=\frac{1}{N}\sum_{i=1}^{N}x_{i}z_{i},\bar{yz}=\frac{1}{N}\sum_{i=1}^{N}y_{i}z_{i} xˉ=N1i=1Nxiyˉ=N1i=1Nyizˉ=N1i=1Nzix2ˉ=N1i=1Nxi2,y2ˉ=N1i=1Nyi2,z2ˉ=N1i=1Nzi2xyˉ=N1i=1Nxiyixzˉ=N1i=1Nxiziyzˉ=N1i=1Nyizi则(3)可以被写成如下形式:
在这里插入图片描述
可以看到(4)就是一个3元一次方程组,求解这个方程组就可以得到A,B,C的值。

几何的方法
下面来介绍如何使用几何的方法来进行推导,我们令
X = [ x 1 x 2 . . . x N ] , X ′ = [ − 1 − B y 1 − C z 1 − 1 − B y 2 − C z 2 . . . − 1 − B y N − C z N ] X=\begin{bmatrix} x_{1}\\ x_{2}\\ ...\\ x_{N} \end{bmatrix},{X}'=\begin{bmatrix} -1-By_{1}-Cz_{1}\\ -1-By_{2}-Cz_{2}\\ ...\\ -1-By_{N}-Cz_{N} \end{bmatrix} X= x1x2...xN X= 1By1Cz11By2Cz2...1ByNCzN

现在的问题是找到合适的参数A使得AX最接近{X}‘,它们的误差向量为AX-{X}’,从几何的角度来看当误差向量AX-{X}'与X正交时有最优系数,即
在这里插入图片描述
将(5)展开可得:
在这里插入图片描述
可以看到(6)式即为(3)中的第一项。
我们分别令
Y = [ y 1 y 2 . . . y N ] , Y ′ = [ − 1 − A x 1 − C z 1 − 1 − A x 2 − C z 2 . . . − 1 − A x N − C z N ] , Z = [ z 1 z 2 . . . z N ] , Z ′ = [ − 1 − A x 1 − B y 1 − 1 − A x 2 − B y 2 . . . − 1 − A x N − B y N ] ,同样地我们有: Y T ( B Y − Y ′ ) = 0 , Z T ( C Z − Z ′ ) = 0 Y=\begin{bmatrix} y_{1}\\ y_{2}\\ ...\\ y_{N} \end{bmatrix},{Y}'=\begin{bmatrix} -1-Ax_{1}-Cz_{1}\\ -1-Ax_{2}-Cz_{2}\\ ...\\ -1-Ax_{N}-Cz_{N} \end{bmatrix},Z=\begin{bmatrix} z_{1}\\ z_{2}\\ ...\\ z_{N} \end{bmatrix},{Z}'=\begin{bmatrix} -1-Ax_{1}-By_{1}\\ -1-Ax_{2}-By_{2}\\ ...\\ -1-Ax_{N}-By_{N} \end{bmatrix},同样地我们有:Y^{T}(BY-{Y}')=0,Z^{T}(CZ-{Z}')=0 Y= y1y2...yN Y= 1Ax1Cz11Ax2Cz2...1AxNCzN Z= z1z2...zN Z= 1Ax1By11Ax2By2...1AxNByN ,同样地我们有:YT(BYY)=0ZT(CZZ)=0,展开后发现它们分别是式(3)中的第2和第3项。

我们可以看到利用求误差函数的极小值方法与几何方法最后的最优最小二乘解的表达式是一样的。利用该方法我们很容易求得空间中三维点云构成的物体在局部的法向量,从而进行相关的计算,例如,计算该点的声波散射分布情况,或者是计算该点光波散射情况。

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

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

相关文章

Linux-8 用户管理

Linux-8 用户管理 什么是用户? Linux/Windows通过用户来管理和维护系统; Windows下的管理员用户:AdministratorLinux下的管理员用户:root Windows/Linux都是多用户系统 Windows同一时间只能使用1个用户Linux可以多用户同时登陆&…

STL - Vector容器

基本概念 功能: vector数据结构和数组十分类似,也成为单端数组 vector和普通数组的区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间后续再接空间&#x…

【pandas】用户手册:10分钟熟悉pandas(下)

数据分组 Splitting : 利用某些条件将数据进行分组Applying : 函数应用于每个单独的分组Combining : 合并最终的结果 df pd.DataFrame({"A": ["foo", "bar", "foo", "bar", "foo", "bar", "foo&q…

【正点原子FPGA连载】第十四章Linux基础外设的使用 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十四章Linux基…

百趣代谢组学文献分享:间歇性禁食调节糖尿病脑损伤多组学研究

百趣代谢组学文献分享,糖尿病已经成为一个全球问题,国际糖尿病联盟(IDF)发布的全球糖尿病地图(第9版)[1]显示,全球糖尿病患者人数不断上升,全球平均增长率为51%,目前有4.…

C#,图像二值化(23)——局部阈值的绍沃拉算法(Sauvola Thresholding)及源程序

1、局部阈值的绍沃拉算法(Sauvola Thresholding)Niblack和Sauvola阈值算法Niblack和Sauvola阈值是局部阈值技术,对于背景不均匀的图像非常有用,尤其是对于文本识别1、2。代替为整个图像计算单个全局阈值,通过使用考虑到…

【5】K8S_Deployment

目录 1、Deployment作用 2、deployment的冗余能力 3、deployment的多副本部署 4、deployment的扩缩容 5、deployment的自愈能力 6、滚动更新 7、版本回退 1、Deployment作用 控制Pod,使Pod拥有多副本,自愈,扩缩容等能力 2、deployme…

【正点原子FPGA连载】第十五章开发环境搭建 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第十五章开发环境…

uniapp 窗口小工具、桌面小部件、微件(日历、时间) Ba-AwCalendarS

简介(下载地址) Ba-AwCalendarS 是一款窗口小工具(桌面小部件、微件)插件,默认为简单的时间样式,有其他界面需要,可联系作者定制。 支持定时更新(本插件为每分钟)支持点…

基于springboot,vue二手交易平台

开发工具:IDEA服务器:Tomcat9.0, jdk1.8项目构建:maven数据库:mysql5.7系统用户前台和管理后台两部分,项目采用前后端分离前端技术:vue elementUI服务端技术:springbootmybatis项目功…

【数据结构】开端序幕

写在前面,感同身受初学数据结构,是不是一脸懵,下面你中招了几条?😭怎么全是指针!指针都不会啊!怎么变量名那么长,好难理解啊!什么p,什么next,pp->next究竟…

LeetCode[1753]移除石头的最大得分

难度:中等题目:你正在玩一个单人游戏,面前放置着大小分别为 a、b和 c的 三堆 石子。每回合你都要从两个 不同的非空堆 中取出一颗石子,并在得分上加 1分。当存在 两个或更多 的空堆时,游戏停止。给你三个整数 a、b和 c…

动手深度学习-多层感知机

目录感知机多层感知机激活函数sigmoid函数tanh函数ReLU函数多层感知机的简洁实现参考教程:https://courses.d2l.ai/zh-v2/ 感知机 模型: 感知机模型就是一个简单的人工神经网络。 感知机是二分类的线性模型,其输入是实例的特征向量&#x…

智慧管廊智能化运维管理平台详情

运维管理平台 ​ 平台主界面完成各分系统情况的全局性展现,用图形界面的方法提升视觉效果感染力,根据图色区分正常、异常情况。 1、自然环境及设备监控 ​ 选用全景分层三维可视化地理信息系统及其多元化的二维在线地图从温度、风速、电力、排水、安防…

windows检测远程主机是否连通或者某个端口是否开启

文章目录一、检测主机是否连通步骤二、测试端口是否打开步骤telnet安装一、检测主机是否连通 ping命令是个使用频率极高的网络诊断工具,在Windows、Unix和Linux系统下均适用。它是TCP/IP协议的一部分,用于确定本地主机是否能与另一台主机交换数据报。根…

2022年度总结 EXI-小洲

文章目录一、第一次自我介绍二、2022我都干了些什么(我的收获)1.大专顺利毕业2.后端开发辞职3.第二次代表学校参加江西省职业院校大数据技能大赛4.专升本考试5.参加泰迪杯第五届"数据分析技能赛"6.在csdn开始写博文7.在本科阶段,我又认识了几个会喝点酒的…

【2022年度总结】总结过去,展望未来

文章目录前言回顾过去一、刷题道路两眼黑二、助人为乐本身便是一种快乐展望未来兔年Flag博客文章竞赛目标学习目标志同道合前言 注册CSDN一年了,新年伊始,正好趁着这个时间复盘一下逝去的2022! 很幸运,在对计算机知识懵懂无知的时…

分布式调度XXL-JOB急速入门

文章目录1.业界分布式定时任务框架简介2.分布式调度XXL-JOB核心特性3.Docker部署MySQL8.04.XXL-JOB数据库脚本介绍5.Docker部署XXL-JOB服务端6.XXL-JOB UI菜单模块介绍7.SpringBoot整合XXL-JOB8.分布式调度参数传递9.分布式调度日志埋点10.自定义返回执行成功或失败11.XXL-Job高…

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(二)

C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(二) 测试软件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 在上次的分享中,我们了解了TIA博途一侧的具体组态配置,具体内容可参考以下链接中的内容: C#上位机基础学习_基于SOCKET实现与PLC服务…

【ROS】—— 机器人系统仿真 —URDF优化_xacro (十四)

文章目录前言1. URDF优化_xacro2. Xacro_快速体验3. Xacro_语法详解3.1 属性与算数运算3.2 宏3.3 文件包含4. Xacro_完整使用流程示例4.1 编写 Xacro 文件4.2 集成launch文件5. Xacro_实操前言 📢本系列将依托赵虚左老师的ROS课程,写下自己的一些心得与笔…