Есть ли решатель pnp, представленный в ARKit, или как использовать функцию SolvePnP opencv в проекте Unity3D, используя оболочку EmguCV c # - PullRequest
0 голосов
/ 19 октября 2018

Контекст высокого уровня:

В проекте Unity3D AR с помощью машинного обучения система обеспечивает соответствие между набором координат 2D-пикселей в изображении и тем же набором 3Dточки в мировой координате.Исходя из соответствия между этими двумя наборами, я хотел бы оценить позу камеры, которая привела к этому изображению.

Цель достижения низкого уровня:

Результаты моегоИсследования показывают, что я использую алгоритм PnP-Ransac.Perspective-n-Points - это название этой проблемы, которую я имею: нахождение позы камеры из совпадающих 2D-3D точек.Определение проблемы PnP: https://en.wikipedia.org/wiki/Perspective-n-Point

Что я пробовал

1) Я пытался найти PnP-решатель в ARKit, но не смог найти его, поэтому ядумаю, это не разоблачено.2) Я попытался использовать актив EmguCV из магазина, который должен позволить мне использовать openCV в моем проекте Unity.Документация OpenCV solvePnP: https://docs.opencv.org/3.3.0/d9/d0c/group__calib3d.html#ga50620f0e26e02caa2e9adc07b5fbf24e

Вопрос:

Существует ли PnP-решатель, представленный в платформе ARKit, и если нет, то как мне использовать PNP-решатель openCVправильно использовать оболочку EmguCV C # в проекте Unity (системы координат, о которых нужно знать, правильные параметры функций, чтобы обеспечить подобие встроенной матрицы камеры, как интерпретировать выходные данные, чтобы получить правильную позу камеры)?

Проблемы, с которыми я столкнулся, пытаясь ответить на вопрос:

Использование SolvePnPRansac привело к самопроизвольному сбою Unity-Editor, даже если я поместил его в блок try-catch (возможно, мои входные аргументы имели неожиданные форматы),У меня был больший успех с использованием только executePnP, но результаты не те, что я ожидаю.В документации говорится, что выходные векторы rvec и tvec соответствуют сдвигу и повороту, переносящим объект из системы координат модели в систему координат камеры.Так что, если бы я поместил камеру в (0,0,0), смотря в направлении -z, имея объект в tvec с эйлеровыми поворотами rvec, я бы ожидал, что визуализированный объект будет похож на изображение, которое я использовал для соответствия пиксель-координат,Неужели я не так понял?

У меня есть подозрения: система координат openCV утверждает, что координата y изображения идет сверху вниз, а z и x остаются вперед-вправо.Я пытался инвертировать 2D и 3D-координаты по оси Y, но это не сработало

Edit [Я удалил свой код здесь, потому что я его сильно изменил, так как задал вопросзаставить его работать]

(некоторые из многих) Похожие сообщения Я посмотрел другие вопросы о стеке потока с тегом opencv-solvePnP, но ни один из них не был связан с Unity3D или c #

solvePnP с Unity3D

не получил ответов

Оценка позы камеры с помощью гомографии или с функцией solvePnP ()

Как можноЯ оцениваю позу камеры с 3D-2D-точечными соответствиями (используя opencv)

разница: мне нужно сделать это в проекте unity3D c #

получение2d-3d точечные соответствия для pnp или posit

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

1 Ответ

0 голосов
/ 07 ноября 2018

ARKIT предоставляет PnP-решатель?я до сих пор не знаю

о том, как использовать openCV в проекте Unity: вот мой собственный ответ:

1) система координат: просто убедитесь, что ваши 2D точки имеют правильное вертикальное направление координат: в зависимости от того, как вы получаете эти 2D точки, может быть нечего менять.

2) какую внутреннюю матрицу использовать:

var pixelsPerMeter = (((float)Screen.height / 2f)) / (Mathf.Tan(_mainCamera.fieldOfView * Mathf.Deg2Rad / 2f));
var fx = pixelsPerMeter;
var cx = Screen.width * 0.5f;
var fy = pixelsPerMeter;
var cy = Screen.height * 0.5f;
var cameraMatrix = new Emgu.CV.Matrix<float>(new float[3, 3] {
        {fx,0,cx},
        {0,fy,cy},
        {0,0,1}
        });

РЕДАКТИРОВАТЬ : вышетолько работал в редакторе единства для меня до сих пор.развертывание на мобильном устройстве с использованием ARKit до сих пор дает неверные результаты для меня до сих пор!

3) Как интерпретировать tvec и rvec из результата:

Используйте Rodrigues для правильного преобразования rvec в матрицу вращенияпростое выполнение Quaternion.Euler (rvec [0], rvec [1], rvec [2]) НЕ будет работать!

Сначала поверните ваш объект, затем переведите его на tvec и, наконец, примените матрицу localToWorld вашей камеры.Кроме того, чтобы разместить объект относительно камеры (если вы хотите, чтобы объект имел фиксированное положение и камеру, просто переверните матрицу, полученную из rvec и tvec)

...