【问题标题】:Why equate an identity matrix to a transformation matrix in OpenCV为什么将单位矩阵等同于 OpenCV 中的变换矩阵
【发布时间】:2014-03-20 14:59:15
【问题描述】:

在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 矩阵

【问题讨论】:

  • 这还不清楚。你能用真实的东西替换你的伪代码吗?
  • 是的,我已经替换了伪代码

标签: c++ opencv


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多