Flutter文字识别插件baidu_ocr_plugin的使用
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
更多关于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
依赖。
注意:
- 确保你已经替换了
your_baidu_api_key
和your_baidu_secret_id
为你自己的百度OCR API密钥和密钥ID。 - 这个示例仅用于演示目的,实际生产环境中应考虑添加更多的错误处理和用户反馈机制。
- 由于网络请求和API限制,可能需要在真机或模拟器上测试以确保功能正常。
这个代码示例展示了如何从用户相册中选择一张图片,并使用百度OCR服务来识别图片中的文字,最后将识别结果显示在屏幕上。