逆矩阵OpenCV.Matrix.inv()无法正常工作

Ivá*_*ick 4 c++ opencv matrix-inverse

我有一个问题,我找不到任何解决方案.

我必须用一个已知矩阵的逆来进行一些计算.

Matrix homography=

1.1688, 0.23, 62.2,

-0.013,1.225, -6.29,

0, 0, 1, 
Run Code Online (Sandbox Code Playgroud)

然后:

Mat homoInv=homography.inv();
Run Code Online (Sandbox Code Playgroud)

矩阵的内容将是:

1.81381e-29, 15.1628, -7.57361e+17, 

0, -0, 0, 

5.4561e-33, -2.40123e+34, -1.38198e-05
Run Code Online (Sandbox Code Playgroud)

那当然是错的,因为我已经在Matlab中检查了结果.两个矩阵都显示并作为浮点读取,它们的深度为a 64FC1.

有没有人知道可以做些什么?

谢谢大家

更多代码:

int main(int argc, char ** argv )
{ 
  Mat homogra(3,3,CV_64FC1);
  Mat coord(3,1,CV_64FC1);
  Mat result(target.size(),CV_8UC1);
  homogra.at<float>(0,0)=1.1688;
  homogra.at<float>(0,1)=0.23;
  homogra.at<float>(0,2)=(-62.20);
  homogra.at<float>(1,0)=(-0.013);
  homogra.at<float>(1,1)=1.225;
  homogra.at<float>(1,2)=-6.29;
  homogra.at<float>(2,0)=0;
  homogra.at<float>(2,1)=0;
  homogra.at<float>(2,2)=1;
  printMatrix(homogra);

  Mat inverse=homogra.inv();
  printMatrix(inverse);
}
Run Code Online (Sandbox Code Playgroud)

function printMatrix:

void printMatrix(Mat M){
cout<<"Tipo de matriz:"<<M.type()<<endl;
 // dont print empty matrices
  if (M.empty()){
    cout << "---" << endl;
    return;
  }
  // loop through columns and rows of the matrix
  for(int i=0; i < M.rows; i++){
      for(int j=0; j < M.cols ; j++){
      cout << M.at<float>(i,j) << ", "<<endl;
      }
    cout<<"Change\n"<<endl;
}
  }
Run Code Online (Sandbox Code Playgroud)

但错误不在printMatrix,因为如果我单独打印元素,我在逆数中得到相同的奇怪结果.

Ivá*_*ick 11

解决了:正如彼得在我的代码中指出的那样,问题就在于此.我仍然深深地理解这个原因,但它是这样的:

我将数据CV_64F视为浮点数,这是一个错误,它需要被视为双精度,用于写入值并读取它们.(<double>)

但是CV_32F可以将其视为float,访问将与<float>.

感谢大家

  • 这有助于理解原因.我确信Opencv使用该类型来获取内存中的位置.对于2D阵列中的索引(i,j)(假设行主要具有连续性),存储器中的位置通常是从数据开头的位置开始的索引(i*number_of_columns + j)*(sizeof_variable_type).默认C++指针索引使用指针类型来知道要跳过的字节数.因此,如果类型不符合预期,则最终会将值分配给错误的内存空间,就像您的问题一样.最重要的是,您的反向计算与您预期的数据无关 (3认同)