2009-09-14 7 views
3

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

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

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

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

+0

Если это какая-либо помощь, я использую osgART, который объединяет отслеживание ArToolkits и видеоплагин с OpenSceneGraph. – 2009-09-14 12:46:26

+1

Проверьте свою алгебру ... вы, возможно, вычисляете инверсию своего преобразования? – Ryan

ответ

0

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

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

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

+0

Спасибо за быстрый ответ, Камера не видит всю таблицу, таблица - это только поверхность, на которую я перемещаю маркеры. Камера просто указывает на поверхность стола под углом. Таким образом, углы стола больше не видны в обзоре камеры. Поэтому я попытался пойти в самые дальние части камеры, которые все еще могут «видеть». Итак, углы «Экран» Если вам нужна фотография установки, пожалуйста, спросите меня, и я попробую поставить один онлайн-асап, спасибо, David – 2009-09-14 13:04:54

+0

Я подумал, не так ли. Это имеет смысл тогда - похоже, что вы, вероятно, правильно смотрели на это. Вы пытались поместить обычную сетку на стол, чтобы убедиться, что нет искажений ствола к краю изображения? Возможно, веб-камера более изогнута по углам, которые могут выкинуть вашу калибровку.? –

2

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

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

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

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

  1. t_table выразить координаты маркеров в таблице ссылочного,
  2. T_camera выразить таблицы координат в ссылочной камере.

Поиск T_camera из одного 2-го изображения затруднен, потому что информация о глубине отсутствует.

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

  • статьи можно ознакомиться на его research homepage, раздел 4 «модель на основе объекта Pose» (и в частности, «Model-Based объекта Поза в 25 строк кода» , 1995 год);
  • код на the same place, раздел «ПОЗИТ (C и Matlab)».

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

+0

Эй, спасибо за ваш ответ. Я успешно создал матрицу, которая может трансформироваться между координатами, которые моя веб-камера дает мне для позиции маркера и моих координат таблицы. Но я не совсем уверен, куда идти отсюда. Если я просто возьму эти новые точки, он проецирует модель прямо перед камерой, которая находится на маркере. Если я переведю его на маркер, он все равно обновит неверно. Проблема в том, что он обновляется в соответствии с отражением монитора, который в основном под углом 90 ° к монитору (45 ° к стеклянному стеклу), а не прямо на столе. Есть идеи? – 2009-09-18 10:19:40

+0

Извините за комментарий к 2 части :) Итак, он правильно обновляется вдоль проецируемого изображения, но я хочу, чтобы он правильно обновлялся по таблице. Мне сказали преобразовать систему координат камеры в начало координат (которая должна быть источником источника отраженного монитора), а затем умножить матрицу обратной камеры. Это полностью пренебрегало созданной мной матрицей, которая трансформируется между моей созданной системой координат и камерами. (Человек сказал, что мои координаты стола были нерелевантными для сцены) Я действительно не совсем понимаю это. Любая помощь будет принята с благодарностью. – 2009-09-18 10:25:29

+0

Это почти один месяц позднего ответа, извините за это. В любом случае, я не совсем уверен, что у вас есть.Но если то, что вы хотите, это только координаты маркера в референтной камере, примените алгоритм Позы на маркере или используйте 2 веб-камеры для триангуляции положения маркера (в обоих случаях вам нужно будет найти известные и узнаваемые точки на вашем маркере и в обоих случаях вам не понадобится таблица). –

Смежные вопросы