Обнаружение и отслеживание функций на 2D изображениях для отображения содержимого AR
Я разрабатываю приложение для Android, в котором я хочу отслеживать 2D-изображение / лист бумаги, анализировать, что пользователь пишет / рисует на нем, и правильно отображать на нем различное 3D-содержимое.
Я работаю над отслеживанием и отображением простой части 3D-контента, чего на самом деле можно добиться с помощью таких SDK, как Vuforia и Wikitude. Однако я не использую их по нескольким причинам.
- Есть другой анализ изображения, например, анализ чертежей.
- Изображение может быть не таким насыщенным, например, бумага с линиями или некоторые рисунки.
- SDK, такие как Vuforia, могут не предоставлять разработчикам некоторые базовые функции, такие как обнаружение функций и т. Д.
Во всяком случае, сейчас я хочу только добиться следующего результата.
- У меня есть лист бумаги, возможно, с линиями и цифрами. Вы можете думать об этом как о типе бумаги для детей, чтобы практиковать написание или рисование. Пример: https://i.pinimg.com/236x/89/3a/80/893a80336adab4120ff197010cd7f6a1--dr-seuss-crafts-notebook-paper.jpg
- Я указываю свой телефон (камеру) на бумагу во время захвата видеокадров.
- Я хочу зарегистрировать бумагу, отследить ее и показать на ней простой каркасный куб.
Я возился с OpenCV и попробовал следующие подходы.
Используя гомографию:
- Обнаружение особенностей в 2D-изображении (ORB, FAST и т. Д.).
- Опишите особенности (ORB).
- Сделайте то же самое в каждом видеокадре.
- Подходим функции и найти хорошие совпадения.
- Найдите гомографию, используйте гомографию и успешно нарисуйте прямоугольник вокруг изображения в видеокадре.
- Не знал, как использовать декомпозицию гомографии (на повороты, переводы и нормали) для отображения трехмерного объекта, такого как куб.
Использование solvePnP:
С 1 по 4 такие же, как указано выше.
- Преобразуйте все точки точного совпадения 2D в изображении в 3D, предполагая, что изображение лежит на плоскости xy мира, таким образом, все имеют z = 0.
- Используйте solvePnP с этими 3D-точками и 2D-точками в текущем кадре, чтобы извлечь векторы вращения и перемещения, а затем преобразовать их в матрицу проекции, используя Rodrigues() в OpenCV.
- Построить трехмерные точки куба.
- Спроецируйте их в 2D-изображение, используя проекцию и матрицу камеры.
- Проблема в том, что куб прыгает вокруг, что, как я полагаю, связано с нестабильностью и точностью определения и отображения функций, что влияет на solvePnP.
Используя контуры или углы:
Я просто делю шкалу серого в кадре, сглаживаю ее по Гауссу, расширяю или размываю и пытаюсь найти самый большой 4-краевой контур, чтобы можно было отслеживать его с помощью solvePnP и т. Д. Это, что неудивительно, не дает хороших результатов, или я Я просто делаю это неправильно.
Итак, мои вопросы:
- Как я могу решить две смелые проблемы, упомянутые выше.
- В более общем смысле, учитывая тип цели изображения, которую я хочу отслеживать, каков будет оптимальный алгоритм / решение / техника для ее отслеживания?
- Что я могу улучшить / изменить в своем способе решения проблемы?
Большое спасибо.