OpenCV中提供了丰富的图像几何变换模型求解和进行几何变换的函数接口。
库中已经提供的两种图像变换模型(仿射变换getAffineTransform和透视变换getPerspectiveTransform)的求解方法,以及仿射求逆变换的求解等, 并通过warpAfine ,warpPerspective等函数实现了图像的重采样。
但这两种变换在很多应用中略显不足,这是因为:
1)这两个变换都是在理想情况下的的求解,即仿射变换使用3个点对求解6个参数,透视变换使用4个点对求解8个参数,因此使用上述无法求解最小二乘解。
2)实际中经常使用到的刚体变换模型并没有提供方法。
下面做两点补充:
1)给出仿射变换和透视变换模型估计的最小二乘解
1.1仿射变换模型最小二乘估计
struct TAffineTrans2D
{
double a1, b1, c1;
double a2, b2, c2;
};
void estimateAffine2D(cv::Point2f* srcPoints, cv::Point2f* dstPoints, int pointsNum, TAffineTrans2D& transform)
{
double* vecL = new double[pointsNum * 2];
double* matA = new double[pointsNum * 6 * 2];
double* Li = vecL;
double* Ai = matA;
for (int i = 0; i < pointsNum; ++ i)
{
Ai[0] = srcPoints[i].x;
Ai[1] = src