【问题标题】:Performing simple inverse and multiplication operations on Mat matrices对 Mat 矩阵执行简单的逆运算和乘法运算
【发布时间】:2014-02-04 19:33:11
【问题描述】:

我从 2 张图像中检测到多个点。我试图在这两个图像之间找到一个转换矩阵。所以我需要对一个矩阵的矩阵坐标进行逆运算,然后将其乘以另一个 Mat 矩阵的坐标。我使用了非常简单的 opencv 方法,但我得到了这个错误http://i.imgur.com/eDF1e9p.jpg。我不懂为什么。这是我的代码http://pastebin.com/Tef42E2Q。有人可以在这里指导我吗?

【问题讨论】:

    标签: c++ opencv computer-vision matrix-multiplication matrix-inverse


    【解决方案1】:

    在 Mat inverse 之前你应该确保至少两件事。

    1. 矩阵应该是正方形的。

    2. 矩阵应该是非奇异的,即行列式应该是非零的。

    例如:

        Mat A(3,3,CV_32FC1);
        A=(Mat_<float>(3,3)<< 0,2,3,\
                              4,5,6,\
                              7,8,9);
        cout<<A <<endl;
    
        if(determinant(A)!=0){
        Mat B=A.inv();
        cout<<B <<endl;
        }
    

    另见答案Mat.inv() yielding all zeroes in opencv

    编辑:-

    这是我在您的代码中发现的一些错误

    一段代码

        Mat matrix_f(2,3,CV_32F);
        matrix_f=Mat(coordinates_f);
    

    应该改为

        Mat matrix_f(2,3,CV_32F);
        matrix_f=Mat(coordinates_f);
        matrix_f=matrix_f.reshape(1,2);
    

    因为稍后您将与 3X3 Mat 相乘,所以我们将其行数设为 3

    接下来是换行

        Mat new_left(3,3,CV_32F);
        new_left=Mat(coordinates_l_new);
    

          Mat new_left(3,3,CV_32F);
          new_left=Mat(coordinates_l_new);
          new_left=new_left.reshape(1,3);
    

    因为你要找到 new_left 的逆,它应该是方阵。

    最后通过找到行列式来确保 Mat 是非奇异的

     if(determinant(new_left)!=0) {
            Mat T(3,3,CV_32F);
            T=matrix_f * (new_left.inv());
      } 
    

    【讨论】:

    • 如果我手动输入矩阵 A 的元素,您的代码可以完美运行。但我的问题是,当我在代码前面找到一个矩阵时,我找不到它的逆矩阵,也找不到我可以用它进行乘法运算,给我上面的错误
    • 你能显示你的完整代码吗?...在​​你提供问题的链接中,你可以使用代码Mat T=matrix_f * (new_left.inv()); 看看它是否有效。
    • 如果您发布图片,它将帮助我调试您的代码
    • 好的,谢谢!还有一件事..当我将此变换矩阵应用于原始左侧图像并尝试显示它时,它会显示带有检测到绿色像素的黄色图像。我在 if 语句中添加了这一部分: Mat left_transformed=Mat::zeros(left.size(),left.type()); left_transformed=left.mul(T); imshow("left_trans",left_transformed);为什么不能正确显示变换后的左图?
    • 对于 Mat::mul 两个 Mat 的类型和大小应该相同 See OpenCV Doc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2017-08-31
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多