【问题标题】:Combine two affine Transformations Matrices in OpenCV在 OpenCV 中组合两个仿射变换矩阵
【发布时间】:2016-10-28 13:31:49
【问题描述】:

我有两个 2x3 矩阵 A 和 B - 每个都用于仿射变换。 我需要将 A 和 B 组合成一个第三矩阵 C,它将 A 和 B 的仿射变换组合成一个矩阵。

我需要如何将它们相乘?

AB 还是 BA ?

不同之处在于 A 或 B 会被转置,还是完全不同?

我读到的另一个解决方案是使用 3x3 矩阵并复制到前两行中,并且只使用结果中的前两行。但归根结底是AB还是BA。

此外,有没有一种简单的方法可以在 OpenCV 中实现这一点,或者我是否需要如上所述实现每个步骤?

【问题讨论】:

  • 两者都不应该被转置。添加第三行。乘法顺序取决于您的情况。
  • 它有所不同,取决于顺序,应该首先执行哪个转换。但请注意,2x3 仿射变换不能以这种方式相乘,您首先必须通过在底部添加 0 0 1 行来将它们扩展到 3x3 矩阵。之后,如果您想在 B 之前执行 A,则计算 C = BA;如果您想先执行 B,则计算 C = AB。
  • 谢谢你,成功了。但是OpenCV没有提供任何功能吗?
  • 您可以轻松编写一个小函数,隐式地将两个仿射 2x3 矩阵相乘,而无需添加额外的行。也许openCV中的某个地方隐藏了这样一个功能,但是如果,我不知道......
  • 在 2012 年似乎没有 ... stackoverflow.com/questions/13557066/…

标签: c++ opencv matrix affinetransform


【解决方案1】:

以下函数结合了这两个矩阵:

  Mat AffineTransform::concatenateMatrix(Mat first, Mat second){

        Mat mul1 = Mat::eye(3, 3, CV_64F);
        Mat mul2 = Mat::eye(3, 3, CV_64F);
        Mat x_;
        Mat temp_inv_;
        Mat mul_r;
        first.convertTo(temp_inv_, CV_64F);
        second.convertTo(x_, CV_64F);

        temp_inv_.row(0).copyTo(mul1.row(0));
        temp_inv_.row(1).copyTo(mul1.row(1));

        x_.row(1).copyTo(mul2.row(1));
        x_.row(0).copyTo(mul2.row(0));

        try{
            mul_r = mul1*mul2;
        }
        catch (Exception& e){
            const char* err_msg = e.what();
            cout << err_msg;
        }

        mul1.release();
        mul2.release();
        temp_inv_.release();

        return mul_r;
}

【讨论】:

  • mul_r = mul1*mul2;改成mul_r = mul2*mul1;,就是对1的正确操作。 warpaffine(Mat first) 2. warpaffine(Mat second)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-06
  • 1970-01-01
  • 2020-08-11
  • 2011-02-07
  • 1970-01-01
相关资源
最近更新 更多