Я сейчас пытаюсь написать простое AR-приложение, в частности, я пытаюсь вычислить перевод между двумя квадратными маркерами, аналогично тому, как они делают это на этом сайте внизу: Artoolkit
Используемые маркеры имеют одинаковый размер (100 мм x 100 мм), и мое изображение не имеет искажений камеры (в данный момент я использую тестовое изображение).
В настоящее время мой процесс идет следующим образомэти шаги:
- Обнаружение маркеров на изображении и извлечение углов.
- Запуск копланарного ПОЗИТА с учетом углов маркера.
- С учетом 2 преобразований маркера (A иB), вычислить значение Inverse (A) * B
- Разложить захват маркера B, x, y и z, относительно маркера A.
Проблема в том, что мои результаты кажутся полностью отключенными,Ниже приведен экран программы:
![markers_reper_off](https://i.stack.imgur.com/raam1.jpg)
Оранжевые квадраты показывают, где находятся углы, я проверил их, и они правильные.
Я перекрылоси с использованием 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, и теперь оси правильно выровнены, однако проблема перевода все еще существует.Верна ли моя математика для определения относительного перевода?