Я обнаружил несколько точек из 2 изображений. Я пытаюсь найти матрицу преобразования между этими двумя изображениями. Поэтому мне нужно сделать инверсию координат матрицы одной матрицы, а затем умножить ее на координаты другой матрицы Mat. Я использовал очень простые методы opencv, но я получаю эту ошибку http://i.imgur.com/eDF1e9p.jpg. Я не понимаю почему. Вот мой код http://pastebin.com/Tef42E2Q. Кто-нибудь может направить меня сюда, пожалуйста?
Вы должны убедиться, по крайней мере, две вещи, прежде чем Мэт обратный.
Матрица должна быть квадратной.
Матрица должна быть неособой, то есть определитель должен быть ненулевым.
Например:
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 () возвращает все нули в 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, поэтому мы сделаем его строк до 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, она должна быть квадратной матрицей.
И, наконец, убедитесь, что Мат не является единственным, найдя определитель
if(determinant(new_left)!=0) {
Mat T(3,3,CV_32F);
T=matrix_f * (new_left.inv());
}
Других решений пока нет …