在标定时常用到仿射变换,但Opencv中放射变换仅支持三对点作为参数。遇到需要多点标定的情况则需要最小二乘法的仿射变换了。
原opencv中 获取仿射变换的函数getAffineTransform() 的用法如下
vector<Point2f> sro={Point2f(0,0),Point2f(1,0),Point2f(0,1)};
vector<Point2f> dst{Point2f(0,0),Point2f(10,0),Point2f(0,10)};
Mat AffineTransform=getAffineTransform(sro, dst);
其中得到的AffineTransform就是2x3的仿射变换矩阵。
接下来介绍如何获得要最小二乘法的仿射变换矩阵。
若要解 A x = b 中的x。
使用常规超定矩阵解法 具体如下:
1.两边同时加乘 A^t (A^t表示A的转置)
有:A^t A x =A^t b
2.使x侧(A^t A)消去,再增乘(At A)^-1
有 (At A)^-1 (A^t A) x=(At A)^-1 A^t b
左侧 (At A)^-1 (A^t A)消去后
即有:x=(At A)