Google ML Kit系列:在Android上实现OCR本地识别

前言

Google ML Kit是Google出的一套机器学习工具,可以在移动端运行机器学习模型实现文字识别、人脸检测等功能。这套工具包括以下功能:文字识别、人脸检测、条形码扫描、图片标签、对象检测和跟踪、姿势检测、自拍分割、智能回复、文本翻译和语言翻译等。(注意部分功能目前必须依赖Google Play服务,比如文件扫描器,看导入库的名称可以区分)

官方文档:developers.google.cn/ml-kit/guid...

今天我们来学习一下Google ML Kit的文字识别功能。

导入依赖

前提需要我们的APP的minSdkVersion 值为 21 或更高。

因为在国内无法使用google play服务,所以我们需要将模型与应用捆绑在一起,通过如下的方式导入依赖

gradle 复制代码
dependencies {
  // To recognize Latin script
  implementation 'com.google.mlkit:text-recognition:16.0.1'

  // To recognize Chinese script
  implementation 'com.google.mlkit:text-recognition-chinese:16.0.1'

  // To recognize Devanagari script
  implementation 'com.google.mlkit:text-recognition-devanagari:16.0.1'

  // To recognize Japanese script
  implementation 'com.google.mlkit:text-recognition-japanese:16.0.1'

  // To recognize Korean script
  implementation 'com.google.mlkit:text-recognition-korean:16.0.1'
}

这里根据自己的需要导入相应语言的库即可,比如识别中文只需要text-recognition-chinese即可。

创建TextRecognizer

代码如下:

kotlin 复制代码
val recognizer = TextRecognition.getClient(ChineseTextRecognizerOptions.Builder().build())

这里我们识别中文,所以使用ChineseTextRecognizerOptions,如果是其他语言则使用对应的类即可。

构建InputImage

需要将我们的图片封装成InputImage来作为输入,这个类有几个函数,如下:

  • fromBitmap(@NonNull Bitmap bitmap, int rotationDegrees)
  • fromByteArray(@NonNull byte[] byteArray, int width, int height, int rotationDegrees, @InputImage.ImageFormat int format)
  • fromByteBuffer(@NonNull ByteBuffer byteBuffer, int width, int height, int rotationDegrees, @InputImage.ImageFormat int format)
  • fromFilePath(@NonNull Context context, @NonNull Uri imageUri)
  • fromMediaImage(@NonNull Image image, int rotationDegrees)
  • fromMediaImage(@NonNull Image image, int rotationDegrees, @NonNull Matrix coordinatesMatrix)

根据我们的实际情况选用合适的函数来封装图片即可,比如

kotlin 复制代码
val bitmap = BitmapFactory.decodeStream(assets.open("aaa.jpg"))
val image = InputImage.fromBitmap(bitmap, Surface.ROTATION_0)

识别图片

下面就是开始进行识别,代码如下:

kotlin 复制代码
val result = recognizer.process(image).addOnSuccessListener { result ->
    //todo 处理结果
}.addOnFailureListener { e ->
    Log.e("ocr", "recognize error", e)
}

通过process函数来执行识别,然后通过addOnSuccessListener添加一个监听,可以获取到识别结果。可以通过addOnFailureListener添加一个失败的监听,获取失败的信息。

处理结果

识别返回的结果是一个com.google.mlkit.vision.text.Text类,可以通过getText()来获取识别的内容字符串,不过这里是按图片上一块一块文字来分割的。

也可以通过它的getTextBlocks()来获取每一块文字,这个函数得到是TextBlock列表。

TextBlock

TextBlock同样有一个getText()来获取这一块中的所有文字。也可以通过getLines()来获取这一块中每一行文字,这个函数得到的是Line列表

Line

Line同样有一个getText()来获取这一行中的所有文字。也可以通过getElements()来获取这一行中每个字词,这个函数得到的是Element列表

Element

Element同样有一个getText()来获取这一个字词的字符串。也可以通过getSymbols()来获取这个字词中的每个字符,这个函数得到的是Symbol列表

Symbol

Symbol就是最小的单位了,通过getText()来获取这个字符即可。

TextBase

TextBlock、Line、Element、Symbol这四个类都是TextBase的子类。

TextBase中存储了位置和区域的信息,所以TextBlock、Line、Element、Symbol他们除了可以得到对应的内容外,还可以得到对应的位置和区域。使用getBoundingBox和getCornerPoints函数即可。当然还有一些其他信息,查阅官网或者源码即可。

一般我们处理结果可以不用到Symbol这个维度,可以根据自己的实际需要来处理即可。

总结

可以看到Google ML Kit的提供了很便捷的API,可以很轻松的实现相应的功能。但是也要注意,尤其在国内无法使用Google Play的情况下,需要在应用中绑定模型,这样应用包的大小会增加很多。

相关推荐
lvronglee20 小时前
【数字图传第四步】Android App查看图传视频
android·音视频
90后的晨仔21 小时前
Android 程序入口与核心组件详解
android
90后的晨仔21 小时前
Kotlin 简介与开发环境搭建
android
BU摆烂会噶21 小时前
【LangGraph】House_Agent 实战(四):预定流程 —— 中断与人工干预
android·人工智能·python·langchain
AI玫瑰助手21 小时前
Python运算符:比较运算符(等于不等等于大于小于)与返回值
android·开发语言·python
new_dev1 天前
Python实现Android自动化打包工具:加固、签名、多渠道一键完成
android·python·自动化
小孔龙1 天前
Android `<activity-alias>` 指南:动态图标 · 多入口 · 重命名兼容
android·程序员·掘金·日新计划
QING6181 天前
Kotlin inline 实战详解 —— 新手须知
android·kotlin·android jetpack
ElevenS_it1881 天前
MySQL慢查询监控与告警实战:从slow_log采集到分钟级定位慢SQL的完整链路配置
android·sql·mysql
沐言人生1 天前
ReactNative 源码分析12——Native View创建流程onBatchComplete
android·react native