我想在我的颤音应用程序的摄像头上实现近乎实时的OCR。为了做到这一点,我想以快速的方式访问相机数据。据我所知,我有两种选择,并且遇到了两种选择的障碍:
CameraPreview周围放置一个RepaintBoundary并创建一个RenderRepaintBoundary,并调用boundary.toImage()来截取它的屏幕截图。这种方法的问题在于,.toImage方法似乎只捕获边界中绘制的小部件,而不捕获摄像机预览中的数据。对于这里描述的问题:https://github.com/flutter/flutter/issues/17687controller.takePicture(filePath)从相机0.2.1获取图像,类似于示例文档。这里的问题是,需要超长时间才能获得图像(2-3秒)。我猜这是因为文件在捕获时保存到磁盘,然后需要从文件中再次读取。是否有任何方式可以直接访问图片信息后,捕获,做的事情,如预处理和OCR?
发布于 2019-02-26 15:28:37
对于“接近实时的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中,但并没有很好的文档。
参考:
发布于 2022-08-16 12:33:40
一个更好的解决方案(2022年)的实时OCR是使用相机在一个循环的频率为500毫秒,并处理图像使用谷歌ML工具包的文本识别。
https://stackoverflow.com/questions/51085201
复制相似问题