Составление нескольких основных матриц - PullRequest
1 голос
/ 18 июня 2020

Я вычислил основные матрицы между Frame [a,b], [b,c] and [c,d]. У меня теперь E_ab, E_bc и E_cd. Можно ли вычислить E_ad напрямую без сопоставления? Я думаю о том, что такое 3D-преобразование, составляющее где:

T04 = T01 * T12 * T23 * T34

Решение, которое я нашел, состоит в том, чтобы разложить каждый из них на R | T и построить T_4 * 4 из R | T, а затем использовать предыдущую нотацию составления матриц T, а затем преобразовать окончательный R | T в E. Однако мне было интересно, есть ли прямой способ без разложения по двум причинам:

  • Разложение и повторное составление (по крайней мере, в OpenCV ) немного изменяет основную матрицу
  • Ради производительности

Итак, как я могу напрямую объединить две (или более) основные матрицы?

1 Ответ

1 голос
/ 18 июня 2020

Прежде чем ответить на исходный вопрос, я думаю, что было бы важно обсудить этот момент из вашего комментария:

Конечная цель - это корректировка пакета непосредственно на основных матрицах, а не на RT. Я использую одиночную калиброванную камеру

Возможно, мне не хватает важных деталей вашего проекта, но, похоже, с этим методом есть несколько проблем:

  1. Минимальное представление. Обычно лучше (как по соображениям производительности, так и по причинам точности) использовать минимальные параметризации в ваших оценках. Матрица Essential имеет шесть степеней свободы (что видно из ее разложения как [T]_xR). Если вы оцениваете свой Essential напрямую, вы оптимизируете восемь параметров вместо шести.

  2. Менее ограниченная проблема. Матрица Essential накладывает ограничения на компланарность и не наказывает некоторые неправильные конфигурации, которые могут быть наказаны ошибками перепроецирования, которые используются при обычной настройке связки. Если вы рассматриваете две камеры C_1 и C_2 так, что точка X_2, выраженная в C_2, может быть выражена в C_1 через RX_2+T, и что мы обозначаем соответствующую точку в C_1 как X_1, то ограничение X_1.transpose()*E*X_2=0 требует, чтобы три вектора T, X_1 и RX_2+T оставались копланарными. Таким образом, точка X_2 может свободно перемещаться, пока она репроецируется на линию сальника, даже если ее луч расходится от X_1:

    enter image description here

    Как вы можете видеть на рисунке, красная и зеленая точки будут соответствовать ограничению существенной матрицы, однако они будут иметь разные ошибки перепроецирования.

  3. Временная сложность. Computing Essentials работает очень медленно по сравнению с альтернативами, как и восстановление вращения и переводов из Essentials по сравнению с обратной задачей.


Теперь вернемся к исходному проблема из вопроса, если вы рассматриваете три камеры C_1, C_2, C_3 и соответственно обозначаете их позы как Identity, R_1, R_2, и обратите внимание на Essentials между C_1 и C_2 как E_1 и одну между C_2 и C_3 как E_2, тогда вы можете легко увидеть, что Essential от C_3 до C_1, который я отмечу E_3, будет дан как

E_3=[R_1T_2+T_1]_x R_1R_2 

, что с небольшим реорганизации ведет to

E_3=R_1E_2 + E_1R_2

Это отношение, которое устанавливает связь между тремя основными матрицами, по-видимому, указывает на то, что вам все равно нужно будет извлечь R_1 и R_2 из E_1 и E_2.

Изменить: Я вывел соотношение, приведенное выше, следующим образом: предположим, что y - это вектор 3x1, затем

E_3y = [R_1T_2+T_1]_x R_1R_2y
     = (R_1T_2+T_1) x (R_1R_2y)
     = R_1T_2 x R_1R_2y + T_1 x R_1R_2y #for the next line, note that crossproduct is invariant under rotation
     = R_1(T_2 x R_2 y) + T_1 x R_1R_2 y
     = R_1[T_2]_x R_2 y + [T_1]x_x R_1 R_2 y
     = R_1 E_2 y + E_1 R_2 y
     = (R_1E_2 + E_1R_2) y

Поскольку это справедливо для любого произвольного y, это означает, что E_3=R_1E_2+E_1R_2.

...