如何快速抖动相机镜头

时间:2018-06-28 14:17:32

标签: camera flutter flutter-plugin

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

  1. 通过在CameraPreview周围放一个RepaintBoundary并创建一个RenderRepaintBoundary并调用boundary.toImage()来截取controller.takePicture(filePath)的屏幕快照。此方法的问题在于.toImage方法似乎仅捕获边界中绘制的小部件,而不捕获摄像机预览中的数据。与此处描述的问题类似:https://github.com/flutter/flutter/issues/17687

  2. 使用来自相机0.2.1的export class RequestType { prop1: string; prop2: string; } export class ResponseType { prop3: string; prop4: string; } 捕获图像,类似于示例文档。这里的问题是图像变得可用需要超长时间(2-3秒)。我想这是因为文件在捕获时已保存到光盘,然后需要再次从文件中读取。

是否有任何方法可以在捕获后直接访问图片信息,以进行预处理和OCR等操作?

1 个答案:

答案 0 :(得分: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,但没有充分记录。

参考: