Флаттер обнаружение лица в реальном времени

В настоящее время я разрабатываю приложение, для которого требуется распознавание лиц в реальном времени. Прямо сейчас у меня есть библиотека mlkit в приложении, и я использую детектор лиц firebase. На данный момент он выдает ошибку каждый раз, когда я пытаюсь определить лицо из файла:

DynamiteModule(13840): Local module descriptor class for com.google.android.gms.vision.dynamite.face not found.

Что касается части реального времени, я попытался использовать RepaintBoundary во флаттере, чтобы получить снимок экрана виджета камеры (почти) в каждом кадре и преобразовать его в двоичный файл для распознавания лиц. Но по какой-то причине флаттер вылетал каждый раз, когда я пытался сделать снимок экрана виджета камеры. Это сработало для других виджетов.

Столкнувшись с обеими этими проблемами и потратив довольно много времени на их решение, я подумал о том, чтобы просто сделать часть приложения камеры в собственном коде Android / iOS (я бы сделал это с OpenCV, чтобы у меня был настоящий обнаружение времени). Есть ли способ использовать каналы платформы для реализации обзора камеры в kotlin и swift и импортировать его в виджет flutter? Или есть другой более простой способ реализовать это?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
9 531
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Раньше я что-то делал с OpenCV, мое решение было:

  1. Запустите новый Activity или ViewController на Android и iOS соответственно через канал платформы. Пример:

class FaceScanPlugin(val activity: Activity) : MethodCallHandler, PluginRegistry.ActivityResultListener {

var result: Result? = null

companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar): Unit {
        val channel = MethodChannel(registrar.messenger(), "com.example.facescan")
        val plugin = BarcodeScanPlugin(registrar.activity())
        channel.setMethodCallHandler(plugin)
        registrar.addActivityResultListener(plugin)
    }
}

override fun onMethodCall(call: MethodCall, result: Result): Unit {
    if (call.method.equals("scan")) {
        this.result = result
        showFaceScanView()
    } else {
        result.notImplemented()
    }
}

private fun showFaceScanView() {
    val intent = Intent(activity, FaceScannerActivity::class.java)
    activity.startActivityForResult(intent, 100)
}

override fun onActivityResult(code: Int, resultCode: Int, data: Intent?): Boolean {
    if (code == 100) {
        if (resultCode == Activity.RESULT_OK) {
            return true
        }
    }
    return false
}
}

Обратитесь к Плагин QR-сканера Flutter, чтобы узнать, как перейти к активности Android или представлению iOS.

  1. Затем выполните обнаружение лиц в режиме реального времени OpenCV через Камера2 и AVFoundation.

Помимо этого, я полагаю, вы можете попробовать новые AndroidView или UIKitView, если хотите встроить Android или iOS в свое приложение Flutter.

Ответ принят как подходящий

Для доступа в реальном времени к потоку изображений с камеры я в другом вопросе Как быстро получить доступ к кадрам камеры во флаттере ответил, что вы хотите использовать CameraController#startImageStream.

import 'package:camera/camera.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(home: _MyHomePage()));

class _MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<_MyHomePage> {
  dynamic _scanResults;
  CameraController _camera;

  bool _isDetecting = false;
  CameraLensDirection _direction = CameraLensDirection.back;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<CameraDescription> _getCamera(CameraLensDirection dir) async {
    return await availableCameras().then(
      (List<CameraDescription> cameras) => cameras.firstWhere(
            (CameraDescription camera) => camera.lensDirection == dir,
          ),
    );
  }

  void _initializeCamera() async {
    _camera = CameraController(
      await _getCamera(_direction),
      defaultTargetPlatform == TargetPlatform.iOS
          ? ResolutionPreset.low
          : ResolutionPreset.medium,
    );
    await _camera.initialize();
    _camera.startImageStream((CameraImage image) {
      if (_isDetecting) return;
      _isDetecting = true;
      try {
        // await doOpenCVDectionHere(image)
      } catch (e) {
        // await handleExepction(e)
      } finally {
        _isDetecting = false;
      }
    });
  }
  Widget build(BuildContext context) {
    return null;
  }
}

Другие вопросы по теме