opencv实现halcon函数 VectorAngleToRigid

话不多说,先上代码:

struct sHomMatrix
{
    double a11;
    double a12;
    double a13;
    double a21;
    double a22;
    double a23;
    /*缺省值:100,010;*/
    sHomMatrix()
    {
        a11=1;
        a12=0;
        a13=0;
        a21=0;
        a22=1;
        a23=0;
    }
};

sHomMatrix cvVectorAngleToRigid(const cv::Point2f & tempCentre, const float org_angle, const cv::Point2f & matchCentre, const float matchAngle)
{
    sHomMatrix homMat;
    /* 获取旋转矩阵 */
    cv::Mat rotMat = cv::getRotationMatrix2D(tempCentre, (matchAngle-org_angle), 1);
    /* 转换成3*3矩阵 */
    cv::Mat rotMat2 = cv::Mat::zeros(3, 3, CV_32FC1);
    rotMat2.at(0, 0) = (float)rotMat.at(0, 0);
    rotMat2.at(0, 1) = (float)rotMat.at(0, 1);
    rotMat2.at(0, 2) = (float)rotMat.at(0, 2);
    rotMat2.at(1, 0) = (float)rotMat.at(1, 0);
    rotMat2.at(1, 1) = (float)rotMat.at(1, 1);
    rotMat2.at(1, 2) = (float)rotMat.at(1, 2);
    rotMat2.at(2, 2) = 1;
    /* 平移矩阵 */
    cv::Mat t_mat = cv::Mat::zeros(3, 3, CV_32FC1);
    t_mat.at(0, 0) = 1;
    t_mat.at(0, 2) = matchCentre.x - tempCentre.x;//235 - 190;     
    t_mat.at(1, 1) = 1;
    t_mat.at(1, 2) = matchCentre.y - tempCentre.y;//251 - 190;
    t_mat.at(2, 2) = 1;
    /* 平移矩阵*旋转矩阵,得到仿射变换阵 */
    cv::Mat resMat = t_mat*rotMat2;
    homMat.a11 = (double)resMat.at(0, 0);
    homMat.a12 = (double)resMat.at(0, 1);
    homMat.a13 = (double)resMat.at(0, 2);
    homMat.a21 = (double)resMat.at(1, 0);
    homMat.a22 = (double)resMat.at(1, 1);
    homMat.a23 = (double)resMat.at(1, 2);
    return homMat;
}

 

参数说明:

const cv::Point2f & tempCentre :模板图像中心点坐标;

const float org_angle: 模板角度,一般为0;

const cv::Point2f & matchCentre:匹配中心点坐标;

const float matchAngle:模板角度为0时,目标图像相对模板旋转角度,如果模板角度不为0,目标图像角度;

应用场景:

进行模板匹配后,已经获知 目标图像中匹配区域,相对于模板旋转了多少度;这时,要了解源图和目标图像的仿射变换矩阵,该怎样计算?

这里用到的原理就是,仿射变换矩阵(3x3)=平移矩阵(3x3)* 旋转矩阵(3x3);

其中,旋转矩阵的中心,就是模板中心点;

平移矩阵的偏移量tx,ty,就是匹配点相对于模板中心点的位移;

原理相对简单,不赘述。

 

 

你可能感兴趣的:(机器视觉)