谷歌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イ
 我的
 
各位看官老爷看完别忘给我点个赞哦😘😘😘










![[CP_AUTOSAR]_通信服务_DCM模块(二)_通用设计元素](https://i-blog.csdnimg.cn/direct/3a108131921d4fad813d61681b5d6a1e.png#pic_center)







