话不多说,先上代码:
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
rotMat2.at
rotMat2.at
rotMat2.at
rotMat2.at
rotMat2.at
rotMat2.at
/* 平移矩阵 */
cv::Mat t_mat = cv::Mat::zeros(3, 3, CV_32FC1);
t_mat.at
t_mat.at
t_mat.at
t_mat.at
t_mat.at
/* 平移矩阵*旋转矩阵,得到仿射变换阵 */
cv::Mat resMat = t_mat*rotMat2;
homMat.a11 = (double)resMat.at
homMat.a12 = (double)resMat.at
homMat.a13 = (double)resMat.at
homMat.a21 = (double)resMat.at
homMat.a22 = (double)resMat.at
homMat.a23 = (double)resMat.at
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,就是匹配点相对于模板中心点的位移;
原理相对简单,不赘述。