Flutter文本识别插件learning_text_recognition的使用
Flutter文本识别插件learning_text_recognition的使用
ML Text Recognition
ML Kit的文本识别可以识别拉丁、中文、印地文、日文和韩文等语言的文本,并且可以用于自动化数据录入任务,如处理信用卡、收据和名片。
Getting Started
在你的Flutter项目中添加依赖:
$ pub add learning_text_recognition
Usage
import 'package:learning_text_recognition/learning_text_recognition.dart';
Input Image
输入图像作为InputImage
实例,这是learning_input_image
包的一部分。
你可以使用InputCameraView
从learning_input_image
包作为默认实现来处理相机/存储中的图像(或图像流)到InputImage
格式。但如果你愿意,也可以学习InputCameraView
代码以创建自己的自定义实现。
以下是如何使用InputCameraView
获取InputImage
进行文本识别的示例:
import 'package:learning_input_image/learning_input_image.dart';
InputCameraView(
canSwitchMode: false,
mode: InputCameraMode.gallery,
title: 'Text Recognition',
onImage: (InputImage image) {
// 现在我们可以将输入图像馈入文本识别过程
},
)
Text Recognition
获取InputImage
后,可以通过调用TextRecognition
实例的方法process
开始进行文本识别。
// 当使用拉丁文字母时
TextRecognition textRecognition = TextRecognition();
// 或像这样:
TextRecognition textRecognition = TextRecognition(
options: TextRecognitionOptions.Default
);
// 当使用中文时
TextRecognition textRecognition = TextRecognition(
options: TextRecognitionOptions.Chinese
);
// 当使用印地文时
TextRecognition textRecognition = TextRecognition(
options: TextRecognitionOptions.Devanagari
);
// 当使用日文时
TextRecognition textRecognition = TextRecognition(
options: TextRecognitionOptions.Japanese
);
// 当使用韩文时
TextRecognition textRecognition = TextRecognition(
options: TextRecognitionOptions.Korean
);
// 进行文本识别...
RecognizedText result = await textRecognition.process(image);
Output
文本识别的结果是一个RecognizededText
对象,它包含描述输入图像中识别文本细节的嵌套元素。以下是RecognizededText
结构的数据的示例:
-
RecognizededText
Text
: Wege der parlamentarischen DemokratieBlocks
: (1 block)
-
TextBlock
Text
: Wege der parlamentarischen DemokratieFrame
: (117.0, 258.0, 190.0, 83.0)Corner Points
: (117, 227), (301.64, 228.49), (306.05, 329.36), (121.41, 340.86)Recognized Language Code
: deLines
: (3 lines)
-
TextLine
Text
: Wege derFrame
: (167.0, 221.0, 91.0, 28.0)Corner Points
: (167, 227), (255.82, 221.46), (257.19, 283.42), (168.36, 288.95)Recognizeded Language Code
: deElements
: (2 elements)
-
TextElement
Text
: WegeFrame
: (167.0, 223.0, 59.0, 22.0)Corner Points
: (167, 227), (223.88, 223.45), (225.25, 285.41), (168.36, 288.95)
Dispose
textRecognition.dispose();
Example Project
你可以从示例项目了解更多:example
import 'package:flutter/material.dart';
import 'package:learning_input_image/learning_input_image.dart';
import 'package:learning_text_recognition/learning_text_recognition.dart';
import 'package:provider/provider.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.lightBlue,
visualDensity: VisualDensity.adaptivePlatformDensity,
primaryTextTheme: TextTheme(
headline6: TextStyle(color: Colors.white),
),
),
home: ChangeNotifierProvider(
create: (_) => TextRecognitionState(),
child: TextRecognitionPage(),
),
);
}
}
class TextRecognitionPage extends StatefulWidget {
[@override](/user/override)
_TextRecognitionPageState createState() => _TextRecognitionPageState();
}
class _TextRecognitionPageState extends State<TextRecognitionPage> {
TextRecognition? _textRecognition = TextRecognition();
/* TextRecognition? _textRecognition = TextRecognition(
options: TextRecognitionOptions.Japanese
); */
[@override](/user/override)
void dispose() {
_textRecognition?.dispose();
super.dispose();
}
Future<void> _startRecognition(InputImage image) async {
TextRecognitionState state = Provider.of(context, listen: false);
if (state.isNotProcessing) {
state.startProcessing();
state.image = image;
state.data = await _textRecognition?.process(image);
state.stopProcessing();
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return InputCameraView(
mode: InputCameraMode.gallery,
// resolutionPreset: ResolutionPreset.high,
title: 'Text Recognition',
onImage: _startRecognition,
overlay: Consumer<TextRecognitionState>(
builder: (_, state, __) {
if (state.isNotEmpty) {
return Center(
child: Container(
padding: EdgeInsets.symmetric(vertical: 10, horizontal: 16),
decoration: BoxDecoration(
color: Colors.white.withOpacity(0.8),
borderRadius: BorderRadius.all(Radius.circular(4.0)),
),
child: Text(
state.text,
style: TextStyle(
fontWeight: FontWeight.w500,
),
),
),
);
}
return Container();
},
),
);
}
}
class TextRecognitionState extends ChangeNotifier {
InputImage? _image;
RecognizededText? _data;
bool _isProcessing = false;
InputImage? get image => _image;
Recogn RecognedText? get data => _data;
String get text => _data!.text;
bool get isNotProcessing => !_isProcessing;
bool get isNotEmpty => _data != null && text.isNotEmpty;
void startProcessing() {
_isProcessing = true;
notifyListeners();
}
void stopProcessing() {
_isProcessing = false;
notifyListeners();
}
set image(InputImage? image) {
_image = image;
notifyListeners();
}
set data(Recogn RecognedText? data) {
_data = data;
notifyListeners();
}
}
更多关于Flutter文本识别插件learning_text_recognition的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter文本识别插件learning_text_recognition的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中集成并使用 learning_text_recognition
插件进行文本识别的代码示例。
步骤1:添加依赖
首先,你需要在 pubspec.yaml
文件中添加 learning_text_recognition
依赖。
dependencies:
flutter:
sdk: flutter
learning_text_recognition: ^最新版本号 # 请替换为最新版本号
步骤2:导入插件
在你的 Dart 文件中(例如 main.dart
),导入该插件。
import 'package:flutter/material.dart';
import 'package:learning_text_recognition/learning_text_recognition.dart';
步骤3:请求权限并初始化插件
在 Flutter 应用中,文本识别通常需要访问相机权限。确保在 AndroidManifest.xml
和 Info.plist
中请求必要的权限,并在代码中处理权限请求。
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Text Recognition Demo'),
),
body: TextRecognitionScreen(),
),
);
}
}
class TextRecognitionScreen extends StatefulWidget {
@override
_TextRecognitionScreenState createState() => _TextRecognitionScreenState();
}
class _TextRecognitionScreenState extends State<TextRecognitionScreen> {
final TextRecognition _textRecognition = TextRecognition();
String? _recognizedText;
@override
void initState() {
super.initState();
// 请求相机权限(示例,具体实现可能需要根据实际情况调整)
_requestPermissions();
}
Future<void> _requestPermissions() async {
// 示例:检查并请求相机权限
bool hasPermission = await Permission.camera.request().isGranted;
if (!hasPermission) {
// 处理权限被拒绝的情况
print('Camera permission is denied');
}
}
Future<void> _startTextRecognition() async {
try {
String result = await _textRecognition.recognizeTextFromImage(
// 这里可以传入图像文件的路径或图像数据
imagePath: 'path/to/your/image.jpg', // 替换为实际的图像路径
);
setState(() {
_recognizedText = result;
});
} catch (e) {
print('Error recognizing text: $e');
}
}
@override
Widget build(BuildContext context) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _startTextRecognition,
child: Text('Recognize Text'),
),
if (_recognizedText != null)
Text(
'Recognized Text: $_recognizedText',
style: TextStyle(fontSize: 18),
),
],
),
);
}
}
注意事项
-
图像路径:在
_startTextRecognition
方法中,你需要提供图像的路径。这个路径可以是本地文件路径,也可以是远程 URL(如果插件支持)。 -
权限处理:在上面的代码中,我提供了一个简单的权限请求示例。实际项目中,你可能需要更复杂的权限处理逻辑,比如引导用户到设置页手动开启权限。
-
错误处理:在实际应用中,你应该添加更多的错误处理逻辑,以应对可能出现的各种异常情况。
-
插件版本:确保你使用的是
learning_text_recognition
插件的最新版本,因为插件的 API 和功能可能会随着版本更新而变化。 -
图像数据:如果插件支持直接从图像数据中读取(比如
Uint8List
),你可以直接将图像数据传递给识别函数,而不是图像路径。
希望这些代码示例和注意事项能帮助你在 Flutter 项目中成功集成和使用 learning_text_recognition
插件。