Flutter文本识别插件learning_text_recognition的使用

发布于 1周前 作者 songsunli 来自 Flutter

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包的一部分。

你可以使用InputCameraViewlearning_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 Demokratie
    • Blocks: (1 block)
  • TextBlock

    • Text: Wege der parlamentarischen Demokratie
    • Frame: (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: de
    • Lines: (3 lines)
  • TextLine

    • Text: Wege der
    • Frame: (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: de
    • Elements: (2 elements)
  • TextElement

    • Text: Wege
    • Frame: (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

1 回复

更多关于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.xmlInfo.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),
            ),
        ],
      ),
    );
  }
}

注意事项

  1. 图像路径:在 _startTextRecognition 方法中,你需要提供图像的路径。这个路径可以是本地文件路径,也可以是远程 URL(如果插件支持)。

  2. 权限处理:在上面的代码中,我提供了一个简单的权限请求示例。实际项目中,你可能需要更复杂的权限处理逻辑,比如引导用户到设置页手动开启权限。

  3. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,以应对可能出现的各种异常情况。

  4. 插件版本:确保你使用的是 learning_text_recognition 插件的最新版本,因为插件的 API 和功能可能会随着版本更新而变化。

  5. 图像数据:如果插件支持直接从图像数据中读取(比如 Uint8List),你可以直接将图像数据传递给识别函数,而不是图像路径。

希望这些代码示例和注意事项能帮助你在 Flutter 项目中成功集成和使用 learning_text_recognition 插件。

回到顶部