最小二乘法圆拟合(附完整代码)

2023-11-07

一、2D圆弧拟合

1、不经过给定起点与终点

  平面圆的一般方程为:
x 2 + y 2 + a x + b y + c = 0 (1) x^2 + y^2 + ax + by +c = 0\tag 1 x2+y2+ax+by+c=0(1)
  其中, a , b , c ∈ R a,b,c\in R a,b,cR
  式(1)配方,可以得到:
( x + a / 2 ) 2 + ( x + b / 2 ) 2 = a 2 / 4 + b 2 / 4 − c (2) (x + a/2)^2 + (x + b/2)^2 = a^2/4 + b^2/4 - c \tag 2 (x+a/2)2+(x+b/2)2=a2/4+b2/4c(2)

  对于给定的一系列二维数据 ( x i , y i ) , i = 0 , . . . , n (x_i,y_i),i=0,...,n (xi,yi),i=0,...,n,根据式(1)可以列出 n + 1 n+1 n+1个线性方程,然后可以采用最小二乘法求解,非常简单有效。
  不经过给定起点与终点的2D圆弧拟合另一种方法可参考:最小二乘法拟合圆

2、精确经过给定起点与终点

  有时候我们需要约束圆弧精确经过给定起点与终点,设起点坐标为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),终点坐标为 ( x n , y n ) (x_n,y_n) (xn,yn),则有约束等式:
{ x 0 2 + y 0 2 + a x 0 + b y 0 + c = 0 x n 2 + y n 2 + a x n + b y n + c = 0 (3) \begin{cases} x_0^2 + y_0^2 + ax_0 + by_0 +c = 0 \\ x_n^2 + y_n^2 + ax_n + by_n +c = 0 \\ \tag 3 \end{cases} {x02+y02+ax0+by0+c=0xn2+yn2+axn+byn+c=0(3)
  (1)若起点与终点坐标重合,则式(3)退化为一个约束等式,将参数 c c c的表达式代入到式(1),利用最小二乘法求解参数 a , b a,b a,b,再计算参数 c c c
  (2)若 x 0 ≠ x n x_0\ne x_n x0=xn,根据式(3)解出参数 a , c a,c a,c的表达式,然后代入到式(1),利用最小二乘法求解参数 b b b,再计算参数 a , c a,c a,c
  (3)若 y 0 ≠ y n y_0\ne y_n y0=yn,根据式(3)解出参数 b , c b,c b,c的表达式,然后代入到式(1),利用最小二乘法求解参数 a a a,再计算参数 b , c b,c b,c

  circle_fitting_2D.m

function [ center, R, fittingError ] = circle_fitting_2D( points, pointCount, crossStartAndEndPointFlag )
%{
Function: circle_fitting_2D
Description: 2D圆弧拟合
Input: 二维点points, 点个数pointCount, 是否经过起点/终点标志位crossStartAndEndPointFlag
Output: 圆心center, 半径R, 拟合误差fittingError
Author: Marc Pony(marc_pony@163.com)
圆的方程:x^2 + y^2 + a*x + b*y +c = 0  -> (x + a/2)^2 + (x + b/2)^2 = a^2/4 + b^2/4 - c
%}
if crossStartAndEndPointFlag == 0
    x = points(:, 1);
    y = points(:, 2);
    A = [x, y, ones(size(x))];
    B = -x.^2 - y.^2;
    temp = A \ B;
    
    a = temp(1);
    b = temp(2);
    c = temp(3);
else
    x0 = points(1, 1);
    y0 = points(1, 2);
    xn = points(pointCount, 1);
    yn = points(pointCount, 2);
    x = points(2 : pointCount - 1, 1);
    y = points(2 : pointCount - 1, 2);
    EPS = 1.0e-4;
    
    if abs(x0 - xn) < EPS && abs(y0 - yn) < EPS %起点与终点重合
        A = [x - x0, y - y0];
        B = x0^2 + y0^2 - x.^2 - y.^2;
        temp = A \ B;
        a = temp(1);
        b = temp(2);
        c = -x0^2 - y0^2 - a * x0 - b * y0;
    else
        if abs(x0 - xn) > abs(y0 - yn)
            A = x * (yn - y0) / (x0 - xn) + y - (x0 * yn - xn * y0) / (x0 - xn);
            B = -x.^2 - y.^2 - x * (xn^2 + yn^2 - x0^2 - y0^2) / (x0 - xn) + ((xn^2 + yn^2) * x0 - (x0^2 + y0^2) * xn) / (x0 - xn);
            b = A \ B;
            P = -x0^2 - y0^2 - b * y0;
            Q = -xn^2 - yn^2 - b * yn;
            a = (P - Q) / (x0 - xn);
            c = -(P * xn - Q * x0) / (x0 - xn);
        else
            A = x * (xn - x0) / (y0 - yn) + y - (y0 * xn - yn * x0) / (y0 - yn);
            B = -x.^2 - y.^2 - x * (yn^2 + xn^2 - y0^2 - x0^2) / (y0 - yn) + ((yn^2 + xn^2) * y0 - (y0^2 + x0^2) * yn) / (y0 - yn);
            a = A \ B;
            P = -y0^2 - x0^2 - a * x0;
            Q = -yn^2 - xn^2 - a * xn;
            b = (P - Q) / (y0 - yn);
            c = -(P * yn - Q * y0) / (y0 - yn);
        end
    end
end

R = sqrt(a^2 / 4 + b^2 / 4 - c);
center(1) = -a / 2;
center(2) = -b / 2;
fittingError = sqrt((points(:, 1) - center(1)).^2 + (points(:, 2) - center(2)).^2) - R;

end

  test_circle_fitting_2D.m

clc
clear
close all

%% 绘参考圆
figure
axis([0 100 0 100])
theta = linspace(0, 2*pi, 1000);
r = 30;
x = 50 + r*cos(theta);
y = 50 + r*sin(theta);
plot(x,y,'g--')
hold on
axis equal

%% 左键点击取点,按回车键退出
pos = ginput();
%pos = [pos;pos(1,1), pos(1,2)];  %起点与终点重合
pointCount = size(pos, 1);
plot(pos(1, 1), pos(1, 2), 'k+')
plot(pos(pointCount, 1), pos(pointCount, 2), 'k+')
plot(pos(2:pointCount-1, 1), pos(2:pointCount-1, 2), 'o')

%% 圆最小二乘拟合
crossStartAndEndPointFlag = 1; %0:不经过给定起点与终点;  1:精确经过给定起点与终点
[ center, R, fittingError ] = circle_fitting_2D( pos, pointCount, crossStartAndEndPointFlag )

x = center(1) + R * cos(theta);
y = center(2) + R * sin(theta);
plot(x, y, 'b')                   
plot(center(1), center(2), 'b+')
plot(center(1), center(2), 'bo')

在这里插入图片描述

二、3D圆弧拟合

   3D圆弧拟合可以分解两个问题:
   (1)三维点的球面拟合(见博文:最小二乘法球面拟合(附完整代码))
   (2)平面拟合
  球面拟合后,球心便为3D圆弧的圆心,平面拟合则可以得到3D圆弧所在平面的法向量,3D圆弧的方程便确定。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小二乘法圆拟合(附完整代码) 的相关文章

  • 最小二乘法,最大似然估计什么情况下统一

    机器学习中 线性回归算法用到最小二乘法 逻辑回归算法用到最大似然估计 在推导梯度的过程中 发现结果一样 这是为何呢 目录 一 最小二乘法1 基本思想2 作用3 如何求解最小二乘法 二 最大似然估计1 概念2 似然估计的思想是3 如何求解最大
  • 【线性代数】最小二乘法的本质、施密特正交化的“前世今生”,投影的核心思想

    目录 一 处理无解线性方程组 1 1 解线性方程组无解的几何意义 1 2 寻求线性方程组的近似解 1 3 利用矩阵描述向一维直线的投影 1 4 利用Python计算无解线性方程组的近似解 二 深入剖析最小二乘法的本质 2 1 互补的子空间
  • 最小二乘法的一般形式和矩阵形式原理推导和代码实现

    转自 作者 金良 golden1314521 gmail com csdn博客 http blog csdn net u012176591 1 线性代数模型 首先给出最小二乘解的矩阵形式的公式 推导过程 条件 矩阵必须是列满秩矩阵 否则的逆
  • 最小二乘法-圆拟合(不啰嗦)

    原理 原理部分网上大部分可以搜得到 以一句很简单的话就是是通过最小化误差的平方和找到一组数据的最佳函数匹配 自行百度 作用 如果现在有一张图片 需要你拟合图片中的圆 需要拟合的圆图片 方法 最小二乘法拟合 原理自行百度 代码 主代码 cle
  • 最小二乘法(OLS)python 实践

    参考链接 1 基本原理 https zhuanlan zhihu com p 149280941 2 python实现 https zhuanlan zhihu com p 22692029 实现结果 线性回归 coding utf 8 简
  • 关于叉积

    学过计算几何以后 我发现几乎每一道题都用到了叉积这个东西 叉积是什么呢 在这个图中 以原点为中心 叉积就是x1 y2 x2 y1 记得话就记1221 x前y后 但是这并不是完全正确 比如说这个图 在这个图中 点1和点2是以点0为中心 不是原
  • vtk vs2015 win10 64bit 编译注意事项

    记录几个凌乱的关键点 事先安装Qt 我得是5 8版本 需要官网注册之类的 1 关于Python 编译带tcl java python的 vtk 需要很多繁琐的步骤 记录整个过程太恐怖了 vtk暂时不支持python3 支持的还是python
  • 关于使用2d照片进行3d建模

    转载感言 作者一句业余 搞得弟兄们面红耳赤了 感谢作者的可行性分析 Autodesk 的 123D Catch 让我们能够很简单的根据一组照片构建3D物体 你只需要从各个角度拍摄希望建模的物体 然后通过 123D Catch 将照片上传到
  • 最小二乘法(Least square method)

    最小二乘法是在线性回归模型最小化均方误差时使用 其实就是对误差函数求导数 然后让其等于0 然后解出使得误差最小 本篇文章讲解最小二乘法 首先声明 此篇的内容是来自 马同学高等数学 微信公众号的内容 目录 1 日用而不知 2 最小二乘法 3
  • hihoCoder 1582 Territorial Dispute

    Problem hihocoder com problemset problem 1582 vjudge net problem HihoCoder 1582 Reference hihocoder 1582 Territorial Dis
  • hdu 6127 Hard challenge

    Problem acm hdu edu cn showproblem php pid 6127 Meaning 平面上有 n 个不重合的点 任意三点不共线 任意两点所在直线不经原点 每个点有个 value 任意两个点连出的线段的 value
  • 如何进行最小二乘法,并且附加条件呢?

    请问如何运用最小二乘法去解多项式 然后保证得到的结果都大于0呢
  • 计算几何02_三次样条曲线

    一 样条 样条 Spline 函数是由舍恩伯格于1946年提出的 样条是富有弹性的细木条或有机玻璃条 它的作用相当于 万能 曲线板 早期船舶 汽车 飞机放样时用铅压铁压住样条 使其通过一系列型值点 调整压铁达到设计要求后绘制其曲线 称为样条
  • 矩阵的投影、线性拟合与最小二乘法

    概要 投影矩阵 如果一个b向量进行矩阵运算 Pb 那么向量b就会投影要A的列空间的最近点 目录 一 矩阵的四大基础子空间 二 投影矩阵 三 最小二乘法 一 矩阵的四大基础子空间 一个矩阵有4个子空间 分别是行空间 零空间 列空间和左零空间
  • CGAL计算几何算法库安装和使用(一)

    CGAL是使用C 开发的计算几何算法库 提供Delaunay三角网 网格生成 多边形 以及各种几何处理算法 应用领域 计算机图形学 科学可视化 计算机辅助设计与建模 地理信息系统 分子生物学 医学影像学 机器人学和运动规划 和数值方法 1
  • 最小二乘法的几种拟合函数

    目录 1 最小二乘法的原理和解决的问题 2 最小二乘法的公式解法 2 1 拟合h x a x 2 2 拟合 h x a0 a1 x 2 3拟合 h x a0 a1 x a3 x 3 因为采用矩阵法来进行最小二乘法的函数拟合时 会出现系数矩阵
  • 我的第一个半平面交(1007: [HNOI2008]水平可见直线)

    点击打开链接 Description Input 第一行为N 0 lt N lt 50000 接下来的N行输入Ai Bi Output 从小到大输出可见直线的编号 两两中间用空格隔开 Sample Input 3 1 0 1 0 0 0 S
  • The centre of polygon (多边形重心)

    描述 Given a polygon your task is to find the centre of gravity for the given polygon 输入 The input consists of T test case
  • 豪斯多夫距离-- Hausdorff distance of convex polygons

    蒙特利尔的麦吉尔大学的计算几何课程资料 原文链接 http cgm cs mcgill ca godfried teaching cg projects 98 normand main html 1 Introduction When ta
  • Ceres Solver从零开始手把手教学使用

    目录 一 简介 二 安装 三 介绍 四 Hello Word 五 导数 1 数值导数 2解析求导 六 实践 Powell函数 一 简介 笔者已经半年没有更新新的内容了 最近学习视觉SLAM的过程中发现自己之前学习的库基础不够扎实 Ceres

随机推荐

  • Tomcat目录下写web报500错误

    项目场景 所用Tomcat版本为9 0 16 在Tomcat目录下写web工程并使用cmd黑框打开Tomcat 将 java文件反编译成 class文件 问题描述 当浏览器访问web xml文件下的映射地址时 始终报500错误 原因分析 在
  • 智能指针之概述01

    一 智能指针概述 1 为何使用智能指针 首先我们先谈为何需要智能指针 C 11之前操作堆内存空间都是使用new delete来维护 但是很容易造成new出来的内存忘记delete 开发人员需要大量时间维护修复 而new出来返回的指针也叫裸指
  • Android实现关机代码

    Android实现关机的代码如下 Intent intent new Intent Intent ACTION REQUEST SHUTDOWN intent putExtra Intent EXTRA KEY CONFIRM false
  • vue项目支持js新语法可选链“?.“以及逻辑空分配(双问号)“??“

    先来看两个场景 场景1 我需要判断数组对象中的某个值是否存在进而去做其他事情 let title if data data children data children 0 data children 0 title title data
  • C++:constexpr及constexpr函数

    constexpr变量 constexpr表达式是指值不会改变并且在编译过程就能得到计算结果的表达式 声明为constexpr的变量一定是一个const变量 而且必须用常量表达式初始化 constexpr int mf 20 20是常量表达
  • 【PaddlePaddle飞桨复现论文】—— 2. 采用 DNN 、CNN 和 VGG 实现车牌识别(VGG模型精度提高明显!!)

    一 任务描述 本次实践是一个多分类任务 需要将照片中的每个字符分别进行识别 完成车牌的识别 实践平台 百度AI实训平台 AI Studio PaddlePaddle1 8 0 二 数据集介绍 数据集文件名为characterData zip
  • SpringMVC之JSR303和拦截器

    目录 一 JSR 303 1 1 介绍 1 2 为什么要使用JSR 303 1 3 常用注解 1 4 快速入门 1 4 1 导入依赖 1 4 2 配置校验规则 1 4 3 编写方法校验 1 4 4 测试 二 拦截器 2 1 什么是拦截器 2
  • ClickHouse物化视图(八)

    文章目录 概述 1 物化视图与普通视图的区别 2 优缺点 3 基本语法 1 创建物化视图的限制 2 物化视图的数据更新 4 物化视图创建示例 5 更多文章和干货请关注公众号 概述 ClickHouse 的物化视图是一种查询结果的持久化 它确
  • Vue中TodoList案例_本地存储

    App vue
  • leetcode分类刷题:滑动窗口(三、两个序列+窗口定长类型)

    1 通过对滑动窗口前两个题型的总结 我们几乎已经习惯在给定的一个序列里使用滑动窗口的模板解题了 本次对应的 三 两个序列 窗口定长类型 也是考察连续子数组 连续子串问题 只不过这次会给定两个序列 判断短序列在长序列中是否存在字母异位词或排列
  • SSH 与 SSM

    SSM 指 SpringMVC Spring 和 MyBatis SSH 指 Struts Spring 和 Hibernate 两种框架的对比和对照为 控制器 事务层 持久层 SSH Struts Spring Hibernate SSM
  • Vue组件学习之组件自定义事件

    主要介绍组件的自定义事件的概念 使用等 何为组件自定义事件 组件自定义事件是一种组件间的通信方式 方向是 子组件 gt 父组件 使用场景 A是子组件 B是父组件 如果要把B的数据传给A 可以使用props配置项 如果要把A的数据转给B 就要
  • 【Springboot】集成百度地图实现定位打卡功能

    目录 第一章 需求分析 第二章 概要设计 第三章 详细设计 3 1 环境搭建 3 1 1 获取百度地图ak 3 1 2 创建springboot项目 3 2 配置application properties 3 3 配置pox xml 3
  • pyTorch基本数据类型

    pyTorch基本数据类型 文章目录 pyTorch基本数据类型 首先比较一下python和pytorch的数据类型区别 pyhon的特点 pytorch的特点 维度为0的标量 维度为1的向量 维度为2的Tensor 维度为3的Tensor
  • eclipse学习心得

    1运行程序 在后台遇到断点时 进入debug调试状态 作用域 功能 快捷键 全局 单步返回 F7 全局 单步跳过 F6 全局 单步跳入 F5 全局 单步跳入选择 Ctrl F5 全局 调试上次启动 F11 全局 继续 F8 全局 使用过滤器
  • js设置input只保留一位小数

    前言 input中只保留小数点后一位 直接不让他输入 实现方法 这里主要用 input事件来监听 vue中的话用 input input中加上 type text 注意这里有坑 不能用数字类型 谷歌 360可以 火狐会报错 oninput
  • C++的rapidjson库的安装和用法(包括Windows和Linux)

    C 的rapidjson库的安装和用法 包括Windows和Linux 1 RapidJson在Linux下安装 1 确保安装了git以及cmake make 2 在github官网上clone下RapidJson的工程 git clone
  • SpringMVC实现文件上传和下载功能

    实现文件上传和下载功能 一 文件上传功能 目录结构 设立流程 1 数据库表结构 2 dao包 3 po包 4 service包 5 controller包 6 resources包 7 webapp 8 spring的xml配置文件 9 导
  • JSP实现简单用户登录

    使用初级的JSP代码实现用户登录 使用TXT文件存储用户数据 初学JSP与大家分享一些自己的代码 index jsp
  • 最小二乘法圆拟合(附完整代码)

    文章目录 一 2D圆弧拟合 1 不经过给定起点与终点 2 精确经过给定起点与终点 二 3D圆弧拟合 一 2D圆弧拟合 1 不经过给定起点与终点 平面圆的一般方程为 x 2