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

相关推荐
千里马学框架17 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台17 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone18 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc18 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo20 小时前
Kotlin 协程中的 Job 结构化并发与取消
android
sun00770020 小时前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼21 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone1 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen1 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone1 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui