Понимание вида и матрицы проекции от Pybullet - PullRequest
0 голосов
/ 27 февраля 2020

При работе с рендерингом изображений в Pybullet необходимо использовать getCameraImage, который принимает в качестве входных данных матрицы view и projection (pybullet также имеет функции для генерации этих матриц). Теоретически, проекционная матрица должна быть P = K [R | t], ее можно переписать как P = [M | -MC], чтобы мы могли использовать в теории разложение RQ с M, где R - верхний три angular матрица Таким образом, мы можем восстановить K и [R | t] из матрицы проекций (имея в виду, что R из разложения RQ не является R из R | t). Но когда я использую, например, scipy.linalg.rq, результат не является допустимой матрицей K (intrinsi c).

Может кто-нибудь объяснить, как точно определена матрица проекции и какова матрица представления в pybullet? и как мы можем получить параметры intrinsi c и extrinsi c, используя эти матрицы?

1 Ответ

0 голосов
/ 28 февраля 2020

Таким образом, pybullet обычно строит матрицу проекции ( исходный код ), используя поле зрения (FOV в радианах) как

enter image description here

и матрица intrinsi c определяется как

enter image description here

p_x и p_y являются основными точками, обычно в центре изображения. Итак, есть несколько отличий:

  1. Размеры. Pybullet добавляет третий ряд (не четвертый) и четвертый столбец для хранения информации о глубине.
  2. Игнорируя третью строку, элемент 2,2 (нулевой индекс) не равен 1.
  3. Pybullet использует параметр смещения 0

Во-первых, pybullet использует обозначение OpenGL, поэтому он использует порядок главных столбцов ( read more ). Значение первого элемента при индексации - это столбец, а не строка. Поэтому фактическая проекционная матрица из pybullet должна быть транспонирована.

Во-вторых, полное уравнение для преобразования FOV в фокусное расстояние f:

enter image description here

, поэтому pybullet умножает фокусное расстояние на 2 / ч. Причина в том, что pybullet использует нормализованные координаты устройства ( ND C), которые обрезают значение между [-1,1] (деление x на ширину обрезает его до [0,1] и умножает на 2 обрезает его между [0,2], который, если главная точка находится в средней точке изображения 1,1, обрезается до [-1,1]). Поэтому фокусное расстояние pybullet - это правильное фокусное расстояние с использованием ND C.

Ненулевые значения в третьем столбце матрицы проекции предназначены для отображения значений z в OpenGL, поэтому мы можем их игнорировать.

k, l в матрице K - это отношение мм / px, если мы используем pybullet, мы можем сказать, что k = l = 1.

Некоторые полезные ресурсы: [1] , [2] и [3] .

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