Правильный способ извлечения перевода из Essential Matrix через SVD

Я откалибровал свою камеру и нашел внутренние параметры (K). Также я рассчитал Фундаментальную Матрицу (F).

Теперь E= K_T* F * K. Все идет нормально.

Теперь мы передаем основную матрицу (E) в SVD, чтобы использовать значения разложения (U, W, V) для извлечения вращения и перемещения:

 essentialMatrix = K.Transpose().Mul(fund).Mul(K);
 CvInvoke.cvSVD(essentialMatrix, wMatrix, uMatrix, vMatrix, Emgu.CV.CvEnum.SVD_TYPE.CV_SVD_DEFAULT);

** Вопрос) На данный момент было предложено два метода, и я запутался, какой из них действительно дает правильный ответ - специально для перевода:

В первом методе введите здесь описание ссылки автор предлагает вычислить R, T следующим образом:

введите здесь описание изображения

Но во втором методе [http://isit.u-clermont1.fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf] автор предоставляет другую формулу для T, которая равна +U , -U, как показано ниже:

введите здесь описание изображения

Я реализую это на С# .Net, используя библиотеки openCv. Кто-нибудь знает, какая формула перевода правильная?


person farzin parsa    schedule 11.04.2013    source источник
comment
Ссылка на второй метод мертва. Документ перемещен по адресу: igt.ip.uca. fr/~ab/Classes/DIKU-3DCV2/Handouts/Lecture16.pdf   -  person Gabriel Devillers    schedule 13.07.2017


Ответы (1)


первое решение показывает матричное представление перекрестного произведения с вектором t (поэтому первое решение = [t]x ), а второе решение показывает только вектор переноса t (https://en.wikipedia.org/wiki/Essential_matrix).

Определение [t]x:

введите здесь описание изображения

(из http://gandalf-library.sourceforge.net/tutorial/report/img148.png)

person pichsenmeister    schedule 19.05.2013
comment
В первом решении T1, T2 являются ненулевыми матрицами 3X3, но на самом деле в качестве перевода t мне нужна матрица 3X1. как мне извлечь 3X1 из ненулевой матрицы 3X3 без потери информации? - person farzin parsa; 12.07.2013
comment
если извлекать перевод с помощью SVD, то вектор перевода равен SVD(E).u.col(2), как это описано во втором способе вашего поста. как вы извлекаете свою матрицу перевода 3x3? вы также можете посмотреть stackoverflow.com/questions/16639106/ для получения дополнительной информации - person pichsenmeister; 13.07.2013
comment
Я использовал 1-й метод, упомянутый выше, для извлечения T1, T2, которые имеют размер 3X3. Я делаю что-то неправильно? В предоставленной ссылке парень снова перешел от расчета t1,t2 к t, не упомянув о преобразовании/отношении между t1,t2 и t, как я повторяю ниже: t1 = decomp.u.col(2); //u3 t2 = -decomp.u.col(2); //u3 new_pos = old_pos + -R.t()*t; - person farzin parsa; 16.07.2013
comment
поскольку вы используете SVD, ваш вектор перевода (3x1) является третьим столбцом U (decomp.u.col(2) возвращает вектор 3x1). используя SVD, вы получаете 4 возможных решения, 2 для R и 2 для t. чтобы получить правильное решение обоих, вы можете использовать триангуляцию. если вы внимательно прочитаете другой вопрос, вы увидите, что между `t1\t2 = decomp.u.col(2);` и new_pos = old_pos + -R.t()*t; выполняется триангуляция (ссылка указана в другом вопросе). Также читайте комментарии, в которых указывается на ошибку в вычислении SVD - person pichsenmeister; 16.07.2013