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