матрица относительного перевода между двумя маркерами AR - PullRequest
4 голосов
/ 21 декабря 2011

Я сейчас пытаюсь написать простое AR-приложение, в частности, я пытаюсь вычислить перевод между двумя квадратными маркерами, аналогично тому, как они делают это на этом сайте внизу: Artoolkit

Используемые маркеры имеют одинаковый размер (100 мм x 100 мм), и мое изображение не имеет искажений камеры (в данный момент я использую тестовое изображение).

В настоящее время мой процесс идет следующим образомэти шаги:

  1. Обнаружение маркеров на изображении и извлечение углов.
  2. Запуск копланарного ПОЗИТА с учетом углов маркера.
  3. С учетом 2 преобразований маркера (A иB), вычислить значение Inverse (A) * B
  4. Разложить захват маркера B, x, y и z, относительно маркера A.

Проблема в том, что мои результаты кажутся полностью отключенными,Ниже приведен экран программы:

markers_reper_off

Оранжевые квадраты показывают, где находятся углы, я проверил их, и они правильные.

Я перекрылоси с использованием XNA.Я использую AForge.net для копланарного ПОЗИТА.Изображение 640х480.Копланарная позиция знает, что маркеры 100 мм, а фокусное расстояние установлено на 640.

Точный код, который я запускаю, чтобы сделать это в c #:

    private void computePOSIT()
    {

        matrixes.Clear();
        AForge.Math.Matrix3x3 matrix;
        AForge.Math.Vector3 trans;
        foreach (Marker m in markers)
        {

            AForge.Point[] points = new AForge.Point[4]; 

            for (int i = 0; i < 4; i++)
            {
                points[i] = 
                    new AForge.Point(m.corners[i].X-320 ,240 - m.corners[i].Y);
            }

            posit.EstimatePose(points, out matrix, out trans);

            float yaw, pitch, roll;

            matrix.ExtractYawPitchRoll(out yaw, out pitch, out roll);

            Matrix rotation = 
                Matrix.CreateFromYawPitchRoll(-yaw, -pitch, roll);

            Matrix translation = 
                Matrix.CreateTranslation(new Vector3(trans.X, trans.Y, -trans.Z));

            Matrix complete = rotation * translation;
            List<Matrix> all = new List<Matrix>();
            all.Add(rotation);
            all.Add(translation);
            all.Add(complete);
            matrixes.Add(all);

        }

        Matrix res = Matrix.Invert(matrixes[0][4]) * matrixes[1][5];
        Vector3 scaleR;
        Vector3 translationR;
        Quaternion rotationR;
        res.Decompose(out scaleR, out rotationR, out translationR);

    }

Результирующая матрица показывает, что:

ПереводR: X: -402,2295 Y: 191,7873 Z: -135,3166} ВращениеR: {X: 0,007288148 Y: -0,4478231 Z: -0,5093549 W: 0,734819} масштаб R: 1,1,1

Обновление: Я исправил проблему POSIT, и теперь оси правильно выровнены, однако проблема перевода все еще существует.Верна ли моя математика для определения относительного перевода?

...