基于OpenCV的最小二乘法多项式拟合。
Mat polyfit(vector<Point>& in_point, int n)
{
//n次拟合, 假设 m = size
int size = in_point.size();
int x_num = n + 1;
Mat mat_u(size, x_num, CV_64F);
Mat mat_y(size, 1, CV_64F);
for (int i = 0; i < mat_u.rows; ++i)
for (int j = 0; j < mat_u.cols; ++j)
{
mat_u.at<double>(i, j) = pow(in_point[i].x, j);
}//注意0的0次幂没有意义!
for (int i = 0; i < mat_y.rows; ++i)
{
mat_y.at<double>(i, 0) = in_point[i].y;
}
// mat_u | mat_y
// 1 x0 x0^2 ... x0^n | y0
// 1 x1 x1^2 ... x1^n | y1
// 1 x2 x2^2 ... x2^n | y2
// . . . . | .
// . . . . | .
// . . . . | .
// 1 xm xm^2 ... xm^n | ym
Mat mat_k(x_num, 1, CV_64F);
mat_k = (mat_u.t()*mat_u).inv()*mat_u.t()*mat_y;
// k是多项式系数 利用最小二乘法求得的解析解!
// 参考 https://www.jianshu.com/p/eac4c7928b56
// k = (u^T * u)^(-1) * u^T * y
// k中的系数是低次项到高此项排列
cout << mat_k << endl;
return mat_k;
}