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的情况下,需要在应用中绑定模型,这样应用包的大小会增加很多。

相关推荐
stevenzqzq42 分钟前
glide缓存策略和缓存命中
android·缓存·glide
雅雅姐1 小时前
Android 16 的用户和用户组定义
android
没有了遇见1 小时前
Android ConstraintLayout 之ConstraintSet
android
余辉zmh2 小时前
【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键
android·数据库·mysql
什么都不懂95273 小时前
Android Lmkd
android
zhangphil4 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin
android·kotlin
猪哥帅过吴彦祖4 小时前
Flutter SizeTransition:让你的UI动画更加丝滑
android·flutter
OperateCode6 小时前
Android Studio 格式规范
android
张风捷特烈6 小时前
鸿蒙纪·Flutter卷#02 | 已有 Flutter 项目鸿蒙化 · 3.27.4 版
android·flutter·harmonyos