Ответ 1
Прежде всего, вы должны проверить,
x' * F * x = 0
для ваших точечных соответствий x'
и x
. Это должно быть, конечно, только для случаев фундаментальной оценки матрицы с помощью RANSAC.
После этого вам необходимо преобразовать ваши соответствия точек в нормализованные координаты изображения (NCC), подобные этому
xn = inv(K) * x
xn' = inv(K') * x'
где K'
- внутренняя матрица камеры второго изображения, а x'
- точки второго изображения. Я думаю, что в вашем случае это K = K'
.
С помощью этих NCC вы можете разложить свою основную матрицу, как вы описали. Вы триангулируете нормализованные координаты камеры и проверяете глубину ваших триангулированных точек. Но будьте осторожны, в литературе говорят, что одного пункта достаточно, чтобы получить правильное вращение и перевод. По моему опыту вы должны проверить несколько точек, поскольку одна точка может быть выбросом даже после RANSAC.
Прежде чем разложить основную матрицу, убедитесь, что E=U*diag(1,1,0)*Vt
. Это условие требуется для получения правильных результатов для четырех возможных вариантов проекционной матрицы.
Когда у вас есть правильное вращение и перевод, вы можете триангулировать все ваши точечные соответствия (вкладчики фундаментальной оценки матрицы с помощью RANSAC). Затем вы должны вычислить ошибку перепрограммирования. Во-первых, вы вычисляете перепечатанную позицию следующим образом
xp = K * P * X
xp' = K' * P' * X
где x
- вычисленная (однородная) трехмерная позиция. P
и P'
являются матрицами проецирования 3x4. Проекционная матрица P
обычно задается тождеством. P' = [R, t]
задается матрицей вращения в первых трех столбцах и строках и переводом в четвертом столбце, так что P
является матрицей 3x4. Это работает, только если вы преобразуете свое трехмерное положение в однородные координаты, то есть 4x1 векторы вместо 3x1. Тогда xp
и xp'
также являются однородными координатами, представляющими ваши (перепроектированные) двумерные позиции ваших соответствующих точек.
Я думаю, что
new_pos = old_pos + -R.t()*t;
неверно, так как во-первых, вы только переводите old_pos
, и вы не поворачиваете его, а во-вторых, вы переводите его с неправильным вектором. Правильный путь приведен выше.
Итак, после вычисления перепрограммированных точек вы можете вычислить ошибку повторения. Поскольку вы работаете с однородными координатами, вы должны их нормализовать (xp = xp / xp(2)
, делить на последнюю координату). Это дается
error = (x(0)-xp(0))^2 + (x(1)-xp(1))^2
Если ошибка велика, например 10 ^ 2, ваша собственная калибровка камеры или ваш поворот/перевод неверны (возможно, оба). В зависимости от вашей системы координат вы можете попытаться инвертировать проекционные матрицы. В этом случае вам нужно преобразовать их в однородные координаты до того, как вы не сможете инвертировать матрицу 3x4 (без псевдоверса). Таким образом, добавьте четвертую строку [0 0 0 1], вычислите обратную и удалите четвертую строку.
Есть еще одна вещь с ошибкой перепечатки. В общем случае ошибка повторного воспроизведения представляет собой квадрат расстояния между вашим исходным соответствием точки (на каждом изображении) и перепрограммированной позицией. Вы можете взять квадратный корень, чтобы получить евклидовое расстояние между обеими точками.