Flutter文字识别插件ml_kit_ocr的使用

Flutter文字识别插件ml_kit_ocr的使用

要求

Android

  • android/app/build.gradle 中设置 minSdkVersion 21
  • android/build.gradle 中设置 ext.kotlin_version = '1.6.10'
  • android/src/main/AndroidManifest.xml 中添加 <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ocr" />
  • 如果使用多个模型,请用逗号分隔,例如 <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ocr,ica" />
  • Android应用大小影响约为260KB

iOS

  • 最低iOS部署目标为10.0
  • 使用Xcode 12.5.1或更高版本
  • ML Kit仅支持64位架构(x86_64 和 arm64)。请检查此列表以确认您的设备是否具有所需的功能。
  • 由于ML Kit不支持32位架构(i386 和 armv7),因此需要在Xcode中排除armv7架构以构建iOS应用
  • iOS应用大小影响约为20MB

使用

// 创建一个 [MlKitOcr] 实例
final ocr = MlKitOcr();

// 选择图像(使用image_picker)
// ...

// 调用 `processImage()` 并传递参数为 `InputImage`(参见示例获取更多信息)
final result = await ocr
    .processImage(InputImage.fromFilePath(image.path));

// 初始化识别结果字符串
recognitions = '';

// 遍历文本块
for (var blocks in result.blocks) {
    for (var lines in blocks.lines) {
        for (var words in lines.elements) {
            // 将每个单词的文本添加到识别结果中
            recognitions += words.text + ' ';
        }
    }
}

该插件是 google_ml_kit 的简化版。由于 google_ml_kit 包含所有NLP和Vision API,应用大小会显著增加。因此,创建了这个插件,使得示例应用的完整APK大小为17MB,而分割后的APK大小为6MB。

完整示例代码

以下是完整的示例代码,展示了如何使用 ml_kit_ocr 插件进行文字识别。

import 'dart:io';

import 'package:flutter/material.dart';

import 'package:image_picker/image_picker.dart';

import 'package:ml_kit_ocr/ml_kit_ocr.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  XFile? image;
  String recognitions = '';
  String timeElapsed = '';
  bool isProcessing = false;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('MlKit OCR 示例应用'),
        ),
        body: ListView(
          physics: const ClampingScrollPhysics(),
          children: [
            const SizedBox(height: 20),
            if (image != null)
              SizedBox(
                height: 200,
                width: 200,
                child: InteractiveViewer(
                  child: Image.file(
                    File(image!.path),
                    fit: BoxFit.contain,
                  ),
                ),
              ),
            const SizedBox(height: 20),
            if (recognitions.isNotEmpty)
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: SelectableText('识别的文本: $recognitions'),
              ),
            if (timeElapsed.isNotEmpty)
              Padding(
                padding: const EdgeInsets.all(8.0),
                child: Text('耗时: $timeElapsed 毫秒'),
              ),
            const SizedBox(height: 20),
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceAround,
              children: [
                ElevatedButton(
                  onPressed: () async {
                    image = await ImagePicker().pickImage(source: ImageSource.gallery);
                    recognitions = '';
                    timeElapsed = '';
                    setState(() {});
                  },
                  child: const Text('选择图片'),
                ),
                if (image != null)
                  isProcessing
                      ? const Center(
                          child: CircularProgressIndicator.adaptive(),
                        )
                      : ElevatedButton(
                          onPressed: () async {
                            recognitions = '';
                            final ocr = MlKitOcr();
                            final stopwatch = Stopwatch()..start();
                            isProcessing = true;
                            setState(() {});
                            final result = await ocr.processImage(InputImage.fromFilePath(image!.path));
                            timeElapsed = stopwatch.elapsedMilliseconds.toString();
                            isProcessing = false;
                            stopwatch.reset();
                            stopwatch.stop();
                            for (var blocks in result.blocks) {
                              for (var lines in blocks.lines) {
                                recognitions += '\n';
                                for (var words in lines.elements) {
                                  recognitions += words.text + ' ';
                                }
                              }
                            }
                            setState(() {});
                          },
                          child: const Text('从图片预测'),
                        ),
              ],
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter文字识别插件ml_kit_ocr的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter文字识别插件ml_kit_ocr的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


ml_kit_ocr 是一个用于Flutter的文字识别插件,它基于Google的ML Kit OCR(光学字符识别)技术。通过这个插件,你可以在Flutter应用中轻松地实现文字识别功能。以下是如何使用ml_kit_ocr插件的详细步骤:

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加ml_kit_ocr插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  ml_kit_ocr: ^0.0.1  # 请检查最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入包

在你的Dart文件中导入ml_kit_ocr包。

import 'package:ml_kit_ocr/ml_kit_ocr.dart';

3. 初始化OCR

在使用OCR功能之前,你需要初始化MLKitOcr实例。

final MLKitOcr _mlKitOcr = MLKitOcr();

4. 处理图像并识别文字

你可以通过processImage方法来处理图像并识别文字。你可以使用ImagePicker来选择图像,或者在应用中使用相机拍摄图像。

import 'package:image_picker/image_picker.dart';

Future<void> recognizeTextFromImage() async {
  final picker = ImagePicker();
  final pickedFile = await picker.getImage(source: ImageSource.gallery);

  if (pickedFile != null) {
    final filePath = pickedFile.path;
    final recognizedText = await _mlKitOcr.processImage(filePath);

    print('Recognized Text: $recognizedText');
  } else {
    print('No image selected.');
  }
}

5. 释放资源

当不再需要使用OCR功能时,记得释放资源。

[@override](/user/override)
void dispose() {
  _mlKitOcr.dispose();
  super.dispose();
}

6. 处理结果

processImage方法返回一个字符串,包含了识别出的文字。你可以根据需要对这个字符串进行处理,比如显示在UI中、保存到数据库等。

完整示例

以下是一个完整的示例,展示了如何使用ml_kit_ocr插件从图像中识别文字:

import 'package:flutter/material.dart';
import 'package:ml_kit_ocr/ml_kit_ocr.dart';
import 'package:image_picker/image_picker.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: OcrScreen(),
    );
  }
}

class OcrScreen extends StatefulWidget {
  [@override](/user/override)
  _OcrScreenState createState() => _OcrScreenState();
}

class _OcrScreenState extends State<OcrScreen> {
  final MLKitOcr _mlKitOcr = MLKitOcr();
  String _recognizedText = '';

  Future<void> recognizeTextFromImage() async {
    final picker = ImagePicker();
    final pickedFile = await picker.getImage(source: ImageSource.gallery);

    if (pickedFile != null) {
      final filePath = pickedFile.path;
      final recognizedText = await _mlKitOcr.processImage(filePath);

      setState(() {
        _recognizedText = recognizedText;
      });
    } else {
      setState(() {
        _recognizedText = 'No image selected.';
      });
    }
  }

  [@override](/user/override)
  void dispose() {
    _mlKitOcr.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('ML Kit OCR Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: recognizeTextFromImage,
              child: Text('Select Image'),
            ),
            SizedBox(height: 20),
            Text('Recognized Text:'),
            Text(_recognizedText),
          ],
        ),
      ),
    );
  }
}
回到顶部