Расчет 3D-точки стереозрения с известной внутренней и внешней матрицей - PullRequest
0 голосов
/ 15 сентября 2018

Я успешно рассчитал вращение, трансляцию с помощью встроенной матрицы камер из двух камер. Я также получил исправленные изображения с левой и правой камер. Теперь мне интересно, как я вычисляю трехмерную координату точки, только одной точки на изображении. Здесь, пожалуйста, смотрите зеленые точки. Я смотрю на уравнение, но оно требует базового уровня, который я не знаю, как рассчитать. Не могли бы вы показать мне процесс вычисления трехмерной координаты зеленой точки с заданной информацией (R, T и внутренняя матрица)?

FYI 1. У меня также есть Фундаментальная матрица и Основная матрица, на всякий случай, если они нам нужны. 2. Исходное изображение размером 960 x 720. Выпрямленные изображения: 925 x 669. 3. Зеленая точка на левом изображении: (562, 185), на правом изображении: (542, 185)

enter image description here

1 Ответ

0 голосов
/ 18 сентября 2018

Термин «базовый уровень» обычно означает просто перевод. Поскольку у вас уже есть матрицы поворота, перевода и встроенных функций (давайте не будем их R, T и K). Вы можете триангулировать и вам не нужны ни Фундаментальные, ни Основные матрицы (их можно использовать для извлечения R, T и т. д., но они у вас уже есть). Вам также не нужно исправлять ваши изображения, поскольку это не сильно меняет процесс триангуляции. Существует три способа триангуляции, каждый со своими плюсами и минусами, и множество библиотек, которые их реализуют. Итак, все, что я могу здесь сделать, это дать вам и обзор проблемы и потенциальных решений, а также ссылки на ресурсы, которые вы можете использовать как есть, или как источник вдохновения для написания собственного кода.

  • Формализация и схемы решения. Давайте формализуем то, что мы преследуем здесь. У вас есть 3D-точка X с двумя наблюдениями x_1 и x_2 соответственно на левом и правом изображениях. Если вы спроецируете их обратно, вы получите два луча:

    ray_1=K^{1}x_1
    rat_2=R*K^{-1}x_2+T  //I'm assuming that [R|T] is the pose of the second camera expressed in the referential of the first camera 
    

    В идеале вы бы хотели, чтобы эти два луча встретились в точке X. Поскольку на практике у нас всегда есть некоторый шум (шум дискретизации, ошибки округления и т. Д.), Два луча не встретятся при X, поэтому наилучшим ответом будет точка Q такая, что

    Q=argmin_X {d(X,ray_1)^2+d(X,ray_2)^2}
    

    где d(.) обозначает евклидово расстояние между прямой и точкой. Вы можете решить эту проблему как обычную задачу наименьших квадратов, или вы можете просто использовать геометрический подход (называемый midpoint ), рассматривая отрезок прямой l, который перпендикулярен как ray_1, так и ray_2. и возьмите его середину в качестве решения. Другой быстрый и грязный способ - использовать DLT. По сути, вы переписываете ограничения (, т.е. X должны быть как можно ближе к обоим лучам) как линейная система AX=0 и решаете ее с помощью SVD.

    Обычно геометрический (средний) метод менее точен. Основанный на DLT, хотя и не самый стабильный в численном отношении, обычно дает приемлемые результаты.

  • Ресурсы, которые представлены в глубокой формализации

    Книга Хартли-Циссермана конечно! Глава 12. Простой метод на основе DLT, который используется в opencv (как в калибровочном, так и в модуле sfm), описан на стр. 312. Его очень легко реализовать, он не должен занимать более 10 минут в любом язык.

    Книга Szeliski. В ней есть интересная дискуссия по триангуляции в главе о SFM, но она не столь прямолинейна или глубока, как у Хартли-Циссермана.

  • Код. Вы можете использовать методы триангуляции из opencv, либо из модуля calib3d, либо из модуля contribs / sfm. Оба используют DLT, но код из модуля SFM более понятен (в коде calib3d много старомодного C-кода, который не очень приятно читать). Существует также другая библиотека, называемая openGV, в которой есть несколько интересных методов триангуляции.

    резюме :: triangulatePoints

    резюме :: SFM :: triangulatePoints

    OpenGV

    openGV git repo, похоже, не очень активен, и я не большой поклонник дизайна библиотеки, но если я правильно помню (не стесняйтесь говорить мне иначе), он предлагает методы, отличные от DLT для триангуляции.

    Естественно, все они написаны на C ++, но если вы используете другие языки, поиск оболочек или подобных библиотек не составит труда (с python у вас все еще есть оболочки opencv, а в MATLAB есть модуль bundle и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...