方案 | 特点 | 适用场景 |
---|---|---|
Google ML Kit | 无需训练数据、支持多语言、离线可用、集成简单 | 快速开发、跨平台需求 |
Tesseract OCR | 开源引擎、高度可定制、需训练数据、依赖原生库 | 定制化需求、离线优先 |
第三方云服务 | 高精度、支持复杂场景、需网络请求 | 服务器端处理、高复杂度场景 |
// 使用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); } }
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存储空间) |
问题表现:无法读取外部存储的图片
解决方案:
// 使用ACTION_OPEN_DOCUMENT获取持久权限 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/"); startActivityForResult(intent, REQUEST_CODE);
优化方案:
Bitmap.createBitmap()
进行感兴趣区域(ROI)裁剪 ColorMatrixColorFilter
进行色彩校正 答:
答:
Bitmap.createScaledBitmap()
按比例缩放 detector.close()
释放资源后再处理新图片