Android集成chineseocr_lite教程:打造离线OCR扫描应用

Android集成chineseocr_lite教程:打造离线OCR扫描应用

【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M 【免费下载链接】chineseocr_lite 项目地址: https://gitcode.com/gh_mirrors/ch/chineseocr_lite

你是否还在为移动端离线文字识别功能的开发而烦恼?是否因模型体积过大导致应用臃肿?本文将带你一步步集成超轻量级中文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 Studio 2020.3.1或以上版本
  • NDK最新版本(通过SDK Tools下载)
  • CMake 3.4.1或以上版本(建议3.18.1)
  • Gradle 7.0.2或以上

依赖文件准备

  1. 模型文件:从项目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
  2. OpenCV库:下载opencv-mobile-3.4.15-android,解压至OcrLibrary/src/sdk/native

  3. 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
)

识别速度优化

  1. 调整maxSideLen参数(建议800-1200)
  2. 减少线程数:OcrEngine.kt中的numThread常量
  3. 选择GPU构建变体启用硬件加速

总结

通过本文教程,你已掌握如何将chineseocr_lite集成到Android应用中,实现高效的离线文字识别功能。该方案具有模型小、速度快、识别准的特点,非常适合移动场景下的文字提取需求。

项目提供了完整的演示代码和场景示例,你可以直接参考android_projects/OcrLiteAndroidNcnn目录下的实现,快速构建自己的OCR应用。

如需进一步优化或扩展功能,可查阅:

【免费下载链接】chineseocr_lite 超轻量级中文ocr,支持竖排文字识别, 支持ncnn、mnn、tnn推理 ( dbnet(1.8M) + crnn(2.5M) + anglenet(378KB)) 总模型仅4.7M 【免费下载链接】chineseocr_lite 项目地址: https://gitcode.com/gh_mirrors/ch/chineseocr_lite

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值