Android集成chineseocr_lite教程:打造离线OCR扫描应用
你是否还在为移动端离线文字识别功能的开发而烦恼?是否因模型体积过大导致应用臃肿?本文将带你一步步集成超轻量级中文OCR引擎chineseocr_lite,仅需4.7M总模型大小即可实现高效的离线文字识别功能,支持证件、车牌、设备码等多种场景的文字提取。
项目概述
chineseocr_lite是一个超轻量级中文OCR项目,采用DBNet(1.8M)+ AngleNet(378KB)+ CRNN(2.5M)组合模型,总大小仅4.7M,特别适合移动端集成。该项目支持ncnn、mnn、tnn等多种推理框架,Android平台主要通过ncnn框架实现高效推理。
项目目录结构清晰,提供了完整的Android集成方案:
- 核心库:android_projects/OcrLiteAndroidNcnn/OcrLibrary
- 示例应用:android_projects/OcrLiteAndroidNcnn/app
- 模型文件:models_ncnn
环境准备
开发环境要求
- Android Studio 2020.3.1或以上版本
- NDK最新版本(通过SDK Tools下载)
- CMake 3.4.1或以上版本(建议3.18.1)
- Gradle 7.0.2或以上
依赖文件准备
-
模型文件:从项目models_ncnn目录获取以下文件,放置到
OcrLibrary/src/main/assets目录:- angle_op.bin
- angle_op.param
- crnn_lite_op.bin
- crnn_lite_op.param
- dbnet_op.bin
- dbnet_op.param
- keys.txt
-
OpenCV库:下载opencv-mobile-3.4.15-android,解压至OcrLibrary/src/sdk/native
-
ncnn库:下载ncnn预编译库,分别解压至:
- CPU版:OcrLibrary/src/main/ncnn
- GPU版(支持Vulkan):OcrLibrary/src/main/ncnn-vulkan
⚠️ 注意:解压后需修改每个ABI目录下的
lib/cmake/ncnn/ncnn.cmake文件,注释掉# INTERFACE_COMPILE_OPTIONS "-fno-rtti;-fno-exceptions"行,否则会导致编译错误。
集成步骤
1. 配置项目依赖
在settings.gradle中添加OcrLibrary模块:
include ':app', ':OcrLibrary'
在app模块的build.gradle中添加依赖:
implementation project(':OcrLibrary')
2. 初始化OCR引擎
创建OcrEngine实例,初始化模型:
import com.benjaminwan.ocrlibrary.OcrEngine
class MainActivity : AppCompatActivity() {
private lateinit var ocrEngine: OcrEngine
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 初始化OCR引擎
ocrEngine = try {
OcrEngine(applicationContext)
} catch (e: Exception) {
Log.e("OCR", "初始化失败: ${e.message}")
return
}
// 配置识别参数
ocrEngine.apply {
padding = 50
boxScoreThresh = 0.6f
boxThresh = 0.3f
unClipRatio = 2.0f
doAngle = true // 支持角度检测
mostAngle = true // 支持多角度识别
}
}
}
核心初始化代码位于OcrEngine.kt,通过JNI调用底层C++实现:
init {
System.loadLibrary("OcrLite")
val ret = init(context.assets, numThread)
if (!ret) throw IllegalArgumentException()
}
3. 实现图片识别功能
从相册选择图片识别
// 启动相册
val intent = Intent(Intent.ACTION_GET_CONTENT)
intent.type = "image/*"
startActivityForResult(intent, REQUEST_CODE_PICK_IMAGE)
// 处理选择结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_PICK_IMAGE && resultCode == RESULT_OK) {
data?.data?.let { uri ->
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri))
// 创建输出bitmap用于绘制识别结果
val outputBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
// 执行识别
val ocrResult = ocrEngine.detect(bitmap, outputBitmap, maxSideLen = 1024)
// 显示识别结果
showResult(outputBitmap, ocrResult)
}
}
}
相机实时识别
项目提供了相机识别功能,可直接集成CameraX实现预览帧处理:
// 设置预览分析器
imageAnalysis.setAnalyzer(cameraExecutor) { imageProxy ->
val bitmap = imageProxy.toBitmap() // 转换为Bitmap
val outputBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true)
val ocrResult = ocrEngine.detect(bitmap, outputBitmap, maxSideLen = 1024)
// 在主线程更新UI
runOnUiThread {
imageView.setImageBitmap(outputBitmap)
resultTextView.text = ocrResult.text
}
imageProxy.close()
}
4. 识别结果处理
OCR识别结果封装在OcrResult.kt中,包含文本内容、置信度和坐标信息:
data class OcrResult(
val text: String, // 识别文本
val score: Float, // 平均置信度
val boxes: List<BoxInfo> // 文本框信息列表
)
data class BoxInfo(
val text: String,
val score: Float,
val box: List<PointF> // 四边形坐标
)
可根据业务需求提取特定区域文本,如证件号码、车牌号码等。
功能展示
设备码识别
证件识别
车牌识别
编译与优化
编译选项配置
在Android Studio的"Build Variants"中选择构建变体:
- CpuDebug/CpuRelease:仅CPU支持,最小SDK 21,APK约21MB
- GpuDebug/GpuRelease:支持GPU加速(Vulkan),最小SDK 24,APK约58MB
命令行编译
# Linux/Mac
./gradlew assembleRelease
# Windows
gradlew.bat assembleRelease
编译输出位于app/build/outputs/apk
常见问题解决
模型文件找不到
确保模型文件放置在正确路径: OcrLibrary/src/main/assets
编译错误:undefined reference to 'ncnn::Net::load_param'
检查ncnn库是否正确配置,确保OcrLibrary/src/main/cpp/CMakeLists.txt中已正确引入ncnn和OpenCV:
target_link_libraries(
OcrLite
ncnn
opencv_core
opencv_imgproc
android
jnigraphics
log
)
识别速度优化
- 调整
maxSideLen参数(建议800-1200) - 减少线程数:OcrEngine.kt中的
numThread常量 - 选择GPU构建变体启用硬件加速
总结
通过本文教程,你已掌握如何将chineseocr_lite集成到Android应用中,实现高效的离线文字识别功能。该方案具有模型小、速度快、识别准的特点,非常适合移动场景下的文字提取需求。
项目提供了完整的演示代码和场景示例,你可以直接参考android_projects/OcrLiteAndroidNcnn目录下的实现,快速构建自己的OCR应用。
如需进一步优化或扩展功能,可查阅:
- 官方文档:README.md
- 高级配置:config.py
- C++核心实现:cpp_projects/OcrLiteNcnn
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考






