ABSOR - a tool for solving the absolute orientation problem using Horn's
quaternion-based method, that is, for finding the rotation, translation, and
optionally also the scaling, that best maps one collection of point coordinates
to another in a least squares sense. The function works for both 2D and 3D
coordinates, and also gives the option of weighting the coordinates non-uniformly.
The code avoids for-loops to maximize speed.
As input data, one has
A: a 2xN or 3xN matrix whos columns are the coordinates of N source points.
B: a 2xN or 3xN matrix whos columns are the coordinates of N target points.
solves the unweighted/unscaled registration problem
min. sum_i ||R*A(:,i) + t - B(:,i)||^2
for unknown rotation matrix R and unknown translation vector t.
This is a special case of the more general problem
min. sum_i w(i)*||s*R*A(:,i) + t - B(:,i)||^2
where s>=0 is an unknown global scale factor, to be estimated along with R and t,
and w is a user-supplied length N vector of weights. One can include either
s or w or both in the problem formulation using the syntax,
with parameter/value pair options
'doScale' - Boolean flag. If TRUE, the global scale factor, s, is included.
'weights' - the length N vector of weights, w. Default, no weighting.
regParams: structure output with estimated registration parameters,
regParams.R: The estimated rotation matrix, R
regParams.t: The estimated translation vector, t
regParams.s: The estimated scale factor (set to 1 if doScale=false).
regParams.M: Homogenous coordinate transform matrix [s*R,t;[0 0 ... 1]].
For 3D problems, the structure includes
regParams.q: A unit quaternion [q0 qx qy qz] corresponding to R and
signed to satisfy max(q)=max(abs(q))>0
For 2D problems, it includes
regParams.theta: the counter-clockwise rotation angle about the
Bfit: The rotation, translation, and scaling (as applicable) of A that
best matches B.
ErrorStats: structure output with error statistics. In particular,
defining err(i)=sqrt(w(i))*norm( Bfit(:,i)-B(:,i) ),
ErrorStats.errlsq = norm(err)
ErrorStats.errmax = max(err)