Реализация распознавания маркеров (Image Tracking) в AR-приложении
Image tracking — привязка AR-контента к физическому изображению: упаковке товара, плакату, визитке, странице книги. Пользователь наводит камеру — изображение «оживает». Технически это хорошо изученная задача, но в production регулярно натыкаешься на одни и те же грабли: трекинг «трясётся» на бликующих поверхностях, теряется при частичном перекрытии, не масштабируется на большой каталог маркеров.
ARKit Image Tracking: как это работает
ARImageTrackingConfiguration — конфигурация для трекинга без world tracking. Быстрее инициализируется, меньше нагрузка на CPU, но нет plane detection и world anchors.
ARWorldTrackingConfiguration с detectionImages — трекинг маркеров в контексте полного world tracking. Нужен, когда AR-контент должен существовать в мировом пространстве между кадрами или когда нужен plane detection одновременно с image tracking.
Подготовка reference image: ARReferenceImage с физическими размерами (physicalSize). Размер обязателен — от него ARKit вычисляет дистанцию и scale. Неправильный размер → объект в неправильном масштабе.
guard let image = UIImage(named: "marker"),
let cgImage = image.cgImage else { return }
let referenceImage = ARReferenceImage(cgImage, orientation: .up, physicalSize: CGSize(width: 0.15, height: 0.10))
referenceImage.name = "product_label"
config.detectionImages = [referenceImage]
config.maximumNumberOfTrackedImages = 4
maximumNumberOfTrackedImages — критичный параметр. ARKit A12+ трекает до 100 изображений одновременно (обнаружение), но активный трекинг позиции — до 4 на старых чипах, до 8 на A14+. Разница: detected — знаем, что маркер есть; tracked — знаем точную позицию в реальном времени.
Качество маркера и почему «любое изображение» не работает
ARKit оценивает quality score каждого reference image. Изображения с низким quality score трекаются нестабильно или не детектируются вовсе. Проверка: добавить изображение в Xcode AR Resources group → в инспекторе покажет предупреждение при низком quality.
Плохие маркеры:
- Однотонные или с большими однотонными областями (логотип на белом фоне)
- Симметричные паттерны (ARKit путается в ориентации)
- Низкоконтрастные, блёклые изображения
- Текст без других визуальных элементов
Хорошие маркеры:
- Высококонтрастные, разнородные паттерны (обложки журналов, детальные иллюстрации)
- Асимметричные — ARKit однозначно определяет ориентацию
- Физический размер от 10 см — мелкие маркеры трекаются с дистанции менее 30 см
Трекинг на бликующих поверхностях
Упаковка с глянцевым покрытием, голографические наклейки, фольгированные элементы — все они дают блики, которые меняют appearance маркера в зависимости от угла освещения. ARKit теряет трекинг, потому что features points «плавают».
Решение на уровне физического продукта: матовое ламинирование вместо глянца на зоне маркера. На уровне кода: hysteresis для потери трекинга — не сразу скрывать AR-контент при trackingState == .limited, а с задержкой 0.5-1 секунда. Большинство кратких потерь восстанавливаются сами.
ARCore Image Tracking
AugmentedImageDatabase — аналог ARKit detection images. Базу данных компилируем заранее через arcoreimg утилиту (командная строка) или AugmentedImageDatabase(session:imageBytes:) в runtime. Предкомпилированная база загружается быстрее.
ARCore дополнительно предоставляет AugmentedImage.getTrackingMethod(): FULL_TRACKING (полный трекинг) vs LAST_KNOWN_POSE (последняя известная позиция). LAST_KNOWN_POSE позволяет сохранять AR-контент на позиции даже при временной потере маркера из кадра.
Каталог маркеров и управление контентом
Для приложений с большим каталогом (100+ маркеров — например, все SKU продуктовой линейки) нельзя паковать все reference images в bundle. Архитектура:
- Сервер хранит reference images + AR-контент
- При обнаружении нового маркера (по внешнему ID в QR или через cloud recognition) — загружаем контент для конкретного маркера
- Cloud Image Target (Vuforia Cloud, Wikitude Cloud): клиент отправляет кадр на сервер, сервер возвращает ID маркера и transform. Работает для каталогов 100k+ изображений
Сроки
Базовый image tracking с 1-10 маркерами, статичный 3D-контент — 3-5 дней. Анимированный контент, видео-overlay, управление каталогом через CMS — 2-3 недели. Cloud-решение для 100k+ маркеров — отдельная оценка. Стоимость рассчитывается индивидуально.







