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

相关推荐
xiangpanf29 分钟前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx3 小时前
安卓线程相关
android
消失的旧时光-19434 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon5 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon5 小时前
VSYNC 信号完整流程2
android
dalancon5 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013846 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android6 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才7 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶8 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle