在opencv和C ++中,如果我之前在2个图像之间找到了转换矩阵,为什么我需要这样做
Mat affineTransform=getAffineTransform(coordinates_1.data(),coordinates_2.data()) ;
Mat perspectiveTransform=Mat::eye(3,3,CV_64FC1);
for(unsigned int y=0; y<2; ++y){
for(unsigned int x=0; x<3; ++x){
perspectiveTransform.at<double>(y,x) = affineTransform.at<double>(y,x);
}
而不是直接将变换矩阵应用于图像。我理解Mat :: eye()的含义,但为什么要经历这一切呢?
注意: originalTranformationMatrix 是一个Mat对象,找到的变换矩阵是一个3 x 3矩阵
答案 0 :(得分:1)
仿射变换具有以下形式:
(a, b, c)
(d, e, f)
以下列方式转换点(x,y):
x_new = a*x + b*y + c;
y_new = d*x + e*y + f;
透视变换具有以下形式:
(a, b, c)
(d, e, f)
(g, h, 1)
以下列方式转换点(x,y):
z = g*x + h*y + 1;
x_new = (a*x + b*y + c)/z;
y_new = (d*x + e*y + f)/z;
这意味着如果你想定义只关注变换的透视变换,它应该是:
(a, b, c)
(d, e, f)
(0, 0, 1)
这正是您的代码所做的。首先,它创建矩阵:
(1, 0, 0)
(0, 1, 0)
(0, 0, 1)
然后用一行仿射变换替换前两行。顺便说一句,它可以更清洁地完成,没有循环:
perspectiveTransform(Rect(0,0,3,2)) = affineTransform.clone();