谷歌OCR TextRecognition用法介绍
文章目录
- 谷歌OCR TextRecognition用法介绍
- 简介
- 作用
- 如何使用
- 1 在project-build.gradle/setting.gradle添加maven仓库
- 2.在module-build.gradle添加仓库依赖
- 3.初始化
- 4.使用InputImage
- 5.进行识别
- 完整代码
- 使用效果:
所有代码在Github-Tinder
简介
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程
本篇内容是关于Google-Ml-kit/Text-Recognition,是谷歌官方提供的基于机器学习套件的识别图片文本的库
作用
常用的OCR场景有证照识别,例如身份证,驾驶证,行驶证,社保卡等信息识别场景,提供证照,然后通过OCR提取关键信息,还有微信截图种文字提取等等,总之就是可以将图片种的文字信息提取出来。
如何使用
1 在project-build.gradle/setting.gradle添加maven仓库
pluginManagement {
repositories {
google {
content {
includeGroupByRegex("com\\.android.*")
includeGroupByRegex("com\\.google.*")
includeGroupByRegex("androidx.*")
}
}
//这个
mavenCentral()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
//这个
mavenCentral()
}
}
2.在module-build.gradle添加仓库依赖
dependencies {
// To recognize Latin script
//implementation 'com.google.mlkit:text-recognition:16.0.0'
// To recognize Chinese script
implementation 'com.google.mlkit:text-recognition-chinese:16.0.0'
// To recognize Devanagari script
//implementation 'com.google.mlkit:text-recognition-devanagari:16.0.0'
// To recognize Japanese script
//implementation 'com.google.mlkit:text-recognition-japanese:16.0.0'
// To recognize Korean script
//implementation 'com.google.mlkit:text-recognition-korean:16.0.0'
}
该库其实提供了通用识别库,根据不同文字内容可以配置不同的模型,然后可以识别不同的文字;为了更方便使用,也直接提供了对应语言模型的库,如上所示(模型库地址我一时找不到了),开发者可以根据自己的需要直接依赖对应语言的库;
3.初始化
首先我们准备OCR的抽象能力
interface IOcr : IReleaseAble {
fun recognize(bitmap: Bitmap)
fun recognize(path: String)
fun setOnRecognizeListener(listener: OcrHelper.IOcrRecognizeListener)
}
回调接口
public interface IOcrRecognizeListener {
fun onRecognize(success: Boolean, texts: List<String>?)
}
TextRecognition初始化
private val recognizer by lazy {
TextRecognition.getClient(ChineseTextRecognizerOptions.Builder().build())
}
初始化的代码就如上所示,其实Builder提供了丰富的初始化api,可以指定识别语言,模型库等等功能,但是我们集成的库和语言是绑定在一起的,所以无需进行繁杂的配置,只需要使用默认的配置就好了;
4.使用InputImage
InputImage
是TextRecognition
的输入源,里面包装了要识别的Bitmap,它有多种加载Bitmap的方案:
//path
val image: InputImage= InputImage.fromFilePath(context, uri)
//bitmap
val image = InputImage.fromBitmap(bitmap, 0)
可以通过Uri,可以通过Bitmap,等多种方式,这里由于我配合MediaProjection
,可以直接获取到Bitmap,所以使用fromBitmap
5.进行识别
recognizer.process(inputImage)
.addOnSuccessListener { t ->
Log.i(TAG, "recognize.onSuccess: ${t.text}")
val split = t.text.split("\n")
val arrayList = ArrayList<String>(split)
//给外部回调结果
mRecognizeListener?.onRecognize(true, arrayList)
bitmap.recycle()
}
.addOnFailureListener { e ->
Log.i(TAG, "recognize.onFailure: e:$e")
//给外部回调结果
mRecognizeListener?.onRecognize(false, null)
bitmap.recycle()
}
注意,识别的结果是com.google.mlkit.vision.text.Text
,它有两个关键的API
public String getText()
:获取识别到的文本集合,使用“\n”分割;
public List<TextBlock> getTextBlocks()
:获取识别到的文本list,将每个字符串单独拆分开成一个包装类;
这里我用自己的方式使用Text.split()
拆分,开发者可以自行选择使用
完整代码
OcrHelper OCR代理类,管理不同的OCR策略(因为我在尝试不通过的OCR方案,所以需要这种方式)
class OcrHelper(val context: Context) : IOcr {
private val mOcr: IOcr by lazy {
GoogleOcrImpl(context)
}
override fun recognize(bitmap: Bitmap) {
mOcr.recognize(bitmap)
}
override fun recognize(path: String) {
mOcr.recognize(path)
}
override fun setOnRecognizeListener(listener: IOcrRecognizeListener) {
mOcr.setOnRecognizeListener(listener)
}
override fun release() {
}
/**
* desc : OCR识别回调
* date : 7/29/2024
*/
public interface IOcrRecognizeListener {
fun onRecognize(success: Boolean, texts: List<String>?)
}
}
GoogleOcrImpl
class GoogleOcrImpl(private val context: Context) : IOcr {
private val recognizer by lazy {
TextRecognition.getClient(ChineseTextRecognizerOptions.Builder().build())
}
private var mRecognizeListener: OcrHelper.IOcrRecognizeListener? = null
override fun recognize(bitmap: Bitmap) {
val inputImage = InputImage.fromBitmap(bitmap, 0)
recognizer.process(inputImage)
.addOnSuccessListener { t ->
Log.i(TAG, "recognize.onSuccess: ${t.text}")
val split = t.text.split("\n")
val arrayList = ArrayList<String>(split)
mRecognizeListener?.onRecognize(true, arrayList)
bitmap.recycle()
}
.addOnFailureListener { e ->
Log.i(TAG, "recognize.onFailure: e:$e")
mRecognizeListener?.onRecognize(false, null)
bitmap.recycle()
}
}
override fun recognize(path: String) {
// InputImage.fromFilePath(mContext)
}
override fun setOnRecognizeListener(listener: OcrHelper.IOcrRecognizeListener) {
this.mRecognizeListener = listener
}
override fun release() {
}
companion object {
private const val TAG = "GoogleOcrImpl"
}
}
使用效果:
- 图片:
- 识别结果:
2024-08-07 16:03:53.416 6837-6837 GoogleOcrImpl com.wilson.tinder recognize.onSuccess: 16:03(
个人主页
收藏
美团神会员吃喝玩乐都能用
美食团购神券
订单
自
全部订单
钱包
?元
(堆荐
71万
书城
美团借钱
|随借随还
首页
快看有飞碟呀史名待认证
关注01评价77 |勋章43
凸十15
完结
浏览记录
待收货/使用
外卖神券
每日神券 兔费领取
21
视频
1笔
先用后还
我的额度
器*門31 HDL 4017
2元
(完结
红包卡券
消息
待评价
20
90,000
卡额度升级
额度可取现
完结
容服 设置
黃全等级>
更多福利>
商超果蔬神券
购物车
?元
|査看最近一笔账单>
(e)园
姜团币
退款售后
2.00元
道遥兵王
数币外卖券
完结
、业T7Cイ
我的
各位看官老爷看完别忘给我点个赞哦😘😘😘