Flutter文字识别插件paddle_ocr的使用

Flutter文字识别插件paddle_ocr的使用

paddle_ocr

本项目是一个基于Flutter的文字识别插件项目,使用了paddle_ocr插件进行文字识别。

获取开始

该项目是一个Flutter插件包的起点,包含针对Android和/或iOS平台的特定实现代码。

对于如何开始使用Flutter,您可以查看我们的在线文档,该文档提供了教程、示例、移动开发指南以及完整的API引用。


示例代码

example/lib/main.dart

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:paddle_ocr/bean/ocr_results.dart'; // 导入OCR结果类
import 'package:paddle_ocr/paddle_ocr.dart'; // 导入paddle_ocr插件
import 'package:path_provider/path_provider.dart'; // 导入路径提供者
import 'package:image_picker/image_picker.dart'; // 导入图像选择器

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

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

class _MyAppState extends State<MyApp> {
  String _platformVersion = '未知';
  bool isEnabled = true;
  String _ocrResultStr = '无';

  [@override](/user/override)
  void initState() {
    super.initState();
    initPlatformState();
  }

  // 异步方法初始化平台状态
  Future<void> initPlatformState() async {
    String platformVersion;
    // 使用try/catch处理可能的平台异常
    try {
      platformVersion = await PaddleOcr.platformVersion;
    } on PlatformException {
      platformVersion = '获取平台版本失败。';
    }

    // 如果小部件从树中移除,丢弃回复而不是调用setState
    if (!mounted) return;

    setState(() {
      _platformVersion = platformVersion;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Paddle OCR Demo'), // 设置应用栏标题
        ),
        body: Center(
          child: Column(
            children: [
              Text('运行在: $_platformVersion\n'), // 显示平台版本信息
              FlatButton(
                onPressed: isEnabled ? () async { // 点击事件
                  setState(() {
                    isEnabled = false; // 禁用按钮
                  });
                  final picker = ImagePicker(); // 初始化图像选择器
                  final pickedFile = await picker.getImage(source: ImageSource.gallery); // 从相册选择图片
                  if (pickedFile == null) {
                    setState(() {
                      isEnabled = true; // 重新启用按钮
                    });
                    return;
                  }
                  Future.delayed(Duration(milliseconds: 100), () async { // 延迟100毫秒以确保图像加载完成
                    dynamic ocrResultMap = await PaddleOcr.ocrFromImage(pickedFile.path, ocr_type: 'ID_CARD', isPrint: true); // 调用OCR识别
                    if (ocrResultMap['success']) {
                      OcrResultInfo ocrResultInfo = ocrResultMap['ocrResult']; // 解析识别结果
                      print(ocrResultInfo.ocrResults.toString()); // 打印识别结果
                      setState(() {
                        _ocrResultStr = ocrResultInfo.ocr_type + // 设置识别类型
                            '\n\n' +
                            (ocrResultInfo.ocr_type == 'EMPTY' ? '空白页' : ''); // 显示识别结果
                        if (ocrResultInfo.ocr_type == 'BANK_CARD' && ocrResultInfo.ocrResults.length == 0) {
                          _ocrResultStr += '请重新识别'; // 提示重新识别
                        }
                      });
                      ocrResultInfo.ocrResults.forEach((ocrResult) {
                        setState(() {
                          _ocrResultStr += // 更新识别结果字符串
                              '${ocrResult.index} ${ocrResult.name} ${ocrResult.confidence}\n ${ocrResult.bounds.toString()}\n\n';
                        });
                      });
                    } else {
                      print('OCR识别失败[${ocrResultMap['code']} ${ocrResultMap['message']}]'); // 打印识别错误信息
                    }
                    setState(() {
                      isEnabled = true; // 重新启用按钮
                    });
                  });
                } : null, // 禁用按钮
                child: Text('测试OCR识别'), // 按钮文本
              ),
              Expanded(child: SingleChildScrollView(child: Text(_ocrResultStr))) // 显示识别结果
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用paddle_ocr插件进行文字识别的代码示例。这个插件利用了PaddleOCR,一个在移动端设备上高效运行的OCR库。

首先,确保你已经在Flutter项目中添加了paddle_ocr依赖。在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  flutter:
    sdk: flutter
  paddle_ocr: ^最新版本号  # 请替换为实际发布的最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在Flutter应用中编写代码来使用paddle_ocr进行文字识别。以下是一个完整的示例,展示了如何从图像中识别文字:

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

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

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

class OcrScreen extends StatefulWidget {
  @override
  _OcrScreenState createState() => _OcrScreenState();
}

class _OcrScreenState extends State<OcrScreen> {
  final ImagePicker _picker = ImagePicker();
  PaddleOCR? _paddleOcr;
  File? _imageFile;
  String _ocrResult = "";

  @override
  void initState() {
    super.initState();
    _initPaddleOCR();
  }

  Future<void> _initPaddleOCR() async {
    _paddleOcr = await PaddleOCR.initialize();
  }

  Future<void> _pickImage() async {
    final XFile? image = await _picker.pickImage(source: ImageSource.camera);
    if (image != null && image.path != null) {
      setState(() {
        _imageFile = File(image.path!);
      });
      _performOCR();
    }
  }

  Future<void> _performOCR() async {
    if (_paddleOcr != null && _imageFile != null) {
      try {
        final OCRResult result = await _paddleOcr!.recognizeImage(_imageFile!.path);
        setState(() {
          _ocrResult = result.text;
        });
      } catch (e) {
        print("OCR error: $e");
        setState(() {
          _ocrResult = "Error performing OCR";
        });
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Paddle OCR Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            _imageFile == null
              ? Text('No image selected.')
              : Image.file(_imageFile!),
            SizedBox(height: 20),
            Text(
              _ocrResult,
              style: TextStyle(fontSize: 18),
              textAlign: TextAlign.center,
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _pickImage,
              child: Text('Pick Image'),
            ),
          ],
        ),
      ),
    );
  }
}

注意事项:

  1. 权限处理:由于需要访问摄像头和存储,你需要在AndroidManifest.xmlInfo.plist中添加相应的权限。

    Android:

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    iOS: 在Info.plist中添加:

    <key>NSCameraUsageDescription</key>
    <string>Need camera access to capture images</string>
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>Need photo library access to pick images</string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>Need photo library access to pick images</string>
    
  2. Image Picker 依赖:这个示例使用了image_picker插件来选择图像。你需要在pubspec.yaml文件中添加这个依赖:

    dependencies:
      image_picker: ^最新版本号  # 请替换为实际发布的最新版本号
    
  3. 错误处理:在实际应用中,你可能需要更详细的错误处理逻辑,例如处理不同的错误类型并给用户反馈。

希望这个示例能帮你顺利地在Flutter项目中使用paddle_ocr插件进行文字识别。

回到顶部