上篇所言,图像匹配设计旋转平移缩放,图像旋转是图像配准中较难的一个环节,继上节利用最小面积外接矩形求旋转方向后,再利用pca方法求图像主方向的方法求图像旋转角度。
对于一个样本点pt=[x,y]’,现有点集PT={pt1,pt2,…ptk},其均值为me=(pt1+pt2+…+ptk)/k,协方差矩阵为segma={(pt1-me)(pt1-me)’+…+(ptk-me)(ptk-me)};对segma进行特征分解,按照从大到小排列,有特征向量V, 其每一行对应一个特征向量,解方程
V*T=[1 0]’,向量T经过V的投影之后,在主方向上投影为1,在垂直方向上投影为0,故T既指明了主方向。

###code

void PcaDirection(vector<GCLPOINT > pt, double &degree)
{
    int len = int(pt.size());
    double *A = new double[4];
    memset(A, 0, sizeof(double) * 4);
    for (int i = 0; i < len; i++)
    {
        A[0] += pt[i].x * pt[i].x;
        A[1] += pt[i].x * pt[i].y;
        A[3] += pt[i].y * pt[i].y;
    }
    A[0] /= len;
    A[1] /= len;
    A[2] = A[1];
    A[3] /= len;

    // calculate the eigenvalue
    double vec[4];
    double eigValue[2];
    Jacobi(A, 2, eigValue, vec, 10000, 10e-7);
    double inVec[4];
    MatrixInverse(vec, inVec, 2);
    degree = -atan2(inVec[2], inVec[0]) * 180 / PI;

    delete[] A;
}

其中,jacobi求特征值及特征向量的方法参见jacobi求特征值