曲线拟合基础知识

2024-03-13 17:28
文章标签 基础知识 曲线拟合

本文主要是介绍曲线拟合基础知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 介绍最小二乘法:           最小二乘法(Least Squares)简介-CSDN博客

     例如下图,找到一个方程,此方程要满足:把每个点带入计算得到的 预测结果 与 实际结果 的误差(残差)的平均值越小越好。如下红色线就是找到的方程,找这个方程的方法可以用 最小二乘法

最小二乘法,为什么叫二乘法?

​二乘其实是指平方的意思,为什么用平方呢?因为平方可以消除误差正负方向上的差异,单纯的只比较长度

最小二乘法主要包含了两大类方法,一种是线性最小二乘法(Linear Least Squares),一种是非线性最小二乘法(Nonlinear Least Squares)。

slam第六讲 http://admin.guyuehome.com/41198


曲线拟合 实现 一 基于最小二乘法的多项式曲线拟合:从原理到c++实现 - 知乎

#include <iostream>                   //输入输出头文件
#include <opencv2/core/core.hpp>     //opencv核心代码头文件
#include <ceres/ceres.h>            //ceres 头文件
#include <chrono>                  //计时用using namespace std;
//假设输入的数据为 (1, 2)  (2, 3)  (3, 4)  (4, 5) //用于存储构建线性方程组的《系数矩阵》 向量 B 被用于存储构建线性方程组的《常数向量》//矩阵A例子如下//  [ 4         10         30         100        4对应常数项系数//    10        30         100        354        4900对应三次项系数//    30        100        354        1300       //    100       354        1300       4900]      //矩阵B为// B = | 14 |//     | 42 |//     | 130|//     | 500|
// 拟合结果(coeff)为:  对应的方程为 y = -28 * x^0 + 66.5 * x + (-36.5) * x^2 + 5.5 * x^3
// coeff = [[-28],
// [ 66.5],
// [-36.5],
// [ 5.5]]//代数方式求解  order多项式的阶数,即拟合曲线的最高次幂   coeff指向输出参数(拟合曲线的系数)的指针。这是一个 cv::Mat 对象,将被用于存储计算得到的系数
void PolyFit(const std::vector<cv::Point2f> &points, const int order,cv::Mat *coeff) 
{const int n = points.size();cv::Mat A = cv::Mat::zeros(order + 1, order + 1, CV_64FC1);//矩阵 A 初始化为大小为 (order + 1) x (order + 1) 的零矩阵,   CV_64FC1表示双精度cv::Mat B = cv::Mat::zeros(order + 1, 1, CV_64FC1);//初始化为大小为 (order + 1) x 1 的零向量   《结果向量 B 即常数向量》
//已知order == 3// 构建A矩阵for (int i = 0; i < order + 1; ++i) {for (int j = 0; j < order + 1; ++j) {for (int k = 0; k < n; ++k) //遍历输入点集{A.at<double>(i, j) += std::pow(points.at(k).x, i + j);// 累加所有点的 x的(i+j)次幂 }}}// 构建B矩阵for (int i = 0; i < order + 1; ++i) {for (int k = 0; k < n; ++k) {B.at<double>(i, 0) += std::pow(points.at(k).x, i) * points.at(k).y;//B = [所有x的0次方的累加和 * y ,所有x的1次方的累加和 * y,所有x的2次方的累加和 * y,所有x的3次方的累加和 * y]}}//通过求解线性方程组 A * coeff = B,得到多项式的系数 coeff(*coeff) = cv::Mat::zeros(order + 1, 1, CV_64FC1);//4x1的零矩阵// 求解 通过解线性方程组得到多项式拟合的系数,并将结果存储在 *coeff 中if (!cv::solve(A, B, *coeff, cv::DECOMP_LU)) {std::cout << "Failed to solve !" << std::endl;}
}
// 矩阵方式求解
void PolyFit(const std::vector<cv::Point2f> &points, const int order,cv::Mat *coeff) {cv::Mat A = cv::Mat::ones(n, order + 1, CV_64FC1);cv::Mat B = cv::Mat::zeros(n, 1, CV_64FC1);for (int i = 0; i < n; ++i) {const double a = points.at(i).x;const double b = points.at(i).y;B.at<double>(i, 0) = b;for (int j = 0, v = 1.0; j < order + 1; ++j, v *= a) {A.at<double>(i, j) = v;}}// 使用cv::solve求解(A^T * A) * coeff = A^T * Bcv::Mat At = A.t();cv::Mat AtA = At * A;cv::Mat AtB = At * B;cv::solve(AtA, AtB, *coeff, cv::DECOMP_NORMAL);
}
float PolyValue(const cv::Mat &coeff, const int order, const float x) {float v = 0;for (int i = 0; i < order; ++i) {v += coeff.at<double>(i, 0) * std::pow(x, i);}return v;
}int main(int argc, char **argv) {constexpr int kOrder = 3; // 多项式阶数constexpr int kWidth = 1000;constexpr int kHeight = 500;cv::Mat canvas =cv::Mat(cv::Size(kWidth, kHeight), CV_8UC3, cv::Scalar(255, 255, 255));cv::RNG rng(0xFFFFFFFF); // 随机数// 生成点集,y坐标添加一些随机噪声std::vector<cv::Point2f> raw_points;for (int i = 10; i < kWidth; i += 10) {cv::Point2f p;p.x = i;const auto noise = rng.uniform(-kHeight / 10, kHeight / 10);p.y = kHeight - p.x / kWidth * kHeight + noise;cv::circle(canvas, p, 5, cv::Scalar(0, 0, 255), -1);raw_points.emplace_back(p);}// 多项式拟合cv::Mat coeff;PolyFit(raw_points, kOrder, &coeff);// 用拟合后的系数重新生成点集std::vector<cv::Point> poly_points;for (const auto &rp : raw_points) {cv::Point p;p.x = rp.x;p.y = PolyValue(coeff, kOrder, rp.x);cv::circle(canvas, p, 5, cv::Scalar(0, 255, 0), -1);poly_points.emplace_back(p);}cv::polylines(canvas, poly_points, false, cv::Scalar(0, 255, 0), 3,cv::LINE_4);cv::imshow("PolyFit", canvas);cv::waitKey(0);cv::destroyAllWindows();return 0;
}

这篇关于曲线拟合基础知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/805620

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

计组基础知识

操作系统的特征 并发共享虚拟异步 操作系统的功能 1、资源分配,资源回收硬件资源 CPU、内存、硬盘、I/O设备。2、为应⽤程序提供服务操作系统将硬件资源的操作封装起来,提供相对统⼀的接⼝(系统调⽤)供开发者调⽤。3、管理应⽤程序即控制进程的⽣命周期:进程开始时的环境配置和资源分配、进程结束后的资源回收、进程调度等。4、操作系统内核的功能(1)进程调度能⼒: 管理进程、线

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

关于回调函数和钩子函数基础知识的整理

回调函数:Callback Function 什么是回调函数? 首先做一个形象的比喻:   你有一个任务,但是有一部分你不会做,或者说不愿做,所以我来帮你做这部分,你做你其它的任务工作或者等着我的消息,但是当我完成的时候我要通知你我做好了,你可以用了,我怎么通知你呢?你给我一部手机,让我做完后给你打电话,我就打给你了,你拿到我的成果加到你的工作中,继续完成其它的工作.这就叫回叫,手机

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

OpenGL ES学习总结:基础知识简介

什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库。 为桌面版本OpenGL 的一个子集。 OpenGL ES管道(Pipeline) OpenGL ES 1.x 的工序是固定的,称为Fix-Function Pipeline,可以想象一个带有很多控制开关的机器,尽管加工

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结构:总线型 星型(逻辑总线型) 介质访问控制  静态划分信道 信道划分介质访问控制 频分多路复用FDM 时分多路复用TDM 波分多路复用WDM 码分多路复用CDM 动态分配信道 轮询访问介质访问控

Gitflow基础知识

0.理想状态 现状 听完后的理想状态 没使用过 git 知道 git 是什么,会用 git 基础流程命令 用过 git,但只通过图形化界面操作 脱离图形化界面操作,通过 git 命令操作 会 git 命令 掌握 gitflow 规范,合理使用 rebase 和解决代码冲突问题 1.Git 的基础流程&命令 1.1 基础概念 工作区:代码生产基地,pycharm

[JAVA基础知识汇总-1] 创建线程的几种方式

文章目录 1. 继承Thread类2. 实现Runnable接口3. 实现Callable接口4. 线程池 可以认为有四种方式,也可以认为有一种,因为都跟Runnable接口有关 1. 继承Thread类 代码 public class Thread1ExtendsThread extends Thread {// public Thread1(String n