Рисование модели углов Эйлера на 2d изображении

В настоящее время я пытаюсь нарисовать трехмерное представление углов Эйлера в двухмерном изображении (без графических окон opengl или 3d). Вывод изображения может быть таким же, как показано ниже.

углы Эйлера

По сути, я ищу исследование или алгоритм, который может взять матрицу вращения или набор углов Эйлера и затем вывести их на 2-мерное изображение, как показано выше. Это будет реализовано в приложении C ++, которое использует OpenCV. Он будет использоваться для вывода информации аннотации в окне OpenCV в зависимости от состояния объекта.

Я думаю, что я слишком много думаю об этом, потому что я должен быть в состоянии разложить единичные векторы из матрицы вращения, а затем извлечь их компоненты x, y и нарисовать линию в декартовом пространстве из (0,0). Я прав в этом мышлении?

РЕДАКТИРОВАТЬ: Я ищу ортографическую проекцию. Вы можете предположить, что изображение выше имеет правильную камеру / угол обзора.

Любая помощь будет оценена.

Спасибо,

РЕДАКТИРОВАТЬ: Пример исходного кода теперь можно найти в моем репо.
Заголовок: https://bitbucket.org/jluzwick/tennisspindetector/src/6261524425e8d80772a58fdda76921edb53b4d18/include/projection_matrix.h?at=master

Определения класса: https://bitbucket.org/jluzwick/tennisspindetector/src/6261524425e8d80772a58fdda76921edb53b4d18/src/projection_matrix.cpp?at=master

Это не лучший код, но он работает и показывает шаги, необходимые для получения матрицы проекции, описанной в принятом ответе.

Также вот YouTube-видео с проекционной матрицей в действии (наряду с добавлением масштаба и перевода): http://www.youtube.com/watch?v=mSgTFBFb_68

1

Решение

Вот мои два цента. Надеюсь, поможет.

Если я правильно понимаю, вы хотите повернуть 3D система координат, а затем проецировать ее ортогонально на заданный 2D самолет (2D плоскость определяется относительно оригинала, не повернута 3D система координат).

«Вращение и проектирование 3D система координат «вращается» 3D базисные векторы и проецирование их ортогонально на 2D самолет, чтобы они стали 2D векторы по отношению к 2D Основа плоскости «. Пусть оригинал 3D векторы не загрунтованы и в результате 2D векторы должны быть загрунтованы. Позволять {e1, e2, e3} = {e1..3} быть 3D ортонормированный базис (который дан), и {e1 ‘, e2’} = {e1..2 ‘} быть 2D ортонормированный базис (который мы должны определить). По сути, нам нужно найти такой оператор PR тот PR * v = v ‘.

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

  1. Для обоих 3D вращение и 3D-> 2D В проекционных операторах существуют вещественные матричные представления (линейные преобразования; 2D является подпространством 3D).
  2. Это два преобразования, применяемые последовательно, т.е. PR * v = P * R * v = v ‘, поэтому нам нужно найти матрицу вращения р и матрица проекции п. Понятно, после того, как мы повернули v с помощью р, мы можем спроецировать вектор результата УЙ с помощью п.
  3. У вас есть матрица вращения р уже, поэтому мы считаем, что это данность 3×3 матрица. Так что для простоты поговорим о проектировании вектора vR = R * v.
  4. Матрица проекции п это 2×3 матрица с я-этот столбец является проекцией я-го 3D базисный вектор й на {E1..2′ } основа.

Давайте найдем п матрица проекции, такая как 3D вектор УЙ линейно превращается в 2D вектор на 2D плоскость с ортонормированным базисом {E1..2′ }.

2D плоскость может быть легко определена вектором, нормальным к нему. Например, из цифр в ОП, кажется, что наши 2D плоскость (плоскость бумаги) имеет нормальный единичный вектор п = 1 / SQRT (3) * (1, 1, 1). Нам нужно найти 2D основа в 2D плоскость определяется этим N. Поскольку любые два линейно независимых вектора лежат в нашем 2D Плоскость образовала бы такой базис, вот бесконечное количество таких базисов. Исходя из геометрии задачи и ради простоты, наложим два дополнительных условия: во-первых, база должна быть ортонормированной; во-вторых, должен быть визуально привлекательным (хотя это несколько субъективное условие). Как легко увидеть, такая основа формируется в грунтованной системе тривиально e1 ‘= (1, 0)’ = Икс’-ось (горизонтальная, в положительном направлении слева направо) и e2 ‘= (0, 1)’ = у»-ось (вертикальная, в положительном направлении снизу вверх).

Давайте теперь найдем это {e1 ‘, e2’} 2D основа в {} E1..3 3D основа.

  1. Давайте обозначим e1′ а также e2′ как e1″ а также e2″ в оригинальной основе. Отмечая что в нашем случае e1″ не имеет e3-составная часть (Z-компонент), и используя тот факт, что N точка e1 «= 0, мы получаем это e1 ‘= (1, 0)’ -> e1 «= (-1 / sqrt (2), 1 / sqrt (2), 0) в {} E1..3 основа. Вот, точка обозначает точечный продукт.
  2. затем e2 «= n пересекать e1 «= (-1 / sqrt (6), -1 / sqrt (6), 2 / sqrt (6)). Вот, пересекать обозначает перекрестный продукт.

2×3 матрица проекции п для 2D плоскость определяется п = 1 / SQRT (3) * (1, 1, 1) затем определяется как:

( -1/sqrt(2)    1/sqrt(2)        0     )
( -1/sqrt(6)   -1/sqrt(6)    2/sqrt(6) )

где первый, второй и третий столбцы преобразуются {} E1..3 3D основа на нашем 2D основа {E1..2′ }, то есть e1 = (1, 0, 0) от 3D база имеет координаты (-1 / кв.м. (2), -1 / кв.м. (6)) в нашем 2D основа и тд.

Чтобы проверить результат, мы можем проверить несколько очевидных случаев:

  1. N ортогонально нашему 2D плоскость, поэтому не должно быть проекции. В самом деле, P * n = P * (1, 1, 1) = 0.
  2. e1, e2 а также e3 должны быть преобразованы в их представление в {E1..2′ }, а именно соответствующий столбец в п матрица. В самом деле, P * e1 = P * (1, 0, 0) = (-1 / sqrt (2), -1 / sqrt (6)) и так далее.

Чтобы решить проблему. Теперь мы построили проекционную матрицу п от 3D в 2D для произвольно выбранного 2D самолет. Теперь мы можем проецировать любой вектор, предварительно повернутый матрицей вращения. р, на эту плоскость. Например, повернутая оригинальная основа {R * ​​e1, R * e2, R * e3}. Более того, мы можем умножить с учетом п а также р получить матрицу преобразования вращения-проекции PR = P * R.

Постскриптум Реализация C ++ оставлена ​​как домашнее задание;).

1

Другие решения

Матрица вращения будет легко отображаться,

Матрица вращения может быть построена с использованием нормального, бинормального и касательного.

Вы должны быть в состоянии получить их обратно следующим образом:

Bi-Normal (y') : matrix[0][0], matrix[0][1], matrix[0][2]
Normal    (z') : matrix[1][0], matrix[1][1], matrix[1][2]
Tangent   (x') : matrix[2][0], matrix[2][1], matrix[2][2]

С помощью преобразования перспективы вы можете добавить перспективу (x, y) = (x / z, y / z)

Чтобы получить орфографический проект, подобный показанному, вам нужно будет умножить на другую фиксированную матрицу вращения, чтобы перейти к виду «камера» (45 ° вправо и затем вверх)

Затем вы можете умножить свои конечные точки x (1,0,0), y (0,1,0), z (0,0,1) и центр (0,0,0) на конечную матрицу, используя только координаты х, у.

центр всегда должен преобразовываться в 0,0,0

Затем вы можете масштабировать эти значения, чтобы нарисовать 2D холст.

0

По вопросам рекламы [email protected]