opencv的曲线拟合polyfit
推荐一个不错的网页,可以直接用solve函数求解方程组:
http://m.blog.csdn.net/u014652390/article/details/52789591
4.1 曲线拟合的最小二乘法

求以下拟合函数

拟合条件:拟合曲线与各数据点在y方向的误差平方和最小.
拟合函数为一元函数时--函数图形为平面曲线--曲线拟合
解决曲线拟合,最先是确定拟合函数的形式。即适当选取

选幂函数{1,x,x2, ···,xn}, 则多项式拟合函数φ(x)可表示为:
φ(x)=a0+a1*x+a2*x2+a3*x3+......+an*xn =[a0 a1 a2 ...... an][1 x1 x12 ... ... x1n]T (n+1<m)
a0、a1、a2......an是幂系数,也是拟合所求的未知量。
实际中拟合函数有指数函数、三角函数等,根据数据 的分布特点来选取合适的拟合函数。
将第 i 个样本点的x坐标带入φ(x),得到:

这个就是二次方程,我们期望S最小。此时,方程中的x、y已知,想求的是a0 a1 a2 ...... an。
S最小的必要条件是:

整理得到如下正规方程组:

解此方程组得系数a0 a1 a2 ...... an,, 得出拟合函数φ(x)
最小二乘法:以残差平方和最小问题的解来确定拟合函数
二、超定方程组得最小二乘解
将
写成向量内积形式:

a0 a1 a2 ...... an为待定系数,满足:

此m个等式如下建立方程组:

方程数(m)多于未知数个数(n+1),此类方程组称为超定方程组。下列正规方程组中k个方程中aj的系数



经推导,得到最小二次方,幂函数拟合公式如下:
ΦT* Φ*a= ΦT*y
其中Φ是样本点坐标x的超定矩阵,将所有x带入该向量[1 x x^2 ... ... x^n]中,就得到超定矩阵Φ。ΦT表示Φ的转置
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//下面宏定义CV_MAT_ELEM2为方便快速访问图像像素
#define CV_MAT_ELEM2(src,dtype,y,x) \
(dtype*)(src.data+src.step[]*y+src.step[]*x) Mat polyfit(std::vector<cv::Point2f> &chain,int n)
{
Mat y(chain.size(),,CV_32F,Scalar::all());
/* ********【预声明phy超定矩阵】************************/
/* 多项式拟合的函数为多项幂函数
* f(x)=a0+a1*x+a2*x^2+a3*x^3+......+an*x^n
*a0、a1、a2......an是幂系数,也是拟合所求的未知量。设有m个抽样点,则:
* 超定矩阵phy=1 x1 x1^2 ... ... x1^n
* 1 x2 x2^2 ... ... x2^n
* 1 x3 x3^2 ... ... x3^n
* ... ... ... ...
* ... ... ... ...
* 1 xm xm^2 ... ... xm^n
*
* *************************************************/
cv::Mat phy(chain.size(),n,CV_32F,Scalar::all());
for(int i=;i<phy.rows;i++)
{
float* pr=phy.ptr<float>(i);
for(int j=;j<phy.cols;j++)
{
pr[j]=pow(chain[i].x,j);
}
y.at<float>(i)=chain[i].y;
}
Mat phy_t=phy.t();
Mat phyMULphy_t=phy.t()*phy;
Mat phyMphyInv=phyMULphy_t.inv();
Mat a=phyMphyInv*phy_t;
a=a*y;
return a;
} int main()
{
vector<Point2f> sp;
//设有二次曲线点 g(x)=5+2.6x+2x^3,则:
float a[]={,2.6,};
Mat image(,,CV_32FC1,Scalar());
RNG rng;//预声明一个随机变量,用于作为离散点的干扰项
for(int i=;i<;i+=)
{
Point2f p;
p.x=i;
for(int k=;k<sizeof(a);k++)
{
p.y +=a[k]*pow(i,k);//
} p.y +=rng.uniform(-,);//为理想点位置添加随机干扰
/*将上面的p点以圆点的形式绘制到image上,为了观察方便,
* 将y坐标做了颠倒,坐标原点在image的左下角*/
Point2f pi;
pi.x=p.x;
pi.y=image.rows-p.y;
circle(image,pi,,Scalar(),-);
/*-------------end--------------------*/
sp.push_back(p);
cout<<p<<endl;
}
image.convertTo(image,CV_8UC1);
imshow("distributed Points",image);
Mat am=polyfit(sp,);
cout<<am<<endl;
waitKey();
return ;
}
opencv的曲线拟合polyfit的更多相关文章
- matlab最小二乘法数据拟合函数详解
定义: 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找数据的最佳函数匹配.利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小. ...
- matlab第六章数据分析与多项式计算
MATLAB练习 第六章数据分析与多项式计算 1.max和min 1.分别求矩阵A中各列和各行元素中的最大值.max和min的用法一样 % [例6.1]分别求矩阵中各列和各行元素中的最大值. A=[5 ...
- 算法+OpenCV】基于opencv的直线和曲线拟合与绘制(最小二乘法)
http://blog.csdn.net/guduruyu/article/details/72866144 最小二乘法多项式曲线拟合,是常见的曲线拟合方法,有着广泛的应用,这里在借鉴最小二乘多项式曲 ...
- polyfit 多项式曲线拟合matlab
polyfit 多项式曲线拟合 全页折叠 语法 p = polyfit(x,y,n) [p,S] = polyfit(x,y,n) [p,S,mu] = polyfit(x,y,n) 说明 示例 ...
- 曲线拟合的最小二乘法(基于OpenCV实现)
1.原理 在现实中经常遇到这样的问题,一个函数并不是以某个数学表达式的形式给出,而是以一些自变量与因变量的对应表给出,老师讲课的时候举的个例子是犯罪人的身高和留下的脚印长,可以测出一些人的数据然后得到 ...
- Matlab 曲线拟合之polyfit与polyval函数
p=polyfit(x,y,n) [p,s]= polyfit(x,y,n) 说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p.x必须是单调的.矩阵s用于生成预测值的误差估 ...
- matlab 曲线拟合
曲线拟合(转载:http://blog.sina.com.cn/s/blog_8e1548b80101c9iu.html) 补:拟合多项式输出为str 1.poly2str([p],'x') 2. f ...
- 立体视觉-opencv中立体匹配相关代码
三种匹配算法比较 BM算法: 该算法代码: view plaincopy to clipboardprint? CvStereoBMState *BMState = cvCreateStereoBMS ...
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
PS. 因为csdn博客文章长度有限制,本文有部分内容被截掉了.在OpenCV中文站点的wiki上有可读性更好.而且是完整的版本号,欢迎浏览. OpenCV Wiki :<OpenCV 编程简单 ...
随机推荐
- VMware Horizon Client剪贴板异常问题解决
接到用户反馈现象是:登录ERP系统操作是,无法复制粘贴本地电脑上的数据. 处理过程: 1.在域控服务器上建立独立的Horizon Computer OU,把所有RDS加入在改OU中 2.针对Horiz ...
- echarts常用的配置项
最近使用echarts可视化的业务,但是有一些配置项需要修改,把这段时间的学习总结一下 1. 修改默认配置 a. 去掉分割线和网格线,在xAxis或者yAxis中设置 splitLine: { sho ...
- 零拷贝的原理及Java实现
在谈论Kafka高性能时不得不提到零拷贝.Kafka通过采用零拷贝大大提供了应用性能,减少了内核和用户模式之间的上下文切换次数.那么什么是零拷贝,如何实现零拷贝呢? 什么是零拷贝 WIKI中对其有如下 ...
- mahout从入门到放弃--安装(1)
1.稀里糊涂下载 我的集群是hadoop 2.7.3 ,本来想找到对应的mahout版本,但是没有找到.本着安全原则,mahout最新版本是0.14.0,回退一个版本使用0.13.0 mahout地址 ...
- 如何解决tab栏切换只发一次请求的问题
用的antd的tab栏组件,发现切换tab栏只在componentDidMount里面发了一次请求,后来发现是缓存问题,于是用activeKey再次进行了判断,代码如下:
- Codeforces Round #395 Div.1 C pacifist【JZOJ5449】Pacifist
题目 papyrus 喜欢谜题... 来解一道如何? 在你面前有一个被加密了的数组,其原数组是一个等差序列,你面前的则是将原数组中的所有数字都对m 取模再打乱后而得到的新数组 papyrus 给你出的 ...
- dp周训练 状态压缩
题目链接:题意:给你一个10*10的矩阵,每到一个格子中都要拿一个0-9的数值,求从矩阵左上方走到右下方且必须0-9都经过,拿的数值和最小是多少: #include <iostream> ...
- TensorFlow使用记录 (一): 基本概念
基本使用 使用graph来表示计算任务 在被称之为Session的上下文中执行graph 使用tensor表示数据 通过Variable维护状态 使用feed和fetch可以为任意的操作(op)赋值或 ...
- 论文阅读:OpenFlow: Enabling Innovation in Campus Networks
摘要: 本白皮书提出了OpenFlow——研究人员在他们每天使用的网络中运行实验协议的一种方式. OpenFlow基于以太网交换机,具有内部流表以及用于添加和删除流条目的标准化接口.我们的目标是鼓励网 ...
- 【Red Hat Linux基础】 磁盘分区详细教程
https://blog.51cto.com/sunjie123/1687535 Linux中添加新硬盘后对硬盘的分区以及挂载 https://www.linuxidc.com/Linux/2018- ...