//=========================================================================== void Align2DShapes(cv::Mat &src,cv::Mat &dst,double &scale,double &theta) { int n = src.rows/2; assert((src.cols == 1) && (dst.rows == 2*n) && (dst.cols == 1)); int i; double a,b,c; for(i = 0, a = b = c = 0.0; i < n; i++){ a += src.rl(i,0)*src.rl(i ,0)+src.rl(i+n,0)*src.rl(i+n,0); b += src.rl(i,0)*dst.rl(i ,0)+src.rl(i+n,0)*dst.rl(i+n,0); c += src.rl(i,0)*dst.rl(i+n,0)-src.rl(i+n,0)*dst.rl(i ,0); } b /= a; c /= a; scale = std::sqrt(b*b+c*c); theta = std::atan2(c,b); return; }