opencv的曲线拟合polyfit

曲线拟合的函数表达式为:

f(x)=a0+a1*x+a2*x^2+a3*x^3+......+an*x^n =[a0 a1 a2 ...... an][1 x1 x1^2 ... ...  x1^n]T
a0、a1、a2......an是幂系数,也是拟合所求的未知量。

经推导,得到最小二次方,幂函数拟合公式如下:

Φ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[0]*y+src.step[1]*x)

Mat polyfit(std::vector<cv::Point2f> &chain,int n)
{
    Mat y(chain.size(),1,CV_32F,Scalar::all(0));
/* ********【预声明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(0));
    for(int i=0;i<phy.rows;i++)
    {
        float* pr=phy.ptr<float>(i);
        for(int j=0;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[]={5,2.6,2};
    Mat image(500,500,CV_32FC1,Scalar(0));
    RNG rng;//预声明一个随机变量,用于作为离散点的干扰项
    for(int i=1;i<20;i+=2)
    {
        Point2f p;
        p.x=i;
        for(int k=0;k<sizeof(a);k++)
        {
            p.y +=a[k]*pow(i,k);//
        }

        p.y +=rng.uniform(-1,1);//为理想点位置添加随机干扰
     /*将上面的p点以圆点的形式绘制到image上,为了观察方便,
      * 将y坐标做了颠倒,坐标原点在image的左下角*/
        Point2f pi;
        pi.x=p.x;
        pi.y=image.rows-p.y;
        circle(image,pi,3,Scalar(255),-1);
      /*-------------end--------------------*/
        sp.push_back(p);
        cout<<p<<endl;
    }
    image.convertTo(image,CV_8UC1);
    imshow("distributed Points",image);
    Mat am=polyfit(sp,3);
    cout<<am<<endl;
    waitKey();
    return 0;
}
时间: 2024-08-14 19:22:15

opencv的曲线拟合polyfit的相关文章

OpenCV曲线拟合与圆拟合

OpenCV曲线拟合与圆拟合 使用OpenCV做图像处理与分析的时候,经常会遇到需要进行曲线拟合与圆拟合的场景,很多OpenCV开发者对此却是一筹莫展,其实OpenCV中是有现成的函数来实现圆拟合与直线拟合的,而且还会告诉你拟合的圆的半径是多少,简直是超级方便,另外一个常用到的场景就是曲线拟合,常见的是基于多项式拟合,可以根据设定的多项式幂次生成多项式方程,然后根据方程进行一系列的点生成,形成完整的曲线,这个车道线检测,轮廓曲线拟合等场景下特别有用.下面就通过两个简单的例子来分别学习一下曲线拟合

polyfit 多项式曲线拟合matlab

polyfit 多项式曲线拟合 全页折叠 语法 p = polyfit(x,y,n) [p,S] = polyfit(x,y,n) [p,S,mu] = polyfit(x,y,n) 说明 示例 p = polyfit(x,y,n) 返回阶数为 n 的多项式 p(x) 的系数,该阶数是 y 中数据的最佳拟合(在最小二乘方式中).p 中的系数按降幂排列,p 的长度为 n+1 p(x)=p1xn+p2xn−1+...+pnx+pn+1. [p,S] = polyfit(x,y,n) 还返回一个结构体

曲线拟合的最小二乘法(基于OpenCV实现)

1.原理 在现实中经常遇到这样的问题,一个函数并不是以某个数学表达式的形式给出,而是以一些自变量与因变量的对应表给出,老师讲课的时候举的个例子是犯罪人的身高和留下的脚印长,可以测出一些人的数据然后得到一张表,它反应的是一个函数,回归的意思就是将它还原成数学表达式,这个式子也称为经验表达式,之所以叫经验就是说它不完全是实际中的那样准确,是有一定偏差的,只是偏差很小罢了. 最小二乘法     设经验 方程是y=F(x),方程中含有一些待定系数an,给出真实值{(xi,yi)|i=1,2,...n},

Matlab 曲线拟合之polyfit与polyval函数

p=polyfit(x,y,n) [p,s]= polyfit(x,y,n) 说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量p.x必须是单调的.矩阵s用于生成预测值的误差估计. 多项式曲线求值函数:polyval( ) 调用格式: y=polyval(p,x) [y,DELTA]=polyval(p,x,s) 说明:y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值. [y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输

利用MATLAB进行曲线拟合

软件环境:MATLAB2013a 一.多项式拟合 多项式拟合是利用多项式最佳地拟合观测数据,使得在观测数据点处的误差平方和最小. 在MATLAB中,利用函数ployfit和ployval进行多项式拟合. 函数ployfit根据观测数据及用户指定的多项式阶数得到光滑曲线的多项式表示,polyfit的一般调用格式为:P = polyfit(x,y,n).其中x为自变量,y为因变量,n为多项式阶数. polyval的输入可以是标量或矩阵,调用格式为 pv = polyval(p,a) pv = pol

[matlab]曲线拟合(整理)

一.曲线拟合是要找到一条光滑曲线,使其最佳地拟合数据,该曲线不必经过数据点: 二.曲线拟合的内容: 1.光滑曲线的形式是怎么样:多项式模型?指数模型?其他函数模型 2.最佳拟合的概念: 常用的误差准则是误差平方和最小,也可以是最大误差最小准则,误差绝对值和等. 三.Matlab多项式拟合函数(指数拟合可以转换为多项式拟合来做,略): ployfit(x,y,n);   %返回值为多项式的各个系数 x  自变量 y  应变量 n  多项式阶数 polyval(P,xi);   %返回值为多项式在x

Matlab 曲线拟合

在matlab中经常需要对数据进行曲线拟合,如最常见的多项式拟合,一般可以通过cftool调用曲线拟合工具(curve fit tool),通过图形界面可以很方便的进行曲线拟合,但是有些时候也会遇到不方便用图形工具.因此这里简单的记下两种常用的拟合方法. 1 多项式拟合(polyfit和polyval) polyfit可以对数据进行拟合(自定义用几次多项式),返回相应的参数,然后用polyval生成拟合后的数据点,下面的例子中我们对抛物线y=3x2+6x+5进行拟合. x = -5:0.1:5;

立体视觉-opencv中立体匹配相关代码

三种匹配算法比较 BM算法: 该算法代码: view plaincopy to clipboardprint? CvStereoBMState *BMState = cvCreateStereoBMState(); int SADWindowSize=15;    BMState->SADWindowSize = SADWindowSize > 0 ? SADWindowSize : 9;   BMState->minDisparity = 0;   BMState->number

Matlab实例学习------多项式和非多项式曲线拟合(实例)

具体实例:(多项式和非多项式,附带程序注释) % 曲线拟合 %% 多项式曲线拟合 x=-pi:0.1:pi; y=sin(x); plot(x,y);%原始曲线 p0=polyfit(x,y,4);%绘制4阶拟合曲线 返回多项式的系数向量 y1=polyval(p0,x);%多项式求值 % The polynomial is evaluated at x =5, 7, and 9 with % p = [3 2 1]; % polyval(p,[5 7 9]) % % which results