Использование SIFT для дополненной реальности
Я сталкивался с МНОГИМИ библиотеками AR /SDK /API, все они основаны на маркерах, пока я не нашел это видео из описания и комментариев, похоже, что он использует SIFT для обнаружения объекта и его отслеживания.
Мне нужно сделать это для Android, поэтому мне понадобится полная реализация SIFT на чистой Java.
Я готов сделать это, но мне нужно знать, как SIFT в первую очередь используется для дополненной реальности.
Я мог бы использовать любую информацию, которую вы предоставляете.
6 ответов
На мой взгляд, попытка реализовать SIFT для портативного устройства - это безумие. SIFT - это алгоритм извлечения признаков изображения, который включает в себя сложную математику и, безусловно, требует больших вычислительных ресурсов. SIFT также запатентован.
Тем не менее, если вы действительно хотите приступить к выполнению этой задачи, сначала вам следует провести довольно тщательное исследование. Вы должны проверить такие вещи, как:
- Любые варианты SIFT, повышающие производительность, включая различные алгоритмы
- Я бы порекомендовал изучить SURF, который является очень надежным и гораздо более быстрым (но все же один из тех страшных алгоритмов)
- Android NDK (я объясню позже)
- Много-много публикаций
Почему Android NDK? Потому что вы, вероятно, получите гораздо более существенный выигрыш в производительности, реализовав алгоритм в библиотеке C, которая используется вашим Java-приложением.
Прежде чем что-то начинать, убедитесь, что вы проводите это исследование, потому что было бы жалко наполовину осознать, что алгоритмы извлечения функций изображения - это слишком много для телефона Android. Сама по себе серьезная попытка реализовать такой алгоритм, который обеспечивает хорошие результаты и работает в приемлемое количество времени, не говоря уже о его использовании для создания приложения AR.
Как и в том, как вы использовали бы это для AR, я предполагаю, что дескриптор, который вы получаете при запуске алгоритма на изображении, должен быть сопоставлен с данными, сохраненными в центральной базе данных. Затем результаты могут быть отображены для пользователя. Предполагается, что характеристики изображения, собранного из SURF, будут описывать его так, чтобы его можно было затем идентифицировать с помощью них. Я не очень опытен в этом, но в Интернете всегда есть ресурсы. Вы, вероятно, хотели бы начать с общих вещей, таких как распознавание объектов.
Удачи:)
Я пробовал SURF для мобильного телефона Symbian 330Mhz, и он все еще был слишком медленным даже со всеми оптимизациями и поисковыми таблицами. И SIFT должен быть еще медленнее. Теперь все используют FAST для мобильных телефонов. В любом случае, извлечение функций не самая большая проблема. Переписка и очистка от ложного срабатывания в нем сложнее. БЫСТРАЯ ссылка http://svr-www.eng.cam.ac.uk/~er258/work/fast.html
Если бы я был там, я бы посмотрел, как (и почему) работает функция SIFT (как было сказано, ее страница в Википедии предлагает хорошее объяснение кохизе, а для получения более подробной информации посмотрите научную статью (которая связана с википедией)), а затем создайте свой вариант на свой вкус; т.е. имеет оптимальный баланс между производительностью и нагрузкой на процессор, необходимый для вашего приложения.
Например, я думаю, что гауссово сглаживание может быть заменено более быстрым способом сглаживания.
Кроме того, когда вы создаете свой собственный вариант, вы не имеете ничего общего с патентами (таких вариантов уже много, например, GLOH).
Вы пробовали FAST-реализацию OpenCV на порте Android? Я проверил это, и он работает невероятно быстро.
Вы также можете вычислить уменьшенные дескрипторы гистограммы вокруг обнаруженных ключевых точек FAST. Я слышал о 3х3, а не о стандартном 4х4 SIFT. Это дает неплохую возможность работать в режиме реального времени, если вы интенсивно оптимизируете его с помощью инструкций NEON. В противном случае я бы порекомендовал что-то быстрое и простое, например, сумму квадратов или абсолютных разностей для патча вокруг ключевых точек, которые очень быстрые.
SIFT - это не панацея. Для видеоприложений в реальном времени это обычно излишне.
Я бы порекомендовал вам начать с рассмотрения возможностей, уже реализованных в библиотеке OpenCV, включая SURF, MSER и другие:
http://opencv.willowgarage.com/documentation/cpp/feature_detection.html
Это может быть достаточно для вашего приложения и быстрее, чем SIFT. И, как уже упоминалось выше, SIFT запатентован.
Кроме того, начните с тестирования производительности на своей мобильной платформе, просто извлекая функции в каждом кадре, чтобы у вас было представление, какие из них могут работать в режиме реального времени или нет.
Как всегда, Wikipedia - хорошее место для начала: http://en.wikipedia.org/wiki/Scale-invariant_feature_transform, но обратите внимание, что SIFT запатентован.