如何在颤动中快速访问相机帧

Posted

技术标签:

【中文标题】如何在颤动中快速访问相机帧【英文标题】:How to access camera frames in flutter quickly 【发布时间】:2018-12-07 16:08:53 【问题描述】:

我想在我的 Flutter 应用的相机源上实现近乎实时的 OCR。为此,我想快速访问相机数据。 据我所知,我有两个选择,并且都遇到了障碍:

    通过在RepaintBoundary 周围放置RepaintBoundary 并创建RenderRepaintBoundary 并调用boundary.toImage() 来截取CameraPreview 的屏幕截图。这种方法的问题是 .toImage 方法似乎只捕获边界中的绘制小部件,而不是来自相机预览的数据。与此处描述的问题类似:https://github.com/flutter/flutter/issues/17687

    使用相机 0.2.1 中的 controller.takePicture(filePath) 捕获图像,类似于示例文档。这里的问题是图像变得可用需要很长时间(2-3 秒)。我猜这是因为文件在捕获时保存到光盘中,然后需要再次从文件中读取。

有没有什么方法可以直接获取抓拍后的图片信息,做预处理和OCR之类的事情?

【问题讨论】:

这是一个长镜头,但你能从视频中抓取帧吗? ***.com/questions/48718551/capture-video-with-flutter 你会在 OpenCV 中做 OCR 吗? 我的计划是裁剪框架并使用 ml-kit 访问文本识别器,使用 mk-kit 插件:pub.dartlang.org/packages/mlkit @dazza5000 我认为视频录制还必须先将文件保存到磁盘才能访问,这意味着我会遇到同样的问题.. 您找到解决方案了吗? 【参考方案1】:

对于“近实时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,但没有很好地记录。

参考:

https://github.com/flutter/flutter/issues/26348 https://github.com/flutter/plugins/pull/965 https://github.com/bparrishMines/mlkit_demo/blob/master/lib/main.dart#L43 https://youtu.be/OAEWySye0BQ?t=1460

【讨论】:

您是否也可以实时在图像上绘图,从而操纵相机的记录? ''Future _getCamera(CameraLensDirection dir) async return await availableCameras().then( (List 相机) => camera.firstWhere( (CameraDescription camera) => 相机。 lensDirection == 目录, ), ); '未处理的异常:坏状态:没有元素ListMixin.firstWhere

以上是关于如何在颤动中快速访问相机帧的主要内容,如果未能解决你的问题,请参考以下文章

K2相机的数字显微控制

在颤动中访问外部摄像头时出错 - “用户未授予访问设备的权限”

如何在颤动中制作带有弹出菜单的浮动操作按钮?

Android:访问硬件相机预览帧数据而不绘制它们

EasyAR 作为 OpenCV Mat 访问相机帧

Hololens - 访问相机框架