Ответ 1
если вы можете использовать opencv 3.0, этот метод разложения доступен http://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#decomposehomographymat
Я пытаюсь рассчитать масштаб, поворот и перевод между двумя последовательными кадрами видео. Поэтому в основном я сопоставил ключевые точки, а затем использовал opencv-функцию findHomography()
для вычисления матрицы гомографии. homography = findHomography(feature1 , feature2 , CV_RANSAC); //feature1 and feature2 are matched keypoints
Мой вопрос: как я могу использовать эту матрицу для вычисления масштаба, вращения и перевода?.
Может ли кто-нибудь предоставить мне код или объяснение того, как это сделать?
если вы можете использовать opencv 3.0, этот метод разложения доступен http://docs.opencv.org/3.0-beta/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#decomposehomographymat
Для оценки древомерного преобразования и вращения, вызванного гомографией, существуют множественные подходы. Один из них предоставляет закрытые формулы для разложения гомографии, но они очень сложны. Кроме того, решения никогда не являются уникальными.
К счастью, OpenCV 3 уже реализует это разложение (decomposeHomographyMat). Учитывая гомографию и правильно масштабированную матрицу внутренних функций, функция предоставляет набор из четырех возможных поворотов и переводов.
Приведенная гомографическая матрица H
:
|H_00, H_01, H_02|
H = |H_10, H_11, H_12|
|H_20, H_21, H_22|
Предположения:
H_20 = H_21 = 0
и нормализовано до H_22 = 1
для получения 8 DOF.
Перевод по осям x и y вычисляется напрямую из H
:
tx = H_02
ty = H_12
2x2
в верхнем левом углу разлагается для вычисления сдвига, масштабирования и поворота. Простой и быстрый метод разложения объясняется здесь.
Примечание: этот метод предполагает использование обратимой матрицы.
Правильный ответ - использовать гомографию, как она определена, dst = H ⋅ src
и исследовать, что она делает с небольшими сегментами вокруг определенной точки.
Учитывая одну точку, для перевода сделать
T = dst - (H ⋅ src)
Даны две точки р 1 и р 2
p 1= H ⋅ p 1
p 2= H ⋅ p 2
Теперь просто вычислите угол между векторами p 1, p 2 и p 1 'p 2 '.
Вы можете использовать тот же трюк, но теперь просто сравните длины: | p 1 p 2 | и | p 1 'p 2 ' |.
Чтобы быть справедливым, используйте другой сегмент, ортогональный первому, и усредните результат. Вы увидите, что нет постоянного масштабного коэффициента или коэффициента перевода. Они будут зависеть от местоположения src
.
Возникает вопрос о двумерных параметрах. Гомографическая матрица фиксирует искажение перспективы. Если приложение не создает большого искажения перспективы, можно аппроксимировать трансформацию реального мира с использованием матрицы аффинного преобразования (которая использует только масштаб, вращение, перевод и отсутствие сдвига/переворота). Следующая ссылка даст представление о разложении аффинного преобразования на разные параметры.
https://math.stackexchange.com/info/612006/decomposing-an-affine-transformation