Преобразование координат С++

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

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

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

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


person Community    schedule 14.09.2009    source источник
comment
Если это поможет, я использую osgART, который сочетает в себе отслеживание ArToolkits и плагин видео с OpenSceneGraph.   -  person    schedule 14.09.2009
comment
Проверьте свою алгебру... возможно, вы вычисляете обратное преобразование?   -  person Ryan    schedule 14.09.2009


Ответы (2)


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

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

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

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

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

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

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

  • статьи доступны на его главной странице исследования, раздел 4 "Объект на основе модели". Поза» (и особенно «Поза объекта на основе модели в 25 строках кода», 1995 г.);
  • код на там же, раздел "POSIT (C и Matlab )».

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

person Julien-L    schedule 17.09.2009
comment
Эй, спасибо за ваш ответ. Я успешно создал матрицу, которая может преобразовывать координаты, которые моя веб-камера дает мне для положения маркера, и координаты моей таблицы. Но я не совсем уверен, куда идти отсюда. Если я просто возьму эти новые точки, модель проецируется прямо перед камерой, а не на маркере. Если я перевожу его на маркер, он все равно обновляется неправильно. Проблема в том, что он обновляется в соответствии с отражением монитора, которое в основном находится под углом 90 ° к монитору (45 ° к стеклянной панели), а не прямо на столе. Любые идеи? - person ; 18.09.2009
comment
Извините за комментарий из 2 частей :) Таким образом, он правильно обновляется по проецируемому изображению, но я хочу, чтобы он правильно обновлялся по таблице. Мне сказали преобразовать Систему координат камеры в начало координат плоскости обзора (которая должна быть началом начала отражения монитора), а затем умножить оттуда обратную матрицу камеры. Это полностью игнорировало бы созданную мной матрицу, которая трансформируется между моей созданной системой координат и камерами. (Человек сказал, что координаты моего стола не имеют отношения к сцене) Я действительно не совсем понимаю это. Любая помощь будет принята с благодарностью. - person ; 18.09.2009
comment
Это ответ с опозданием почти на месяц, извините за это. Во всяком случае, я не совсем уверен, какова ваша установка. Но если вам нужны только координаты маркера в опорной камере, либо примените алгоритм Pose к маркеру, либо используйте 2 веб-камеры для триангуляции положения маркера (в обоих случаях вам нужно будет найти известные и узнаваемые точки на вашем маркере и в обоих случаях таблица вам не понадобится). - person Julien-L; 07.10.2009

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

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

Стол буквально просто наклонен относительно камеры или он вообще повернут?

person Jon Cage    schedule 14.09.2009
comment
Спасибо за быстрый ответ, камера не видит весь стол, стол - это просто поверхность, на которой я перемещаю маркеры. Камера просто указывает на поверхность стола под углом. Таким образом, углы стола больше не попадают в поле зрения камеры. Поэтому я попытался добраться до самых дальних уголков, которые еще может видеть камера. Итак, углы экрана. Если вам нужно изображение установки, пожалуйста, спросите меня, и я постараюсь разместить его в Интернете как можно скорее, спасибо, Дэвид. - person ; 14.09.2009
comment
Я задавался вопросом, так ли это. Тогда это имеет смысл - похоже, вы, вероятно, смотрите на это с правильной стороны. Пробовали ли вы нанести на стол обычную сетку, чтобы убедиться, что к краю изображения нет бочкообразного искажения? Возможно, веб-камера больше изогнута по углам, что может нарушить вашу калибровку..? - person Jon Cage; 14.09.2009