В калиброванной установке стереозрения как получить "матрицы камер", необходимые для реализации алгоритма трехмерной триангуляции?
Я пытаюсь реализовать (относительно простой) метод линейной однородной трехмерной триангуляции (DLT) из "Геометрии множественного обзора" Хартли и Циссермана (с. 12.2) с целью реализации их полного, "оптимального алгоритма" в будущем. Прямо сейчас, основываясь на этом вопросе, я пытаюсь заставить его работать в Matlab, а позже перенесу его на C++ и OpenCV, проверяя его на соответствие.
Проблема в том, что я не уверен, как использовать данные, которые у меня есть. Я откалибровал свою стереосистему и получил две матрицы собственных камер, два вектора коэффициентов искажения, матрицу вращения и вектор трансляции, относящиеся к двум камерам, а также основные и основные матрицы. У меня также есть 2D-координаты двух точек, которые должны быть соответствиями одной 3D-точки в системах координат двух изображений (снятых 1-й и 2-й камерой соответственно).
Алгоритм принимает в качестве входных данных две точечные координаты и две 4x3 "матрицы камеры" P и P'. Это, очевидно, не внутренние матрицы камеры (M, M'), полученные из калибровки, потому что для одной они 3x3, а также потому, что проекция, использующая только их, помещает трехмерную точку в две различные системы координат, то есть - внешнюю (ротация / перевод) данные отсутствуют.
Книга H&Z содержит информацию (глава 9) о восстановлении требуемых матриц из основной или существенной матрицы с использованием разложения SVD, но с дополнительными собственными проблемами (например, неоднозначность масштаба). Я чувствую, что мне это не нужно, поскольку у меня есть явное определение поворота и перевода.
Тогда возникает вопрос: будет ли правильно использовать первую внутреннюю матрицу с дополнительным столбцом нулей в качестве первой "матрицы камеры" (P=[M|0]), а затем умножить вторую внутреннюю матрицу на внешнюю матрицу? состоит из матрицы вращения и вектора перевода в качестве дополнительного столбца для получения второй требуемой "матрицы камеры" (P'=M'*[R|t])? Или это должно быть сделано по-другому?
Спасибо!
1 ответ
У меня нет моего H&Z под рукой - но их старое руководство по CVPR по этой теме здесь (для всех, кто хочет взглянуть на этот вопрос).
Просто для ясности (и для использования их терминологии) матрица проекции P отображается из евклидовой трехмерной точки (X) в точку изображения (x) как:
x = PX
где:
P = K[ R | t ]
определяется матрицей калибровки камеры (3x3) K и матрицей вращения (3x3) R и вектором перевода (3x1) t.
Суть вопроса, кажется, заключается в том, как выполнить триангуляцию, используя две камеры P и P '.
Я полагаю, что вы предполагаете, что мировое происхождение находится на первой камере P, таким образом:
P = K [ I | 0]
а также
P' = K' [ R | t ]
Что мы тогда ищем для реконструкции в Фундаментальной Матрице F такой, что:
x' F x = 0
Матрица F, конечно, может быть рассчитана любым количеством способов (иногда чаще из некалиброванных изображений!), Но здесь я думаю, что вы можете сделать это на основе уже откалиброванных матриц камер, указанных выше, как:
F = [P' C]_x P' pinv(P)
куда C = (0 1)
центр первой камеры и pinv(P)
является псевдообратным к P._x
указывает обозначения, используемые в литературе для умножения матриц для вычисления векторного произведения.
Затем вы можете выполнить факторизацию фундаментальной матрицы F (выполняется через SVD или прямой метод).
F = [t]_x M
И, следовательно, как вы правильно сказали, мы можем вычислить триангуляцию непосредственно на основе:
P = [ I | 0 ]
а также
P' = [ M | t ]
Их использование для триангуляции должно быть относительно простым (при условии хорошей калибровки, отсутствия шума и т. Д. И т. Д.)