Преобразование координат C ++ - PullRequest
3 голосов
/ 14 сентября 2009

У меня есть веб-камера, направленная на наклонный стол, и я отслеживаю маркеры. У меня есть TransformationMatrix в OpenSceneGraph, и его часть перевода содержит относительные координаты от отслеживаемого объекта до камеры. Поскольку камера направлена ​​на наклон, при перемещении маркера по таблице обновляются оси Y и Z, хотя все, что я хочу обновить, это ось Z, поскольку высота маркера не изменяет только его расстояние до камера. Это имеет эффект, когда при проецировании модели на маркер в OpenSceneGraph модель немного отключается, и когда я перемещаю маркер по кругу, значения Y и Z обновляются некорректно.

Так что я предполагаю, что мне нужна Матрица преобразования, с которой я умножаю каждую точку, чтобы у меня была новая Система координат, которая лежит ортогонально на поверхности стола. Примерно так: A * v1 = v2 v1 - координаты камеры, а v2 - мои «координаты таблицы» Поэтому я выбрал 4 пункта для «калибровки» моей системы. Поэтому я поместил маркер в верхний левый угол экрана и определил v1 как текущие координаты камеры, а v2 как (0,0,0), и я сделал это для 4 разных точек. И затем, взяв линейные уравнения, полученные из неизвестной матрицы и двух известных векторов, я решил матрицу.

Я думал, что значения, которые я получу для матрицы, будут значениями, необходимыми мне для умножения координат камеры, чтобы модель корректно обновлялась на маркере. Но когда я умножил известные координаты камеры, которые я собирал ранее, с помощью матрицы, я не получил ничего похожего на то, что предполагалось для моих «координат таблицы».

Является ли мой подход совершенно неправильным, я просто что-то напутал в уравнениях? (решается с помощью wolframalpha.com) Есть ли более простой или лучший способ сделать это? Любая помощь будет принята с благодарностью, так как я немного потерян и под некоторым давлением времени: - / Спасибо, David

Ответы [ 2 ]

2 голосов
/ 17 сентября 2009

когда я перемещаю маркер по таблице, оси Y и Z обновляются, хотя все, что я хочу обновить, это ось Z, потому что высота маркера не меняет только его расстояние до камеры.

Истина, только когда направление обзора вашей камеры совпадает с вашей осью Y (или осью Z). Если камера не выровнена с Y, это означает, что преобразование будет применять вращение вокруг оси X, следовательно, изменяя координаты Y и Z маркера.

Так что я предполагаю, что мне нужна Матрица преобразования, с которой я умножаю каждую точку, чтобы у меня была новая Система координат, которая лежит ортогонально на поверхности стола.

Да, это так. После этого у вас будет 2 преобразования:

  1. T_table для выражения координат маркера в ссылочной таблице,
  2. T_camera для выражения координат таблицы в ссылочной камере.

Трудно найти T_camera из одного 2D-изображения, потому что нет информации о глубине.

Это известно как проблема Позы - она ​​была изучена - среди других - Даниэлем Дементоном. Он разработал быстрый и надежный алгоритм для определения позы объекта:

Обратите внимание, что библиотека OpenCv предлагает реализацию алгоритма DeMenthon. Эта библиотека также предлагает удобный и простой в использовании интерфейс для захвата изображений с веб-камеры. Стоит попробовать: Домашняя страница OpenCv

0 голосов
/ 14 сентября 2009

Если вам известно местоположение в ваших четырех маркерах в физическом мире, и вы записали их так, как они отображаются на камере, вы должны иметь возможность получить какое-то преобразование.

Когда вы выполняете калибровку, вы наверняка захотите поместить маркер в четыре угла таблицы, а не на экран? Если вы просто делаете углы экрана, я думаю, что вы, вероятно, не принимаете во внимание уклон стола.

Является ли стол буквально наклонным относительно камеры, или он тоже вообще повернут?

...