Реалізація розпізнавання зображень (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 обчислює дистанцію та масштаб. Неправильний розмір → об'єкт у неправильному масштабі.
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 → інспектор покаже попередження при низькій якості.
Погані маркери:
- Однотонні або з великими однотонними областями (логотип на білому фоні)
- Симетричні паттерни (ARKit плутається в орієнтації)
- Низькоконтрастні, блідих зображення
- Текст без інших візуальних елементів
Хороші маркери:
- Висококонтрастні, різноманітні паттерни (обкладинки журналів, детальні ілюстрації)
- Асиметричні — ARKit однозначно визначає орієнтацію
- Фізичний розмір від 10 см — дрібні маркери трекуються з дистанції менш як 30 см
Трекінг на дзеркальних поверхнях
Упаковка з глянцевим покриттям, голографічні наклейки, фольговані елементи — всі вони дають блиск, який змінює появу маркера залежно від кута освітлення. ARKit втрачає трекінг, тому що feature 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 маркера та трансформацію. Працює для каталогів 100k+ зображень
Сроки
Базовий image tracking з 1–10 маркерами, статичний 3D-контент — 3–5 днів. Анімований контент, відеооверлей, управління каталогом через CMS — 2–3 тижні. Cloud-рішення для 100k+ маркерів — окремаяоцінка. Вартість розраховується індивідуально.







