曲面拟合是指在三维坐标系中,将多个点拟合为一个曲面的过程。曲面拟合的主要作用是可以找到极值点。在图像定位领域,用于寻找亚像素级精度。
在本里中,曲面的公式采用:
(也可以采用其他的曲面公式,原理一样)。
并使用最小二乘法进行求解:是下面式子的误差最小:
则应该满足:
写为矩阵的表达式:
下一步就是要根据拟合点的坐标信息,解出[a,b,c,d,e,f]。在本例子中,共选取9个点,对曲面进行拟合(具体可以根据实际情况进行选择)。9点的坐标可以表示为。
则[a,b,c,d,e,f]的解可以直接根据9个点的z坐标进行解出。C++代码如下所示:(以下代码是采用opencv库进行的矩阵运算,进攻参考)。
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using std::cout;
using std::endl;
using namespace cv;
//曲面拟合函数,最终得到亚像素级精度
Point SurfaceFitting(Mat &CorrResult);
Point SurfaceFitting(Mat &CorrResult)
{
/*
原始坐标矩阵
float matrixdata[] = { 51,25,27,27,15,15,
25,51,27,15,27,15,
27,27,25,15,15, 9,
27,15,15,15, 9, 9,
15,27,15, 9,15, 9,
15,15, 9, 9, 9, 9 };
*/
double Time = (double)cvGetTickCount();
//此值为matrixdata矩阵计算出来的,可以作为初始参数使用
float Edata[36] = {
0.50000107, 1.7764522e-07, -2.3374371e-08, -1.0000021, -3.3659094e-07, 0.16666715,
-2.7998499e-07, 0.50000054, 8.6149221e-08, 4.4305315e-07, -1.0000013, 0.16666681,
-1.5373146e-08, 2.3572157e-07, 0.25000003, -0.25000003, -0.25000057, 0.25000012,
-1.0000023, -6.5050045e-07, -0.25, 2.4166713, 0.25000131, -0.75000113,