話不多說,先上代碼:
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<float>(0, 0) = (float)rotMat.at<double>(0, 0);
rotMat2.at<float>(0, 1) = (float)rotMat.at<double>(0, 1);
rotMat2.at<float>(0, 2) = (float)rotMat.at<double>(0, 2);
rotMat2.at<float>(1, 0) = (float)rotMat.at<double>(1, 0);
rotMat2.at<float>(1, 1) = (float)rotMat.at<double>(1, 1);
rotMat2.at<float>(1, 2) = (float)rotMat.at<double>(1, 2);
rotMat2.at<float>(2, 2) = 1;
/* 平移矩陣 */
cv::Mat t_mat = cv::Mat::zeros(3, 3, CV_32FC1);
t_mat.at<float>(0, 0) = 1;
t_mat.at<float>(0, 2) = matchCentre.x - tempCentre.x;//235 - 190;
t_mat.at<float>(1, 1) = 1;
t_mat.at<float>(1, 2) = matchCentre.y - tempCentre.y;//251 - 190;
t_mat.at<float>(2, 2) = 1;
/* 平移矩陣*旋轉矩陣,得到仿射變換陣 */
cv::Mat resMat = t_mat*rotMat2;
homMat.a11 = (double)resMat.at<float>(0, 0);
homMat.a12 = (double)resMat.at<float>(0, 1);
homMat.a13 = (double)resMat.at<float>(0, 2);
homMat.a21 = (double)resMat.at<float>(1, 0);
homMat.a22 = (double)resMat.at<float>(1, 1);
homMat.a23 = (double)resMat.at<float>(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,就是匹配點相對於模板中心點的位移;
原理相對簡單,不贅述。