Android OCR 谷歌OCR TextRecognition用法介绍

news2024/11/13 19:18:54

谷歌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

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イ
 我的



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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IEEE报告解读:存储技术发展趋势分析

1.引言 随着数据科学、物联网&#xff08;IoT&#xff09;和永久存储需求的快速增长&#xff0c;对大规模数据存储的需求正在迅速增加。存储技术的发展趋势直接关系到数据的可靠性和经济性。本文将根据IEEE最新发布的《2023年国际器件与系统路线图》&#xff0c;深入探讨各种存…

私网环境下如何使用云效流水线进行 CI/CD?

作者&#xff1a;怀虎 场景介绍 代码库、制品库等数据资产托管在内部办公网&#xff0c;公网不能访问&#xff0c;希望能够使用云效流水线进行 CICD 的编排和控制。 整体方案 云效流水线可以托管用户的私网环境内的机器&#xff0c;并将构建任务调度到这些机器上&#xff0…

PPT创作新纪元C-Ai PPT助手

前端必备工具推荐网站(免费图床、API和ChatAI等实用工具): http://luckycola.com.cn/ 解锁PPT创作新纪元 —— 遇见C-AiPPT助手 在这个快节奏的时代&#xff0c;无论是商务演示还是学术汇报&#xff0c;一份精美且内容丰富的PPT都是不可或缺的利器。但你是否曾为寻找合适的PPT…

81.SAP ME - SAP SMGW Getway Monitor

目录 1.起因 2.SMGW Displaying Logged On Clients Displaying Remote Gateways Display and Control Existing Connections Deleting a Connection Displaying Gateway Release Information Displaying Parameters and Attributes of the Gateway Change Gateway Pa…

QModbus例程分析

由于有一个Modebus上位机的需要&#xff0c;分析一下QModbus Slave的源代码&#xff0c;方便后面的开发。 什么是Modbus Modbus是一种常用的串行通信协议&#xff0c;被广泛应用于工业自动化领域。它最初由Modicon&#xff08;目前属于施耐德电气公司&#xff09;于1979年开发…

AXS4054:单节锂电池充电管理芯片特性与应用推荐

AXS4054是一款单节锂离子电池恒流/恒压线性充电器&#xff0c;芯片集成功率晶体管&#xff0c;充电电流可以用外部电阻设定&#xff0c;蕞大持续充电电流可达600mA,非常适合便携式设备应用&#xff0c;适合USB电源和适配器电源工作&#xff0c;内部采用防倒充电路&#xff0c;不…

关于暨南大学电子信息复试机试篇

书接上回&#xff0c;上一篇文章为关于暨南大学智科院电子信息复试笔试篇&#xff0c;由于我误信了卖复试辅导书的店家说今年改机试&#xff0c;所以在复试方案出来之前&#xff0c;我一直都在准备机试&#xff0c;暨南大学的机试历年来一直都是四道编程题&#xff0c;可以使用…

【C++】C++11中的包装器和绑定器

目录 一、function包装器 1.1 可调用对象 1.2 概念 1.3 应用场景 二、bind绑定器 一、function包装器 1.1 可调用对象 我们平时使用的普通函数、函数指针、仿函数和Lambda表达式都是可调用对象&#xff0c;它们不仅可以作为其他函数的参数传入&#xff0c;还可以作为其他…

逻辑回归模型构建+PDP(部分依赖图)解析——Python代码及运行结果分析

一、逻辑回归模型简介 逻辑回归是一种广泛用于二分类问题的统计模型。它通过使用逻辑函数将预测结果映射到0到1之间&#xff0c;从而可以用于概率预测。模型的训练过程通常包括以下几个步骤&#xff1a; 数据预处理&#xff1a;处理缺失值、编码分类变量、标准化数值变量。特…

Python代码之特征工程基础

1. 什么是特征工程 特征工程是指从原始数据中提取、转换和创建适合于模型训练的数据特征的过程。它是机器学习和深度学习中非常重要的一步&#xff0c;因为好的特征工程可以显著提高模型的性能。特征工程涉及从数据中提取有意义的信息&#xff0c;并将其转换为模型可以理解和使…

[CP_AUTOSAR]_通信服务_DCM模块(二)_通用设计元素

目录 1、通用设计元素1.1、子模块1.2、NRC&#xff08;Negative Response Code&#xff09;1.3、Non-volatile 信息1.4、Types1.4.1、Atomic types overview1.4.2、Data array types overview1.4.3、Nested Data types overview1.4.4、Data types constraints1.4.5、Dcm_OpStat…

第一周、、

7-1 入度与出度 分数 10 全屏浏览 切换布局 作者 黄龙军 单位 绍兴文理学院 求有向图G中各顶点的入度与出度。建议分别采用邻接矩阵和邻接表这两种不同的存储结构完成。 输入格式: 首先输入一个正整数T&#xff0c;表示测试数据的组数&#xff0c;然后是T组测试数据。每组…

2024年,这4款思维导图在线工具帮你高效作图

思维导图是一种强大的思维工具&#xff0c;它能够帮助我们更好地处理信息、解决问题。很多人都不知道要怎么制作&#xff0c;我整理的这4款工具是目前很受欢迎的思维导图工具&#xff0c;使用起来也很简单。 1、福昕导图软件 传送门&#xff1a;pdf365.cn/naotu 这是一款制作…

kubernetes 集群组件介绍

kubernetes 集群组件介绍 Kubernetes 架构 在Kubernetes&#xff08;k8s&#xff09;集群中&#xff0c;主节点&#xff08;Master Node&#xff09;和工作节点&#xff08;Worker Node&#xff09;都运行特定的软件组件&#xff0c;它们共同管理和运行容器化的应用程序。以下…

SD卡参数错误:深度解析与数之寻软件恢复实战

一、SD卡参数错误&#xff1a;数据与设备的隐形杀手 在数字化时代&#xff0c;SD卡作为便携存储设备&#xff0c;广泛应用于相机、手机、无人机及各类电子设备中&#xff0c;承载着人们珍贵的照片、视频、文档等重要数据。然而&#xff0c;SD卡在使用过程中&#xff0c;有时会…

天津有哪些SOLIDWORKS代理商?

随着数字化转型的步伐加快&#xff0c;越来越多的企业开始寻求高效的三维设计解决方案来提高生产力和创新力。在天津&#xff0c;亿达四方作为SOLIDWORKS官方授权的代理商&#xff0c;正成为众多企业的首选合作伙伴。本文将详细介绍亿达四方提供的服务和优势&#xff0c;帮助您…

CTFHUB-web-RCE-过滤运算符

开启题目 查看源码发现管道符被过滤&#xff0c;使用分号&#xff1b;拼接注入&#xff0c;发现了 flag 的可疑文件 127.0.0.1;ls 使用 cat 查看 flag 文件&#xff0c;右键查看页面源代码发现了 flag 127.0.0.1;cat flag_229701159030749.php

IP地址申请SSL证书,实现https访问

一般情况下&#xff0c;SSL证书都是通过域名来申请的&#xff0c;但是很多单位没有域名或者不方便提供域名&#xff0c;只能提供IP地址&#xff0c;那么如果想实现IP地址的https访问&#xff0c;就得申请IP地址专用SSL证书&#xff0c;市面上专供IP地址使用的SSL证书服务商比较…

数字孪生平台:构建智慧未来,重塑空间智能生态的钥匙

数字孪生平台这一创新概念的勃然兴起&#xff0c;不仅是技术的飞跃&#xff0c;更是对空间信息处理与决策智慧化、生态构建的一次世代跃迁跃进。本文旨在深度剖析数字孪生平台的内核、运作机制、应用前景及其对智慧生态的深远影响。 数字孪生平台&#xff1a;定义与构想 数字…

【Python基础】Python六种标准数据类型中哪些是可变数据,哪些是不可变数据

文章目录 1.基本介绍可变数据类型不可变数据类型2.可变和不可变到底指的是什么?可变(Mutable)不可变(Immutable)总结1.基本介绍 Python 中的六种标准数据类型分为可变数据类型和不可变数据类型。以下是这些数据类型的分类: 可变数据类型 列表(List) 列表是一种有序集…