在Mat矩阵上执行简单的逆运算和乘法运算

时间:2014-02-04 05:28:20

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

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

1 个答案:

答案 0 :(得分:3)

你应该在Mat逆之前确定至少两件事。

  1. 矩阵应该是正方形。

  2. 矩阵应该是非单数的,决定因素应该是非零的。

  3. <强>例如

        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());
      }