Dart调用chineseocr_lite:Flutter桌面应用开发实践

Dart调用chineseocr_lite:Flutter桌面应用开发实践

【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M 【免费下载链接】chineseocr_lite 项目地址: https://gitcode.com/gh_mirrors/ch/chineseocr_lite

在移动应用开发中,集成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的实现方案主要有两种:

  1. HTTP服务模式:通过Python启动chineseocr_lite的Web服务,Flutter通过HTTP请求调用OCR功能
  2. 原生插件模式:将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码等。以下是一些实际识别效果示例:

身份证识别效果: 身份证识别

车牌识别效果: 车牌识别

IMEI码识别效果: IMEI识别

性能优化

模型选择

chineseocr_lite提供了多种模型文件,位于models/models_ncnn/目录下,可根据实际需求选择合适的模型:

服务端优化

修改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++类:

通过Flutter的Method Channel机制,可以将这些C++类封装为Dart可调用的接口,实现更高效的本地OCR调用。

总结

本文介绍了如何在Flutter桌面应用中集成chineseocr_lite实现中文OCR功能,包括HTTP服务模式的快速集成方案和原生插件模式的高级集成方案。chineseocr_lite作为超轻量级OCR引擎,在保持较小体积的同时提供了良好的识别准确率,非常适合在资源受限的环境中使用。

项目提供了丰富的示例和文档,如遇集成问题,可参考以下资源:

通过本文介绍的方法,开发者可以快速为Flutter应用添加高效、准确的中文OCR功能,拓展应用的使用场景和用户体验。

【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M 【免费下载链接】chineseocr_lite 项目地址: https://gitcode.com/gh_mirrors/ch/chineseocr_lite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值