Dart调用chineseocr_lite:Flutter桌面应用开发实践
在移动应用开发中,集成OCR(Optical Character Recognition,光学字符识别)功能可以极大提升用户体验,尤其是需要处理文档、票据或身份证等场景。然而,传统OCR方案往往体积庞大、性能开销高,难以在资源受限的设备上高效运行。本文将介绍如何在Flutter桌面应用中集成超轻量级中文OCR引擎chineseocr_lite,通过Dart语言调用实现高效、准确的文字识别功能。
项目概述
chineseocr_lite是一个超轻量级中文OCR项目,总模型大小仅4.7M,支持竖排文字识别,并提供ncnn、mnn、tnn等多种推理框架支持。项目结构清晰,包含多个平台的实现版本,如C++、JVM、Android、.NET等,方便不同开发场景下的集成与使用。
项目核心模块包括:
- DbNet:文本检测网络,用于定位图像中的文字区域
- AngleNet:文字方向分类网络,支持0°、90°、180°、270°方向检测
- CrnnNet:文字识别网络,将检测到的文字区域转换为文本内容
官方文档:README.md
环境准备
系统要求
- Flutter 3.0+
- Dart 2.17+
- Windows/macOS/Linux系统
- C++编译环境(用于构建原生插件)
依赖安装
首先,克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/ch/chineseocr_lite
cd chineseocr_lite
项目Python依赖:requirements.txt
tornado==5.1.1
numpy==1.19.1
opencv_python==4.3.0.36
onnxruntime==1.4.0
Shapely==1.7.0
pyclipper==1.2.0
Pillow==7.2.0
实现方案
技术架构
Flutter调用chineseocr_lite的实现方案主要有两种:
- HTTP服务模式:通过Python启动chineseocr_lite的Web服务,Flutter通过HTTP请求调用OCR功能
- 原生插件模式:将C++版本封装为Flutter原生插件,Dart直接调用原生接口
本文将重点介绍第一种方案,该方案实现简单,跨平台兼容性好,适合快速集成。
HTTP服务模式实现
启动OCR服务
chineseocr_lite提供了现成的Web服务实现,位于backend/main.py。通过以下命令启动服务:
cd chineseocr_lite
python backend/main.py
服务启动后,默认监听本地5000端口,提供RESTful API接口供调用。
Flutter端实现
在Flutter项目中添加HTTP请求依赖:
dependencies:
http: ^0.13.5
image_picker: ^0.8.6
实现OCR调用功能:
import 'dart:convert';
import 'package:http/http.dart' as http;
import 'package:image_picker/image_picker.dart';
class OcrService {
final String baseUrl;
OcrService({this.baseUrl = 'http://localhost:5000/api/ocr'});
Future<String> recognizeImage(XFile image) async {
var request = http.MultipartRequest('POST', Uri.parse(baseUrl));
request.files.add(await http.MultipartFile.fromPath('file', image.path));
var response = await request.send();
if (response.statusCode == 200) {
var responseData = await response.stream.bytesToString();
var result = json.decode(responseData);
return result['data']['text'];
} else {
throw Exception('OCR识别失败: ${response.reasonPhrase}');
}
}
}
应用示例
界面设计
以下是一个简单的Flutter OCR应用界面实现,包含图片选择和识别结果展示功能:
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'ocr_service.dart';
class OcrDemoApp extends StatefulWidget {
@override
_OcrDemoAppState createState() => _OcrDemoAppState();
}
class _OcrDemoAppState extends State<OcrDemoApp> {
final OcrService _ocrService = OcrService();
final ImagePicker _picker = ImagePicker();
String _result = '';
XFile? _image;
Future<void> _pickImage(ImageSource source) async {
final XFile? image = await _picker.pickImage(source: source);
if (image != null) {
setState(() {
_image = image;
_result = '识别中...';
});
try {
String result = await _ocrService.recognizeImage(image);
setState(() {
_result = result;
});
} catch (e) {
setState(() {
_result = '识别失败: $e';
});
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('中文OCR识别')),
body: SingleChildScrollView(
padding: EdgeInsets.all(16),
child: Column(
children: [
if (_image != null)
Image.file(File(_image!.path), height: 300),
SizedBox(height: 20),
Text('识别结果:'),
SizedBox(height: 10),
Text(_result),
],
),
),
floatingActionButton: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
FloatingActionButton(
onPressed: () => _pickImage(ImageSource.camera),
child: Icon(Icons.camera),
),
SizedBox(height: 10),
FloatingActionButton(
onPressed: () => _pickImage(ImageSource.gallery),
child: Icon(Icons.photo),
),
],
),
);
}
}
识别效果展示
chineseocr_lite支持多种场景下的文字识别,包括身份证、车牌、IMEI码等。以下是一些实际识别效果示例:
性能优化
模型选择
chineseocr_lite提供了多种模型文件,位于models/和models_ncnn/目录下,可根据实际需求选择合适的模型:
- onnx模型:models/dbnet.onnx、models/angle_net.onnx、models/crnn_lite_lstm.onnx
- ncnn模型:models_ncnn/dbnet_op.param、models_ncnn/angle_op.param、models_ncnn/crnn_lite_op.param
服务端优化
修改config.py文件调整OCR参数,平衡识别速度和准确率:
# 检测模型参数
det_model_path = "models/dbnet.onnx"
det_thresh = 0.3
det_box_thresh = 0.6
det_max_candidates = 1000
# 识别模型参数
rec_model_path = "models/crnn_lite_lstm.onnx"
rec_img_h = 48
rec_img_w = 320
# 方向分类模型参数
cls_model_path = "models/angle_net.onnx"
cls_thresh = 0.9
高级集成方案
对于性能要求较高的场景,可以考虑将C++版本的chineseocr_lite封装为Flutter原生插件。项目提供了完整的C++实现,位于cpp_projects/目录下,包括OcrLiteMnn、OcrLiteNcnn和OcrLiteOnnx三个版本。
C++源码目录:cpp_projects/OcrLiteNcnn/src/
主要C++类:
- OcrLite.h:OCR引擎主类
- DbNet.h:文本检测网络
- CrnnNet.h:文本识别网络
- AngleNet.h:方向分类网络
通过Flutter的Method Channel机制,可以将这些C++类封装为Dart可调用的接口,实现更高效的本地OCR调用。
总结
本文介绍了如何在Flutter桌面应用中集成chineseocr_lite实现中文OCR功能,包括HTTP服务模式的快速集成方案和原生插件模式的高级集成方案。chineseocr_lite作为超轻量级OCR引擎,在保持较小体积的同时提供了良好的识别准确率,非常适合在资源受限的环境中使用。
项目提供了丰富的示例和文档,如遇集成问题,可参考以下资源:
- 官方文档:README.md
- C++实现:cpp_projects/
- Android示例:android_projects/
- .NET示例:dotnet_projects/
通过本文介绍的方法,开发者可以快速为Flutter应用添加高效、准确的中文OCR功能,拓展应用的使用场景和用户体验。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






