Android OCR && 谷歌OCR TextRecognition用法介绍

部署运行你感兴趣的模型镜像

谷歌OCR TextRecognition用法介绍

所有代码在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

InputImageTextRecognition的输入源,里面包装了要识别的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イ
 我的



各位看官老爷看完别忘给我点个赞哦😘😘😘

您可能感兴趣的与本文相关的镜像

Hunyuan-OCR-WEBUI

Hunyuan-OCR-WEBUI

图文对话
PyTorch

腾讯混元OCR(文字识别),网页推理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值