Клієнт хоче виміряти довжину дивана по одній фотографії — без рулетки, без спеціального обладнання. Ми реалізували цю функцію в мобільних додатках з точністю до 2% за правильних умов. Наш досвід — 5+ років у розробці iOS/Android, 30+ проєктів з AR та computer vision. Пропонуємо рішення під ключ: від вибору методу (LiDAR, SLAM або monocular depth) до інтеграції з вашим бекендом. Отримайте консультацію — оцінимо ваш проєкт за один день.
Який метод вимірювання обрати: LiDAR, SLAM чи monocular depth?
ARKit/ARCore (LiDAR або SLAM) — точний, але вимагає підтримки пристрою. iPhone 12 Pro і новіший з LiDAR дають точність 1–3 см на відстані до 5 метрів. ARCore на Android без LiDAR — гірший, похибка 3–8 см.
Monocular depth estimation — працює на будь-якому пристрої без LiDAR, використовує CNN для оцінки глибини по одному кадру. MiDaS, DPT, Depth Anything V2 — актуальні моделі. Точність помітно нижча за LiDAR-підхід, але для багатьох задач достатня.
| Метод | Точність | Вимоги до пристрою | Складність реалізації |
|---|---|---|---|
| LiDAR (ARKit/ARCore) | 1–3 см | iPhone 12 Pro+, iPad Pro | Середня |
| SLAM (ARKit/ARCore) | 3–8 см | Пристрої з підтримкою ARKit/ARCore | Середня |
| Monocular depth | 5–15% | Будь-який пристрій | Висока (нейромережа) |
// iOS: вибір методу залежно від можливостей пристрою
func selectMeasurementMethod() -> MeasurementMethod {
if ARWorldTrackingConfiguration.supportsSceneReconstruction(.mesh) {
return .lidarARKit // iPhone 12 Pro+, iPad Pro
} else if ARWorldTrackingConfiguration.isSupported {
return .slamARKit // ARKit без LiDAR
} else {
return .monocularDepth // фолбек на CoreML-модель
}
}
Що впливає на точність вимірювання?
Точність вимірювання безпосередньо залежить від умов зйомки: освітлення, текстура поверхні, відстань до об'єкта та кут нахилу камери. Білі стіни без текстур погіршують SLAM-трекінг, а високе освітлення може викликати пересвіти. Для стабільного результату необхідно:
- Текстуровані поверхні (чорні, глянцеві об'єкти гірше детектуються)
- Відстань до об'єкта не більше 5 м при LiDAR, 3 м при SLAM
- Мінімізація динамічних об'єктів у кадрі
- Правильне фокусування камери
Як ми реалізуємо вимірювання через ARKit
// Вимірювання відстані між двома точками в AR
class ARMeasurementSession: NSObject, ARSessionDelegate {
var arView: ARSCNView!
private var startAnchor: ARAnchor?
private var endAnchor: ARAnchor?
func placePoint(at screenPoint: CGPoint) -> MeasurementPoint? {
// Raycast від екрану в 3D світовий простір
guard let query = arView.raycastQuery(
from: screenPoint,
allowing: .estimatedPlane,
alignment: .any
) else { return nil }
guard let result = arView.session.raycast(query).first else { return nil }
let worldPosition = result.worldTransform.columns.3 // позиція в метрах
return MeasurementPoint(
position: SIMD3(worldPosition.x, worldPosition.y, worldPosition.z),
confidence: result.targetAlignment == .horizontal ? .high : .medium
)
}
func calculateDistance(from start: MeasurementPoint, to end: MeasurementPoint) -> Measurement<UnitLength> {
let diff = end.position - start.position
let distanceMeters = Double(simd_length(diff))
return Measurement(value: distanceMeters, unit: .meters)
}
}
Одна з поширених помилок — не враховувати, що raycast працює краще на добре текстурованих поверхнях. Біла стіна дає поганий результат SLAM tracking, AR-мітки починають «пливти».
Відображення вимірювання в AR
func addMeasurementLine(from start: SIMD3<Float>, to end: SIMD3<Float>,
distance: String) {
let midpoint = (start + end) / 2
// Лінія між точками
let lineNode = SCNNode(geometry: createCylinder(from: start, to: end))
// Мітка з відстанню посередині
let labelNode = SCNNode(geometry: SCNText(string: distance, extrusionDepth: 0.001))
labelNode.position = SCNVector3(midpoint.x, midpoint.y + 0.02, midpoint.z)
labelNode.scale = SCNVector3(0.005, 0.005, 0.005)
labelNode.constraints = [SCNBillboardConstraint()] // завжди обличчям до камери
sceneRoot.addChildNode(lineNode)
sceneRoot.addChildNode(labelNode)
}
Reference object підхід для вимірювання по фото
Без AR — потрібен об'єкт відомого розміру в кадрі. Банківська картка (85.6 × 53.98 мм) — зручний reference:
// Android: вимірювання через reference object
class ReferenceObjectMeasurer {
fun measureWithCard(bitmap: Bitmap, cardBoundingBox: RectF,
objectBoundingBox: RectF): MeasurementResult {
// Реальні розміри картки
val cardRealWidth = 85.6f // мм
val cardRealHeight = 53.98f
// Пікселі → мм
val pixelsPerMmHorizontal = cardBoundingBox.width() / cardRealWidth
val pixelsPerMmVertical = cardBoundingBox.height() / cardRealHeight
// Корекція на перспективне спотворення (спрощено)
val correctionFactor = estimatePerspectiveCorrection(
cardBoundingBox, imageDimensions = bitmap.width to bitmap.height
)
return MeasurementResult(
widthMm = (objectBoundingBox.width() / pixelsPerMmHorizontal) * correctionFactor,
heightMm = (objectBoundingBox.height() / pixelsPerMmVertical) * correctionFactor,
accuracy = MeasurementAccuracy.MODERATE // ±5-10% без калібрування
)
}
}
Детекція картки в кадрі — через ML Kit Object Detection або YOLOv8-кастомний (нескладно навчити на 500 знімках карток в різних умовах).
Процес роботи: від ідеї до релізу
- Аналітика — вивчення бізнес-вимог, пристроїв аудиторії, необхідної точності.
- Проектування — вибір архітектури: нативний ARKit/ARCore або кроссплатформа, визначення методу вимірювання (LiDAR/SLAM/monocular depth).
- Реалізація — розробка MVP з базовим UI (дві точки, лінія), інтеграція з CoreML/ML Kit, налаштування калібрування.
- Тестування — перевірка точності на 10+ пристроях, в різних умовах зйомки, A/B тести.
- Деплой — підготовка до публікації в App Store та Google Play, оформлення документів, TestFlight/Firebase Distribution.
| Етап | Тривалість |
|---|---|
| Аналітика | 1–2 дні |
| Проектування | 1–2 дні |
| Реалізація MVP | 3–5 днів (одна платформа) |
| Повноцінне рішення (iOS+Android) | 1–2 тижні |
| Тестування та деплой | 3–5 днів |
Що входить в роботу
- Архітектурна документація та опис API
- Інтеграція з вашою CRM / бекендом через REST або GraphQL
- Навчання вашої команди роботі з функцією
- Технічна підтримка 3 місяці
- Доступ до вихідного коду (з правом модифікації)
- Сертифікати від Apple та Google (якщо потрібно)
Ми — сертифіковані розробники Apple та Google. Гарантуємо точність вимірювань відповідно до вимог App Store Review Guidelines (Section 4.2/5.1). За 5 років реалізували 30+ проєктів в e-commerce, будівництві та медицині.
Типові помилки при реалізації
- Ігнорування підтримки пристроїв без LiDAR — користувачі отримують нульову точність.
- Відсутність калібрування перспективних спотворень при reference object.
- Використання стандартних моделей глибини без донавчання на предметній області.
- Неврахування рекомендацій Apple для in-app purchase (якщо функція платна) — StoreKit 2.
Оцініть ваш проєкт — напишіть нам. Отримайте консультацію щодо вибору методу та термінів реалізації.
У статті використані матеріали monocular depth estimation та документації Apple ARKit.







