最小二乘拟合圆柱

目录

  • 一、算法原理
  • 二、代码实现

在这里插入图片描述

本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。

一、算法原理

  由圆柱面的几何特性可得,圆柱面上的点到其轴线的距离恒等于半径 r 0 r_0 r0,如图1 所示。
在这里插入图片描述

  其中, P P P为圆柱面上任意一点, P 0 ( x 0 , y 0 , z 0 ) P_0( x_0,y_0,z_0) P0(x0y0z0) 为圆柱轴线上一点, ( a , b , c ) ( a,b,c) (abc)为圆柱轴线向
量, r 0 r_0 r0为圆柱底圆半径。圆柱面上任意一点到其轴线的距离为半径 r 0 r_0 r0,即:
( x − x 0 ) 2 + ( y − y 0 ) 2 + ( z − z 0 ) 2 − [ a ( x − x 0 ) + b ( y − y 0 ) + c ( z − z 0 ) ] 2 = r 0 2 (1) (x-x_0)^2+(y-y_0)^2+(z-z_0)^2-[a(x-x_0)+b(y-y_0)+c(z-z_0)]^2=r_0^2\tag{1} (xx0)2+(yy0)2+(zz0)2[a(xx0)+b(yy0)+c(zz0)]2=r02(1)

  式( 1) 即为圆柱面方程。根据圆柱面上点的坐标 ( x , y , z ) ( x,y,z) (xyz),求出圆柱轴线上一点 ( x 0 , y 0 , z 0 ) ( x_0,y_0,z_0) (x0y0z0) 、圆柱轴线向量 ( a , b , c ) ( a,b,c) (abc) 、圆柱底圆半径 r 0 r_0 r0这七个参数,就可以唯一确定一个圆柱。

柱面拟合方法详细步骤如下:
(1) 确定柱面模型参数初始值。圆柱拟合初值的估计原理如下:

  搜寻圆柱面上任意一点的若干邻近点,将这些点拟合成平面,得到的平面法向量单位化即该点的单位法向量。对圆柱面上每个点处理,得到每个点的单位法向量。将每个点的单位法向量看成点,将这些点拟合成平面,得到平面法向量,即圆柱轴线向量初始值 a 0 、 b 0 、 c 0 a_0、b_0、c_0 a0b0c0,该步骤使用了主成分分析法进行求解。
  先对圆柱进行坐标转换,使圆柱轴线向量 ( a 0 , b 0 , c 0 ) (a_0,b_0,c_0) (a0b0c0)变换为平行 Z Z Z轴的向量即为 ( 0 , 0 , ( a 0 ) 2 + ( b 0 ) 2 + ( c 0 ) 2 ) ( 0,0,\sqrt{( a_0 )^ 2 + ( b_0)^2 + ( c_0)^ 2} ) (00(a0)2+(b0)2+(c0)2 ) 。设旋转矩阵为 R 3 × 3 R_{3 ×3} 3×3,要使:
在这里插入图片描述
在这里插入图片描述
  将旋转矩阵与圆柱上的点的坐标 ( x , y , z ) (x,y,z) (x,y,z)相乘,得到的新坐标 ( x ′ , y ′ , z ′ ) (x',y',z') (x,y,z),将新坐标中的 x ′ , y ′ x',y' x,y取出得新坐标系下圆柱底面的坐标,根据 ( x ′ , y ′ ) (x',y') (x,y)可拟合一个圆。
  圆的方程为 ( x − x 1 0 ′ ) 2 + ( y − y 1 0 ′ ) 2 = ( r 0 ) 2 (x-x_1^{0'})^2+(y-y_1^{0'})^2=(r_0)^2 (xx10)2+(yy10)2=(r0)2若知道圆心坐标 x 1 0 ′ , y 1 0 ′ x_1^{0'},y_1^{0'} x10,y10、半径 r 0 r_0 r0这三个参数,就可以唯一确定一个圆面。
  首先,圆坐标 ( x ′ , y ′ ) (x',y') (x,y)准备完毕;其次,找误差方程,将圆的方程展开得到 x 2 + ( x 1 0 ′ ) 2 + y 2 + ( y 1 0 ′ ) 2 − 2 y y 1 0 ′ − ( r 0 ) 2 = 0 x^2+(x_1^{0'})^2+y^2+(y_1^{0'})^2-2yy_1^{0'}-(r_0)^2=0 x2+(x10)2+y2+(y10)22yy10(r0)2=0,即 2 x ( x 1 0 ′ ) + 2 y ( y 1 0 ′ ) + ( r 0 ) 2 − ( x 1 0 ′ ) 2 − ( y 1 0 ′ ) 2 − ( x 2 + y 2 ) = 0 2x(x_1^{0'})+2y(y_1^{0'})+(r_0)^2-(x_1^{0'})^2-(y_1^{0'})^2-(x^2+y^2)=0 2x(x10)+2y(y10)+(r0)2(x10)2(y10)2(x2+y2)=0。可以设 x 1 0 ′ 、 y 1 0 ′ 、 ( r 0 ) 2 − ( x 1 0 ′ ) 2 − ( y 1 0 ′ ) 2 x_1^{0'}、y_1^{0'}、(r_0)^2-(x_1^{0'})^2-(y_1^{0'})^2 x10y10(r0)2(x10)2(y10)2为待求参数。于是误差方程为: V = 2 x ( x 1 0 ′ ) + 2 y ( y 1 0 ′ ) + ( r 0 ) 2 − ( x 1 0 ′ ) 2 − ( y 1 0 ′ ) 2 − ( x 2 + y 2 ) V=2x(x_1^{0'})+2y(y_1^{0'})+(r_0)^2-(x_1^{0'})^2-(y_1^{0'})^2-(x^2+y^2) V=2x(x10)+2y(y10)+(r0)2(x10)2(y10)2(x2+y2),写成矩阵的形式即:

在这里插入图片描述
在这里插入图片描述

  假设获取的圆的点等精度,即等权。根据线性最小二乘原理,即 V T V = m i n V^TV=min VTV=min,求得位置参数 X X X
X = ( B T B ) − 1 B T L (5) X=(B^TB)^{-1}B^TL\tag{5} X=(BTB)1BTL(5)
  求出新坐标系下圆柱轴线上一点的初始值 x 1 0 ′ , y 1 0 ′ x_1^{0'},y_1^{0'} x10,y10以及底圆半径的初始值 r 0 r_0 r0,再根据公式:
在这里插入图片描述
  将新坐标系下的 x 1 0 ′ , y 1 0 ′ x_1^{0'},y_1^{0'} x10,y10转换成旧坐标系下的坐标 x 1 0 , y 1 0 x_1^{0},y_1^{0} x10,y10。无论在新坐标系下还是在旧坐标系下,底圆半径的初值 r 0 r_0 r0都不变。为了尽量减小误差,将圆柱轴线上一点的初值 z 1 0 z_1^{0} z10的值设为原坐标系下圆柱点 z z z的最大值与最小值和的一半。于是求出圆柱轴线上一点、圆柱底半径这四个参数的初始值 x 1 0 , y 1 0 , z 1 0 , r 0 x_1^{0},y_1^{0},z_1^{0},r_0 x10,y10,z10,r0
  (2)建立改进误差方程式求解参数值。圆柱面方程为:
( x − x 1 ) 2 + ( y − y 1 ) 2 + ( z − z 1 ) 2 − [ a ( x − x 1 ) + b ( y − y 1 ) + c ( z − z 1 ) ] 2 = r 2 (7) (x-x_1)^2+(y-y_1)^2+(z-z_1)^2-[a(x-x_1)+b(y-y_1)+c(z-z_1)]^2=r^2\tag{7} (xx1)2+(yy1)2+(zz1)2[a(xx1)+b(yy1)+c(zz1)]2=r2(7)
传统方法,令
f = ( x − x 1 ) 2 + ( y − y 1 ) 2 + ( z − z 1 ) 2 − [ a ( x − x 1 ) + b ( y − y 1 ) + c ( z − z 1 ) ] 2 − r 2 (8) f=(x-x_1)^2+(y-y_1)^2+(z-z_1)^2-[a(x-x_1)+b(y-y_1)+c(z-z_1)]^2-r^2\tag{8} f=(xx1)2+(yy1)2+(zz1)2[a(xx1)+b(yy1)+c(zz1)]2r2(8)
f f f线性化得
在这里插入图片描述
  这样,误差方程可列为:
在这里插入图片描述
其中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
V n × 1 = B n × 7 X 7 × 1 − L n × 1 (23) V_{n\times 1}=B_{n\times 7}X_{7\times 1}-L_{n\times 1}\tag{23} Vn×1=Bn×7X7×1Ln×1(23)

  假设获取的圆柱面上的点等精度,即权相等。根据最小二乘原理,求得参数
X = ( B T B ) − 1 B T L (24) X=(B^TB)^{-1}B^TL\tag{24} X=(BTB)1BTL(24)
  这是一个循环的迭代过程,每一次迭代计算过程中代入的初值都等于上一次的初值加上求出的 X X X的改正值,当 X X X的数值小到满足要求的精度时推出迭代。

二、代码实现

在这里插入图片描述

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

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

相关文章

Java自学到什么程度就可以去找工作了?

引言 Java作为一门广泛应用于软件开发领域的编程语言,对于初学者来说,了解到什么程度才能开始寻找实习和入职机会是一个常见的问题。 本文将从实习和入职这两个方面,分点详细介绍Java学习到什么程度才能够开始进入职场。并在文章末尾给大家安…

基于springboot+vue的博物馆藏品平台(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

剑指 Offer 48. 最长不含重复字符的子字符串(C++实现)

剑指 Offer 48. 最长不含重复字符的子字符串https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/ dp 注意:缩小 不含重复字符子串 时的写法 dp_1 min(i - charToIndex[s[i]], dp_0 1); int lengthOfLongestSubstring(string s…

python中使用xml快速创建Caption和URL书签管理器应用程序

导语: 本文介绍如何使用wxPython库创建一个Caption和URL管理器应用程序。该应用程序具有图形用户界面,允许用户输入Caption和URL,并将其保存到XML文件中。此外,还提供了浏览文件夹并选择HTML文件的功能,并可以运行另一…

深入解析淘宝API,实现高效商务应用

淘宝API的基本调用 1. API文档与SDK 淘宝API官方提供了详细的API文档,包含了API的使用说明、参数列表、示例代码等内容。开发者可以通过文档了解每个API接口的具体功能和使用方法。此外,淘宝API还提供了多种编程语言的SDK,方便开发者进行快速…

jupyter notebook出现ERR_SSL_VERSION_OR_CIPHER_MISMATCH解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

c#扩展方法的使用

扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…

python爬虫9:实战2

python爬虫9:实战2 前言 ​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好…

Linux中shell脚本——for、while循环及脚本练习

目录 一.for循环 1.1.基本格式 1.2.类C语言格式 二.while循环 2.1.基本格式 2.2.死循环语句 三.跳出循环 3.1.continue跳出循环 3.2.break跳出循环 四.常用循环 4.1.循环打印九九乘法表 4.2.循环ping测试某个网段网络连通性 4.3.while死循环实现猜数字游戏 4.4.数…

Linux的热拔插UDEV机制

文章目录 UDEV简介守护进程基本特点 守护进程和后台进程的区别开发守护进程结束 UDEV简介 udev是一个设备管理工具,udev以守护进程的形式运行,通过侦听内核发出来的uevent来管理/dev目录下的设备文件。 udev在用户空间运行,而不在内核空间 …

硬编码基础一(经典定长指令,寄存器相关)

硬编码基础一(定长指令) push/pop 通用寄存器 50~57是push8个32位通用寄存器 58~5f是pop8个32位通用寄存器 inc/dec 通用寄存器 40~47是inc8个32位通用寄存器 47~4f是dec8个32位通用寄存器 八位通用寄存器的立即数赋值 b0~b3 {立即数} 是低八位(…

【使用Zookeeper当作注册中心】自己定制负载均衡常见策略

自己定制负载均衡常见策略 一、前言随机(Random)策略的实现轮询(Round Robin)策略的实现哈希(Hash)策略 一、前言 大伙肯定知道,在分布式开发中,目前使用较多的注册中心有以下几个&…

Typescript基础知识(类型拓宽、类型缩小)

系列文章目录 引入一:Typescript基础引入(基础类型、元组、枚举) 引入二:Typescript面向对象引入(接口、类、多态、重写、抽象类、访问修饰符) 第一章:Typescript基础知识(Typescri…

elementPlus——图标引入+批量注册全局组件——基础积累

因为我们要根据路由配置对应的图标,也要为了后续方便更改。因此我们将所有的图标注册为全局组件。(使用之前将分页器以及矢量图注册全局组件的自定义插件)(所有图标全局注册的方法element-plus文档中已给出) 全局注册…

Docker-compose详解和LNMP搭建实战

目录 一、Docker-compose简介 1.前言 2.概述 二、Docker-compose安装 安装源获取 安装包下载 三、YAML文件格式及编写注意事项 1.简介 2.使用方法 四、Docker Compose 常用命令 五、Docker Compose 配置常用字段 六、Docker-compose搭建LNMP实战 一、Docker-compose…

MySQL的安装以及卸载

下载官网 https://www.mysql.com/ 切到下载tab页 找到 MySQL Community Server 或者 MySQL Community (GPL) Downloads --> MySQL Community Server 点击download按钮: 点击download进入下载页面选择No thanks, just start my download就可以开始下载了。 下…

【ARM】Day5 uart总线, LED点亮实验(C语言实现)

1. 思维导图 2. LED点灯实验(C语言实现) gpio.h #ifndef _LED_H__ //防止头文件重复包含_ #define _LED_H__//RCC_MP_AHB4ENSETR寄存器封装 #define RCC_MP_AHB4ENSETR (*(volatile unsigned int*)0x50000A28)//GPIO使用封装结构体 typedef struct{v…

【Linux】进程优先级

一、基本概念 Hello,大家好。本文我们要来介绍的是有关Linux下【进程优先级】,首先我们要了解的是其基本概念 在 Linux基础篇之权限 一文中我们有谈到过什么是权限,在Linux下有权限和无权限的区别在哪里。那现在的话我们就要来对比一下【权限…

js 的正则表达式(二)

1.正则表达式分类: 正则表达式分为普通字符和元字符。 普通字符: 仅能够描述它们本身,这些字符称作普通字符,例如所有的字母和数字。也就是说普通字符只能够匹配字符串中与它们相同的字符。 元字符: 是一些具有特殊含…

一文科普,配资门户网是什么?

配资门户网是一个为投资者提供配资服务的平台。配资是指通过借用他人资金进行投资交易的一种金融操作方式。配资门户网作为一个线上平台,为投资者提供了方便、快捷的配资服务。 配资门户网提供了多种不同的配资方案,以满足不同投资者的需求。投资者可以…