我想在我的flutter应用程序的相机供稿上实现近实时OCR。为此,我想快速访问摄像机数据。 据我所知,我有两个选择,并且都遇到了障碍:
通过在CameraPreview
周围放一个RepaintBoundary
并创建一个RenderRepaintBoundary
并调用boundary.toImage()
来截取controller.takePicture(filePath)
的屏幕快照。此方法的问题在于.toImage方法似乎仅捕获边界中绘制的小部件,而不捕获摄像机预览中的数据。与此处描述的问题类似:https://github.com/flutter/flutter/issues/17687
使用来自相机0.2.1的export class RequestType {
prop1: string;
prop2: string;
}
export class ResponseType {
prop3: string;
prop4: string;
}
捕获图像,类似于示例文档。这里的问题是图像变得可用需要超长时间(2-3秒)。我想这是因为文件在捕获时已保存到光盘,然后需要再次从文件中读取。
是否有任何方法可以在捕获后直接访问图片信息,以进行预处理和OCR等操作?
答案 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,但没有充分记录。
参考: