Flutter文字识别插件baidu_ocr_plugin的使用

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

Flutter文字识别插件baidu_ocr_plugin的使用

简介

baidu_ocr_plugin 是一个用于在Flutter应用中集成百度OCR(光学字符识别)功能的插件。该插件支持iOS和Android平台,提供了多种文字识别API,如通用文字识别、身份证识别、银行卡识别等。

iOS SDK版本

  • 3.0.7

Android SDK版本

  • 2.0.1

安装

要使用 baidu_ocr_plugin,首先需要在 pubspec.yaml 文件中添加依赖:

$ flutter pub add baidu_ocr_plugin

然后运行以下命令来安装插件:

$ flutter pub get

使用

1. 身份验证

在使用OCR功能之前,必须先进行身份验证,获取访问令牌(AccessToken)。可以通过两种方式初始化AccessToken:

  • 自动初始化:调用 BaiduOcrPlugin.instance.initAccessToken(),该方法会自动从本地配置文件中读取API Key和Secret Key。

    try {
      await BaiduOcrPlugin.instance.initAccessToken();
      print("初始化成功");
    } on OCRError catch (e) {
      print("初始化错误: ${e.message}");
    }
    
  • 手动初始化:如果需要手动传入API Key和Secret Key,可以调用 BaiduOcrPlugin.instance.initAccessTokenWithAkSk(ak, sk)

    const ak = 'LrWkpucBSIKHErkFLWl71Pji';
    const sk = 'YnRX31Nz3g5aKUFPtv6A6oYvFFWhgRd6';
    
    try {
      await BaiduOcrPlugin.instance.initAccessTokenWithAkSk(ak, sk);
      print("初始化成功");
    } on OCRError catch (e) {
      print("初始化错误: ${e.message}");
    }
    

注意:授权文件如何配置请参考百度OCR官方文档。


2. 调用识别API

调用识别API时,可以传入图片的二进制数据(bytes),或者不传入图片数据,插件会弹出自带的拍照界面进行识别。

示例:通用文字识别
import 'package:baidu_ocr_plugin/baidu_ocr_plugin.dart';

BaiduOcrPlugin.instance.recognizeGeneralBasic(
  RecognizeCallbackHandler(
    onStart: (Uint8List imageBytes) {
      // 发送网络请求之前,通知此回调。
      // imageBytes为图片的二进制数据,可自行选择如何处理
      print("开始识别");
    },
    onResult: (String jsonRes) {
      print("识别结果:$jsonRes");
    },
    onError: (OCRError err) {
      print("识别错误:${err.message}");
    },
  ),
  bytes: bytes, // 可选参数,照片二进制数据
);
示例:自定义图片-通用文字识别

如果需要从相册或相机中选择图片并进行识别,可以使用 image_picker 插件获取图片的二进制数据,然后传入 bytes 参数。

import 'package:image_picker/image_picker.dart';

final ImagePicker _picker = ImagePicker();
final XFile? photo = await _picker.pickImage(
  source: ImageSource.camera,
  maxHeight: 1080,
  maxWidth: 1080,
);

if (photo != null) {
  final Uint8List bytes = await photo.readAsBytes();
  BaiduOcrPlugin.instance.recognizeGeneralBasic(
    RecognizeCallbackHandler(
      onStart: _handleStart,
      onResult: handleJsonRes,
      onError: handleOcrError,
    ),
    bytes: bytes,
  );
}
其他API

除了通用文字识别,baidu_ocr_plugin 还提供了多种其他类型的识别API,例如:

  • 身份证正面识别recognizeIdCardFrontNative
  • 身份证反面识别recognizeIdCardBackNative
  • 银行卡识别recognizeBankCard
  • 驾驶证识别recognizeDrivingLicense
  • 行驶证识别recognizeVehicleLicense
  • 车牌识别recognizeLicensePlate
  • 营业执照识别recognizeBusinessLicense
  • 通用票据识别recognizeReceipt
  • 增值税发票识别recognizeVatInvoice
  • 出租车票识别recognizeTaxireceipt
  • VIN码识别recognizeVincode
  • 火车票识别recognizeTrainticket
  • 数字识别recognizeNumbers
  • 二维码识别recognizeQrcode
  • 行程单识别recoginzeTripTicket
  • 机动车销售发票识别recoginzeVihickleSellInvoice
  • 车辆合格证识别recoginzeVihickleCertificate
  • 试卷分析与识别recoginzeExampleDoc
  • 手写文字识别recoginzeWrittenText
  • 护照识别recognizePassport
  • 户口本识别recoginzeHuKouPage
  • 普通机打发票识别recoginzeNormalMachineInvoice
  • 自定义模板识别recognizeCustom
  • 磅单识别recoginzeweightnote
  • 医疗费用明细识别recoginzemedicaldetail
  • 网约车行程单识别recoginzeonlinetaxiitinerary

参数说明

  • bytes:可选参数,照片的二进制数据。如果传入该参数,将不弹出自带的拍照界面,直接调用识别接口识别。
  • 图片大小限制:支持的图片大小为base64编码后小于4M,分辨率不高于4096x4096。否则会报错误码 216202
  • 身份证正面/反面识别:这两个API暂时不支持传入照片二进制数据。

完整示例代码

以下是一个完整的示例代码,展示了如何在Flutter应用中使用 baidu_ocr_plugin 进行文字识别。

import 'dart:typed_data';
import 'package:baidu_ocr_plugin/baidu_ocr_plugin.dart';
import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';
import 'package:image_picker/image_picker.dart';
import 'package:permission_handler/permission_handler.dart';

const ak = 'LrWkpucBSIKHErkFLWl71Pji';
const sk = 'YnRX31Nz3g5aKUFPtv6A6oYvFFWhgRd6';

void main() {
  /* Always call this if the main method is asynchronous*/
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      builder: EasyLoading.init(),
      home: const Home(),
    );
  }
}

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

  [@override](/user/override)
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  bool hasGotToken = false;

  [@override](/user/override)
  void initState() {
    [Permission.camera, Permission.storage].request();
    _initAccessToken();
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('baidu_ocr_plugin'),
      ),
      body: SafeArea(
        child: ListView(
          padding: const EdgeInsets.all(16),
          children: [
            ElevatedButton(
              child: const Text('自定义图片-通用文字识别'),
              onPressed: () {
                if (!checkTokenStatus()) return;

                showDialog(
                  barrierDismissible: false,
                  context: context,
                  builder: (context) {
                    return AlertDialog(
                      title: const Text('说明'),
                      content: const SingleChildScrollView(
                        child: Text(
                          '通过自己的方式得到图片的二进制数据,然后通过bytes参数传入,这个示例中使用的是image_picker插件,通过ImagePicker.pickImage得到图片的二进制数据',
                        ),
                      ),
                      actions: [
                        TextButton(
                          onPressed: () async {
                            Navigator.pop(context);

                            final ImagePicker _picker = ImagePicker();
                            final XFile? photo = await _picker.pickImage(
                              source: ImageSource.camera,
                              maxHeight: 1080,
                              maxWidth: 1080,
                            );
                            if (photo != null) {
                              final Uint8List bytes = await photo.readAsBytes();
                              debugPrint(
                                  'await photo.length: ${await photo.length()}');
                              debugPrint('bytes.length: ${bytes.length}');
                              BaiduOcrPlugin.instance.recognizeGeneralBasic(
                                RecognizeCallbackHandler(
                                  onStart: _handleStart,
                                  onResult: handleJsonRes,
                                  onError: handleOcrError,
                                ),
                                bytes: bytes,
                              );
                            }
                          },
                          child: const Text('确定'),
                        )
                      ],
                    );
                  },
                );
              },
            ),
            const Divider(),
            ElevatedButton(
              child: const Text('通用文字识别'),
              onPressed: () {
                if (!checkTokenStatus()) return;

                BaiduOcrPlugin.instance.recognizeGeneralBasic(
                  RecognizeCallbackHandler(
                    onStart: _handleStart,
                    onResult: handleJsonRes,
                    onError: handleOcrError,
                  ),
                );
              },
            ),
            // 其他按钮...
          ],
        ),
      ),
    );
  }

  bool checkTokenStatus() {
    if (!hasGotToken) EasyLoading.showToast('token还未成功获取');
    return hasGotToken;
  }

  void _alert(BuildContext context, String title, [Widget? content]) {
    showDialog(
      barrierDismissible: false,
      context: context,
      builder: (context) {
        return AlertDialog(
          title: Text(title),
          content: SingleChildScrollView(child: content),
          actions: [
            TextButton(
              onPressed: () {
                Navigator.pop(context);
              },
              child: const Text('确定'),
            )
          ],
        );
      },
    );
  }

  void _initAccessToken() async {
    try {
      await BaiduOcrPlugin.instance.initAccessToken();
      hasGotToken = true;
      EasyLoading.dismiss();
    } on OCRError catch (e) {
      await EasyLoading.dismiss();
      _alert(context, '初始化错误', Text(e.message));
    }
  }

  void _handleStart(Uint8List imageBytes) {
    _alert(context, '图片', Image.memory(imageBytes));
    EasyLoading.show(status: '正在识别', maskType: EasyLoadingMaskType.black);
  }

  void handleJsonRes(String jsonRes) {
    EasyLoading.dismiss();
    _alert(context, '识别结果', Text(jsonRes));
  }

  void handleOcrError(OCRError ocrError) {
    EasyLoading.dismiss();
    _alert(context, '识别错误', Text(ocrError.message));
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用baidu_ocr_plugin进行文字识别的代码示例。这个插件允许你利用百度OCR(Optical Character Recognition)服务来识别图像中的文字。

首先,确保你已经在pubspec.yaml文件中添加了baidu_ocr_plugin依赖:

dependencies:
  flutter:
    sdk: flutter
  baidu_ocr_plugin: ^最新版本号  # 请替换为实际可用的最新版本号

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

接下来,你需要配置百度OCR的API密钥和密钥ID。这些信息通常在你申请百度OCR服务时会提供。

以下是一个完整的Flutter应用示例,展示如何使用baidu_ocr_plugin进行文字识别:

import 'package:flutter/material.dart';
import 'package:baidu_ocr_plugin/baidu_ocr_plugin.dart';
import 'dart:io';
import 'package:image_picker/image_picker.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 BaiduOcrPlugin _baiduOcrPlugin = BaiduOcrPlugin();
  File? _imageFile;
  String _result = '';

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Baidu OCR Demo'),
      ),
      body: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          _imageFile == null
              ? Text('No image selected.')
              : Image.file(_imageFile!),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _pickImage,
            child: Text('Pick Image'),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: _performOCR,
            child: Text('Perform OCR'),
            enabled: _imageFile != null,
          ),
          SizedBox(height: 20),
          Text('OCR Result:\n$_result'),
        ],
      ),
    );
  }

  Future<void> _pickImage() async {
    final ImagePicker _picker = ImagePicker();
    final XFile? image = await _picker.pickImage(source: ImageSource.gallery);

    if (image != null) {
      setState(() {
        _imageFile = File(image.path);
      });
    }
  }

  Future<void> _performOCR() async {
    if (_imageFile == null) return;

    // Replace with your actual API key and secret ID
    final String apiKey = 'your_baidu_api_key';
    final String secretId = 'your_baidu_secret_id';

    try {
      final OcrResult result = await _baiduOcrPlugin.recognizeTextFromImage(
        apiKey: apiKey,
        secretId: secretId,
        imagePath: _imageFile!.path,
      );

      setState(() {
        _result = result.words!.join('\n');
      });
    } catch (e) {
      setState(() {
        _result = 'Error: ${e.message ?? e.toString()}';
      });
    }
  }
}

在这个示例中,我们使用了image_picker插件来选择图像。你需要确保在pubspec.yaml中也添加了image_picker依赖:

dependencies:
  image_picker: ^最新版本号  # 请替换为实际可用的最新版本号

运行flutter pub get来安装image_picker依赖。

注意

  1. 确保你已经替换了your_baidu_api_keyyour_baidu_secret_id为你自己的百度OCR API密钥和密钥ID。
  2. 这个示例仅用于演示目的,实际生产环境中应考虑添加更多的错误处理和用户反馈机制。
  3. 由于网络请求和API限制,可能需要在真机或模拟器上测试以确保功能正常。

这个代码示例展示了如何从用户相册中选择一张图片,并使用百度OCR服务来识别图片中的文字,最后将识别结果显示在屏幕上。

回到顶部