我从2张图片中检测到了许多点。我试图找到这两个图像之间的转换矩阵。所以我需要对一个矩阵的矩阵坐标进行逆运算,然后将其乘以另一个Mat矩阵的坐标。我使用了非常简单的opencv方法,但是我收到了这个错误http://i.imgur.com/eDF1e9p.jpg。我不懂为什么。这是我的代码http://pastebin.com/Tef42E2Q。请问有谁能指导我吗?
答案 0 :(得分:3)
你应该在Mat逆之前确定至少两件事。
矩阵应该是正方形。
矩阵应该是非单数的,决定因素应该是非零的。
<强>例如强>
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());
}