Выполнение простых обратных операций и операций умножения на матрицах Mat

Я обнаружил несколько точек из 2 изображений. Я пытаюсь найти матрицу преобразования между этими двумя изображениями. Поэтому мне нужно сделать инверсию координат матрицы одной матрицы, а затем умножить ее на координаты другой матрицы Mat. Я использовал очень простые методы opencv, но я получаю эту ошибку http://i.imgur.com/eDF1e9p.jpg. Я не понимаю почему. Вот мой код http://pastebin.com/Tef42E2Q. Кто-нибудь может направить меня сюда, пожалуйста?

0

Решение

Вы должны убедиться, по крайней мере, две вещи, прежде чем Мэт обратный.

  1. Матрица должна быть квадратной.

  2. Матрица должна быть неособой, то есть определитель должен быть ненулевым.

Например:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]