上一篇
安卓开发之识别图片中的文字
- 行业动态
- 2025-04-21
- 3574
技术选型与依赖配置
主流OCR方案对比
方案 | 特点 | 适用场景 |
---|---|---|
Google ML Kit | 无需训练数据、支持多语言、离线可用、集成简单 | 快速开发、跨平台需求 |
Tesseract OCR | 开源引擎、高度可定制、需训练数据、依赖原生库 | 定制化需求、离线优先 |
第三方云服务 | 高精度、支持复杂场景、需网络请求 | 服务器端处理、高复杂度场景 |
添加ML Kit依赖
// 使用Firebase Bom管理版本(推荐) implementation platform('com.google.firebase:firebase-bom:31.5.0') implementation 'com.google.ml:translate:18.0.0' implementation 'com.google.android.gms:play-services-mlvision:24.0.3'
核心实现步骤
权限配置
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/>
动态权限申请(Android 6.0+)
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CODE); }
图片选择与预处理
// 启动相册选择器 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, IMAGE_SELECT_CODE); // 处理选中图片 @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == IMAGE_SELECT_CODE && resultCode == RESULT_OK) { Uri imageUri = data.getData(); Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); // 可选:进行图像增强处理 recognizeText(bitmap); } }
OCR核心代码
private void recognizeText(Bitmap bitmap) { FirebaseVisionImage image = FirebaseVisionImage.fromBitmap(bitmap); FirebaseVisionTextRecognizer detector = FirebaseVision.getInstance().getOnDeviceTextRecognizer(); detector.processImage(image) .addOnSuccessListener(result -> { String text = result.getText(); // 更新UI显示结果 textView.setText(text); }) .addOnFailureListener(e -> { // 错误处理 Toast.makeText(this, "识别失败", Toast.LENGTH_SHORT).show(); }); }
进阶优化方案
优化方向 | 实现方式 |
---|---|
多语言支持 | detector.setLanguagePreference("zh") 指定语言 |
图像增强 | 使用OpenCV进行灰度化、二值化处理 |
大文件处理 | 分块处理(ML Kit单次最大支持4096×4096像素) |
离线模式 | 下载ML Kit离线模型(需约100MB存储空间) |
常见问题与解决方案
Android 11存储权限适配
问题表现:无法读取外部存储的图片
解决方案:
// 使用ACTION_OPEN_DOCUMENT获取持久权限 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/"); startActivityForResult(intent, REQUEST_CODE);
复杂背景识别率低
优化方案:
- 使用
Bitmap.createBitmap()
进行感兴趣区域(ROI)裁剪 - 调用
ColorMatrixColorFilter
进行色彩校正 - 结合Tesseract的PSM模式调整页面布局分析策略
相关问题解答
Q1:ML Kit与Tesseract如何选择?
答:
- ML Kit优势:开箱即用、自动语言检测、谷歌云端支持、定期更新模型
- Tesseract优势:完全离线、可定制训练、支持老旧设备(API<21)
- 建议:原型开发优先ML Kit,特殊需求(如定制字符集)选Tesseract
Q2:如何处理超过尺寸限制的图片?
答:
- 使用
Bitmap.createScaledBitmap()
按比例缩放 - 调用
detector.close()
释放资源后再处理新图片 - 对超大图片进行网格划分(如4×4分区)后逐块识别