使用 Dart 和 Flutter 构建验证码识别应用(基于 Tesseract OCR)
一、项目概述
我们将构建一个 Flutter 应用,用户可以上传验证码图像,应用内部调用 Tesseract 引擎识别出其中的英文字母和数字。
更多内容访问ttocr.com或联系1436423940
二、技术准备
- 安装 Flutter
官网:https://flutter.dev
flutter doctor
确保 Flutter 和 Dart 环境已配置。
- 创建项目
flutter create captcha_ocr_flutter
cd captcha_ocr_flutter
3. 安装依赖插件
编辑 pubspec.yaml 添加:
dependencies:
flutter:
sdk: flutter
image_picker: ^1.0.4
tesseract_ocr: ^0.3.1
path_provider: ^2.1.1
permission_handler: ^11.0.1
三、iOS & Android 原生配置提示(如需部署到手机)
Android 需开启权限读取外部存储
iOS 需修改 Info.plist 增加摄像头与图库权限(不赘述,如需可提供)
四、主界面代码示例
编辑 lib/main.dart:
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'package:tesseract_ocr/tesseract_ocr.dart';
import 'dart:io';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(CaptchaOCRApp());
}
class CaptchaOCRApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '验证码识别',
theme: ThemeData(primarySwatch: Colors.blue),
home: CaptchaHomePage(),
);
}
}
class CaptchaHomePage extends StatefulWidget {
@override
_CaptchaHomePageState createState() => _CaptchaHomePageState();
}
class _CaptchaHomePageState extends State
File? _imageFile;
String _recognizedText = '';
Future
final picker = ImagePicker();
final picked = await picker.pickImage(source: ImageSource.gallery);
if (picked != null) {
setState(() {
_imageFile = File(picked.path);
_recognizedText = '';
});
}
}
Future
if (_imageFile == null) return;
final text = await TesseractOcr.extractText(
_imageFile!.path,
language: 'eng',
args: {
'tessedit_char_whitelist': 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
'psm': '7',
},
);
final cleaned = text.replaceAll(RegExp(r'[^A-Za-z0-9]'), '');
setState(() {
_recognizedText = cleaned;
});
}
@override
void initState() {
super.initState();
Permission.storage.request();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('验证码识别(Flutter + Tesseract)')),
body: Padding(
padding: const EdgeInsets.all(20),
child: Column(
children: [
if (_imageFile != null)
Image.file(_imageFile!, height: 150),
const SizedBox(height: 20),
ElevatedButton(
onPressed: _pickImage,
child: Text('上传验证码图像'),
),
ElevatedButton(
onPressed: _performOCR,
child: Text('识别'),
),
const SizedBox(height: 20),
Text(
'识别结果:$_recognizedText',
style: TextStyle(fontSize: 18, color: Colors.green),
)
],
),
),
);
}
}
五、运行演示
flutter run
在模拟器或真机运行后,选择验证码图像,即可识别其文字内容。
输出示例:
识别结果:T7X2B
浙公网安备 33010602011771号