Как быстро получить доступ к кадрам камеры во флаттере - PullRequest
0 голосов
/ 28 июня 2018

Я хотел бы реализовать оптическое распознавание текста практически в реальном времени в видеопотоке моего приложения. Для этого я бы хотел получить быстрый доступ к данным камеры. Насколько я могу судить, у меня есть два варианта, и я преодолел блокпосты с обоими:

  1. Сделайте снимок экрана CameraPreview, поместив вокруг него RepaintBoundary, создав RenderRepaintBoundary и вызвав boundary.toImage(). Проблема этого метода в том, что метод .toImage, кажется, захватывает только нарисованные виджеты на границе, а не данные из предварительного просмотра камеры. Simmilar к вопросу, описанному здесь: https://github.com/flutter/flutter/issues/17687

  2. Захват изображения с помощью controller.takePicture(filePath) с камеры 0.2.1, аналогично примеру документов. Проблема в том, что изображение становится очень длинным (2-3 секунды). Я предполагаю, что это потому, что файл сохраняется на диск при захвате и затем должен быть снова считан из файла.

Есть ли какой-нибудь способ получить прямой доступ к информации об изображении после захвата, например, для предварительной обработки и распознавания?

1 Ответ

0 голосов
/ 26 февраля 2019

Для "OCR почти в реальном времени" вам нужно 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 doSomethingWith(image)
      } catch (e) {
        // await handleExepction(e)
      } finally {
        _isDetecting = false;
      }
    });
  }
  Widget build(BuildContext context) {
    return null;
  }
}

Эта функциональность была объединена с https://github.com/flutter/plugins, но она не была хорошо документирована.

Ref:

...