当前位置:首页 > 行业动态 > 正文

安卓开发之识别图片中的文字

技术选型与依赖配置

主流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);

复杂背景识别率低

优化方案

  1. 使用Bitmap.createBitmap()进行感兴趣区域(ROI)裁剪
  2. 调用ColorMatrixColorFilter进行色彩校正
  3. 结合Tesseract的PSM模式调整页面布局分析策略

相关问题解答

Q1:ML Kit与Tesseract如何选择?

  • ML Kit优势:开箱即用、自动语言检测、谷歌云端支持、定期更新模型
  • Tesseract优势:完全离线、可定制训练、支持老旧设备(API<21)
  • 建议:原型开发优先ML Kit,特殊需求(如定制字符集)选Tesseract

Q2:如何处理超过尺寸限制的图片?

  1. 使用Bitmap.createScaledBitmap()按比例缩放
  2. 调用detector.close()释放资源后再处理新图片
  3. 对超大图片进行网格划分(如4×4分区)后逐块识别