Реалізація розпізнавання жестів у мобільних додатках
Розпізнавання жестів через камеру — це інтерфейс без дотику. Використовується у фітнес-додатках (підрахунок повторень), додатків доступності, AR-взаємодіях та presentation-режимах. Ключовий інструмент—MediaPipe Hand Landmarker.
MediaPipe Hand Landmarker: як це працює
MediaPipe Hand Landmarker детектує до 2 рук у кадрі та повертає 21 landmark для кожної руки: зап'ясток, п'ясткові кістки, фаланги. Координати нормалізовані (0..1) у просторі зображення плюс 3D-координати (z—глибина відносно зап'ястка).
Latency на сучасних пристроях:
- Pixel 7 (GPU): ~12 ms
- iPhone 14 (CPU): ~18 ms
- Snapdragon 665 mid-range (CPU): ~45 ms
Для real-time UI при 30 FPS бюджет — 33 ms. На слабких пристроях виберіть: знизьте infer до 15 FPS або працюйте з однією рукою (numHands = 1).
Розпізнавання жестів поверх landmarks
MediaPipe Gesture Recognizer—обгортка над Hand Landmarker—розпізнає 7 вбудованих жестів: Open_Palm, Closed_Fist, Pointing_Up, Thumb_Up, Thumb_Down, Victory, ILoveYou. Достатньо для базового управління (наступний слайд, лайк/дизлайк, підтвердження).
Для кастомних жестів два підходи:
Геометричний. Обраховуйте кути між фалангами, дистанції між ключовими точками, визначте "палець зігнутий" через dot product. Швидко (немає додаткового infer), легко налагодити. Добре працює для статичних жестів (конкретна форма кисті).
ML класифікатор. Записуйте landmark вектори для кожного жеста, навчайте невеликий MLP або кастомний GestureRecognizer через MediaPipe Model Maker. Краще для жестів подібної форми та динамічних жестів (рухи рук).
Кейс: керування презентацією через жести під час стендапу. Жести: "наступний слайд" (свайп вправо), "попередній" (свайп вліво), "стоп" (відкрита долонь). Статичні жести через геометрію (Open_Palm з MediaPipe Gesture Recognizer). Динамічні свайпи—через трекінг положення зап'ястка (WRIST landmark) за 10 кадрів: якщо delta_x > 0.3 нормалізованих одиниць за 333 ms—свайп. Поріг налаштований експериментально на 15 тест-користувачах.
Привʼязка жестів до дій
Розпізнаний жест — це подія з впевненістю та мітко часу. Не кожна подія повинна бути оброблена. Debouncing має значення: "великий палець вгору" не повинен повторно спрацьовувати, якщо рука залишається у кадрі. Збережіть стан: lastGestureTime, lastGestureType. Новий жест рахується тільки якщо пройшло >500 ms або змінився тип.
На iOS: MediaPipeTasksVision через Swift Package Manager, обгорніть GestureRecognizer в actor клас. Результати через @Published в ObservableObject.
На Android: MediaPipe Tasks Android SDK (com.google.mediapipe:tasks-vision). GestureRecognizerOptions з runningMode = RunningMode.LIVE_STREAM для відеопотоку, callbacks через ResultListener.
Поширені помилки реалізації
Не враховуйте handedness—MediaPipe повертає LEFT/RIGHT з точки зору моделі (дзеркально від фронтальної камери). "Великий палець вправо" з фронтальної камери детектується як ліва рука. Якщо логіка залежить від конкретної руки, застосуйте дзеркальну корекцію.
Не враховуйте дистанцію до камери. Нормалізовані координати не несуть інформації про фізичну дистанцію—геометричні пороги, що працюють на 50 cm, будуть іншими на 150 cm.
Часові рамки
Базові жести через MediaPipe Gesture Recognizer + привʼязка до дій: 1 тиждень. Кастомні геометричні або ML-жести + динамічні свайпи: 2 тижні. Вартість розраховується індивідуально.







