Прежде чем ответить на исходный вопрос, я думаю, что было бы важно обсудить этот момент из вашего комментария:
Конечная цель - это корректировка пакета непосредственно на основных матрицах, а не на RT. Я использую одиночную калиброванную камеру
Возможно, мне не хватает важных деталей вашего проекта, но, похоже, с этим методом есть несколько проблем:
-
Минимальное представление. Обычно лучше (как по соображениям производительности, так и по причинам точности) использовать минимальные параметризации в ваших оценках. Матрица Essential имеет шесть степеней свободы (что видно из ее разложения как [T]_xR
). Если вы оцениваете свой Essential напрямую, вы оптимизируете восемь параметров вместо шести.
Менее ограниченная проблема. Матрица 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
:
Как вы можете видеть на рисунке, красная и зеленая точки будут соответствовать ограничению существенной матрицы, однако они будут иметь разные ошибки перепроецирования.
Временная сложность. 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
.