在 Mat inverse 之前你应该确保至少两件事。
矩阵应该是正方形的。
矩阵应该是非奇异的,即行列式应该是非零的。
例如:
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());
}