基本原理:幂函数可逼近任意函数。
上式中,N表示多项式阶数,实际应用中一般取3或5;
假设N=5,则:dsbcsdn
共有6个未知数,仅需6个点即可求解;
可表示为矩阵方程:
Y的
下面是使用C++实现的多项式拟合的程
#include <opencv2\opencv.hpp>
#include <iostream>
#include <v
Mat polyfit(vector<Point>& in_point, int n);
int main()
{
//数据输入
Point in[19] = { Point(50,120),Point(74,110),Point(98,100),Point(122,100),Point(144,80)
,Point(168,80),Point(192,70),Point(214,50),Point(236,40),Point(262,20)
,Point(282,20),Point(3oint(356,50),Point(376,50)
,40),Point(468,30) };
vector<Point> in_point(begin(in),end(in));
//n:多项式阶次
int n = 9;
Mat mat_k = polyfit(in_point, n);
//计算结果可视化
Malar::all(0));
//画出拟合曲线
for (int i = in[0].x; i < in[size(in)-1].x; ++i)
{
Point2d ipt;
ipt.y = 0;
for (int j = 0; j < n + 1; ++j)
{
ipt.y += mat_k.at<double>(j, 0)*pow(i,j);
}
circle(out, ipt, 1, Scal
}
//画出原始散点
for (int i = 0; i < size(in); ++i)
{
Point ipt = in[i];
circle(out, ipt, 3, Scalar(0, 0, 255), CV_FILL
imshow("9次拟合", out);
waitKey(0);
return 0;
}
Mat polyfit(vector<Point>& in_point, int