Подтвердить что ты не робот

Преобразование векторов вращения и трансляции OpenCV в положение XYZ и положение XYZ

Есть сообщения Google и сообщения stackoverflow, которые, кажется, отвечают на этот вопрос, но простой факт заключается в том, что я не могу их понять. Независимо от того, насколько я читаю, я не могу окунуться в кватернионы, а углы Эйлера и преобразования Родригеса - все это.

Любой, кто объяснит мне, как мне 12, как получить из векторов вращения и перевода, возвращаемых методом OpenCV solvePnP(), в значения xyz Position и xyz Rotation, которые я могу подключить к графическому приложению 3D?

Это приложение для дополненной реальности в С++. Я открываю и запускаю OpenCV, отслеживая маркерную панель и отправляю векторы вращения и перевода в графическую программу, но я понятия не имею, как использовать эту информацию для создания моего 3D-объекта.

Я действительно хочу понять математику, стоящую за этим, и по достоинству оценят любое объяснение теории здесь. Но я также соглашусь на указатель на какой-то код, который я могу скопировать/вставить и изучить теорию еще на один день. На самом деле я, кажется, быстрее изучаю такие вещи, видя конкретный код и работая обратно в теорию.

EDIT: Как там этот... который явно должен указывать на меня в правильном направлении, но это может быть и план для машины времени для всех я знать. Мне пришло в голову, что я могу попросить исправительную математику средней школы, но это не может быть в первый раз.

EDIT: Здесь приведен пример вектора вращения и вектора перевода, возвращаемого из solvePnP()..., преобразованного в XML для поездки в графическое приложение. Обратите внимание, что каждый из них, который я видел, содержит три строки и один столбец.

<Tvec type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>f</dt>
  <data>
    -2.50094433e+01 -6.59909010e+00 1.07882790e+02
  </data>
</Tvec>
<Rvec type_id="opencv-matrix">
  <rows>3</rows>
  <cols>1</cols>
  <dt>f</dt>
  <data>
    -1.92100227e+00 -2.11300254e-01 2.80715879e-02
  </data>
</Rvec>
4b9b3361

Ответ 1

Вначале я ничего не знал о форматах, которые использует OpenCV. Итак, некоторые исследования в первую очередь. Глядя на документацию для solvePnP, она выглядит как возвращающая матрицу. Функция Rodrigues2, упомянутая там появится, которая будет называться Rodrigues в эти дни.

В описании указано, что вы можете ожидать матрицу с одной строкой или одним столбцом. Направление этого вектора указывает ось вращения, а длина (или "норма" ) вектора дает угол.

Итак, ваш ввод находится в представлении угловой оси. Который вы можете интерпретировать как одновременное вращение относительно осей x, y и z. Так что, если "поворот XYZ" означает одновременное вращение, то вы уже находитесь. Если, однако, вы имеете в виду некоторую комбинацию, которая сначала вращается вокруг оси x, а затем о оси y, а затем о оси z, вы находитесь в странной настройке и, вероятно, должны убедиться, что используете правильный API.

Если это углы Эйлера, то вы называете их "XYZ rotation" несколько вводит в заблуждение. Статья в википедии Форматизация вращения в трех измерениях содержит список различных форматов и способы их преобразования. В частности, он дает формулы для преобразования из оси и угла в матрицу, а оттуда - к углам Эйлера.

Убедитесь, что вы используете правильное представление в соответствии с машинами вывода графики. Или, если у вас есть выбор, попробуйте работать непосредственно в представлении rotation marix, поскольку это должно быть проще всего понять и работать с ним.

Ответ 2

  • Расширьте 3D-векторы до однородных координат (4D). Это означает, что 4D-вектор с компонентами (X, Y, Z, 1)

  • Создайте матрицу преобразования 4x4 на основе параметров вращения и перевода. Он называется аффинным преобразованием. Вы находитесь на правильном пути со статьей о матрицах вращения.

  • Умножьте координатные векторы с матрицей преобразования.

Ознакомьтесь с разделом wikipedia: http://en.wikipedia.org/wiki/Transformation_matrix#Affine_transformations

У этого есть пример, поставленный в 2d координатах, я уверен, что вы получите достаточно идеи, чтобы перейти к 3d.

Ответ 3

Я предполагаю, что OpenCv уже возвращает вращения XYZ. Возьмите левую руку (правило левой руки) и закройте кулак. Приложите большой палец вверх (ось z), вытяните указательный палец прямо перед собой (ось x), затем проведите средний палец вправо (ось y).

Любой конкретный вектор ориентации может быть задан до трех поворотов. Важно понимать, что вы можете получить эквивалентные вращения. Например, вращайте вокруг оси z так, чтобы ваш указатель указывал справа. Эквивалентным вращением будет Y, X, затем Y снова, без использования оси Z.

Однако, когда вы используете полную матрицу вращения (3x3), вам не нужно беспокоиться об этих соглашениях, потому что все они объединены в матрицу. Это то, о чем вы писали в статье, а не о путешествиях во времени, чему повезло, так как большинство математиков-майоров смогут путешествовать во времени, тем самым обрекая человечество.

Однако векторы вращения обычно относятся к тому, какой вектор в пространстве должен вращаться ваш объект.