- PVSM.RU - https://www.pvsm.ru -
Многие приложения для здоровья в России перестали нормально работать. Omron — одно из них. А давление мерить надо каждый день. Поэтому я решил сделать своё iOS-приложение, которое через камеру считывает показания с любого тонометра, сохраняет их и строит графики динамики.
Я Senior CV-инженер — компьютерное зрение моя основная работа. Так что OCR с дисплея тонометра технически не должен был стать проблемой. Но как iOS-разработчик я — полный ноль. Xcode открыл впервые. Swift видел мельком. Это честный рассказ о том, как это выглядит изнутри.
И да, я делаю open source приложение за свободу здоровья от политики — и при этом только под iOS. Ирония не ускользнула. Но это open source — найдётся кто-нибудь с Android-девайсом и свободным вечером 🙂
Приложение должно:
Считывать показания (систола / диастола / пульс) с дисплея тонометра через камеру
Сохранять историю локально — никакого облака, никаких аккаунтов
Показывать график динамики давления за неделю
Работать без интернета и без зависимости от внешних сервисов
Последний пункт принципиален: если приложение зависит от чьего-то сервера — оно снова может перестать работать в любой момент.
Первый инстинкт — взять React Native, есть небольшой опыт с React. Но после честного разбора вариантов выбор стал очевиден:
|
SwiftUI + Vision |
Flutter |
React Native |
|
|---|---|---|---|
|
OCR качество |
⭐⭐⭐⭐⭐ нативный Vision |
⭐⭐⭐ плагины |
⭐⭐⭐ ML Kit |
|
Камера |
AVFoundation, прямой доступ |
Хорошая |
Средняя |
|
Core ML (своя модель) |
Нативно |
Platform channel |
Нативный модуль |
Flutter и React Native — кроссплатформенные фреймворки. Но мне нужен только iOS, то есть их главное преимущество просто не нужно. А проигрывают они нативному стеку по самому важному пункту — качеству OCR и доступу к камере.
Итоговый стек:
SwiftUI — декларативный UI (оказался очень похож на React концептуально)
SwiftData — локальная БД, аналог ORM, никакого SQL
Apple Vision framework — on-device OCR через VNRecognizeTextRequest
Swift Charts — встроенная визуализация, iOS 16+
AVFoundation — прямой доступ к камере (во второй части)
Ноль внешних зависимостей. Ничего не заблокируется.
@Model — это как декоратор в Python. Говоришь SwiftData: «сохраняй объекты этого класса в локальную БД автоматически». Никакого SQL, никаких миграций руками.Концепция простая: по центру — график за последние 7 дней, внизу — карточка с последним измерением, и большая кнопка + для нового считывания.
VNRecognizeTextRequest — готовая Apple-модель, аналог pretrained YOLO. Запускаешь inference, получаешь текст. Но главная проблема OCR на LCD-дисплеях — не распознавание, а ложные срабатывания. Фон, блики, соседние надписи — всё это попадает в результат.
Решение то же, что и в детекции объектов: post-processing с жёсткими ограничениями:
За один вечер с нуля на незнакомом языке получили:
✅ Работающая локальная база данных
✅ График систолы и диастолы с линией нормы
✅ Карточка последнего измерения с цветовым индикатором
✅ Весь OCR-сервис с валидацией
Код на GitHub: Alexandr-Shklyaev/bp-tracker [1]
В следующей части подключаем камеру через AVFoundation, строим real-time OCR пайплайн и учим приложение находить ROI с дисплеем тонометра на кадре.
Автор: Alexandr-Shklyaev
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ios/447393
Ссылки в тексте:
[1] Alexandr-Shklyaev/bp-tracker: https://github.com/Alexandr-Shklyaev/bp-tracker
[2] Источник: https://habr.com/ru/articles/1013308/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1013308
Нажмите здесь для печати.