当前位置: 首页 > news >正文

使用 Google ML Kit 实现图片文字识别(提取美国驾照信息)

Google ML Kit 是一个现代、功能强大、跨平台的机器学习 SDK。在这篇文章中,我们将使用 ML Kit 在 Android 应用中识别图片文字,以提取美国驾照上的关键信息:DL(驾照号) 和 EXP(有效日期)


🛠️ 步骤一:项目配置

1. 添加依赖

打开 app/build.gradle,添加以下 ML Kit 的文字识别依赖:

dependencies { implementation 'com.google.mlkit:text-recognition:16.0.0' }

2. 添加权限(可选)

如果你需要从相册或相机中读取图片,还需要添加读取权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

🧾 示例功能说明

我们将:

  • 加载一张美国驾照图片(假设叫 license.jpg

  • 使用 ML Kit 提取图片上的文字

  • 使用正则表达式提取出驾驶证号(DL ABC1234567)和出生日期(DOB 05/01/1990


📄 布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/textView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><ImageViewandroid:id="@+id/imageView"android:layout_width="303dp"android:layout_height="189dp"android:layout_marginStart="54dp"android:layout_marginTop="62dp"android:layout_marginEnd="54dp"android:layout_marginBottom="105dp"app:layout_constraintBottom_toTopOf="@+id/textView"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"tools:src="@tools:sample/backgrounds/scenic" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="165dp"android:layout_marginTop="264dp"android:layout_marginEnd="156dp"android:layout_marginBottom="43dp"android:text="Loading"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/textView" /></androidx.constraintlayout.widget.ConstraintLayout>


🔧 主逻辑:MainActivity.kt

package com.example.mlimport android.graphics.BitmapFactory
import android.os.Bundle
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.google.mlkit.vision.common.InputImage
import com.google.mlkit.vision.text.TextRecognition
import java.io.InputStream
import com.google.mlkit.vision.text.latin.TextRecognizerOptionsclass MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val imageView = findViewById<ImageView>(R.id.imageView)val button = findViewById<Button>(R.id.button)// 加载图片(assets 文件夹中的 jiazhao.webp)val inputStream: InputStream = assets.open("license.jpg")val bitmap = BitmapFactory.decodeStream(inputStream)imageView.setImageBitmap(bitmap)button.setOnClickListener {extractTextFromBitmap(bitmap)}}private fun extractTextFromBitmap(bitmap: android.graphics.Bitmap) {val image = InputImage.fromBitmap(bitmap, 0)val textView = findViewById<TextView>(R.id.textView)val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)recognizer.process(image).addOnSuccessListener { visionText ->val fullText = visionText.text// 提取 DOB 和 DLval expRegex = Regex("""EXP\s+\d{2}/\d{2}/\d{4}""")val dlRegex = Regex("""DL\s+[A-Z0-9]+""")val exp = expRegex.find(fullText)?.value ?: "未识别到有效日期"val dl = dlRegex.find(fullText)?.value ?: "未识别到驾驶证号"textView.text =  "有效日期: $exp" + "\n" + "驾驶证号: $dl"}.addOnFailureListener { e ->textView.text = "识别失败:${e.message}"}}
}

🧪 测试效果

确保你将美国驾照样本命名为 license.jpg 并放入 res/drawable/ 目录。点击按钮后,在日志中可以看到类似如下输出:

有效日期: EXP 08/31/2026
驾驶证号: DL I1234568

相关文章:

使用 Google ML Kit 实现图片文字识别(提取美国驾照信息)

Google ML Kit 是一个现代、功能强大、跨平台的机器学习 SDK。在这篇文章中&#xff0c;我们将使用 ML Kit 在 Android 应用中识别图片文字&#xff0c;以提取美国驾照上的关键信息&#xff1a;DL&#xff08;驾照号&#xff09; 和 EXP&#xff08;有效日期&#xff09;。 &am…...

VR体验馆如何用小程序高效引流?3步打造线上预约+团购裂变系统

VR体验馆如何用小程序高效引流&#xff1f;3步打造线上预约团购裂变系统 一、线上预约的核心价值&#xff1a;优化体验&#xff0c;提升转化​​ ​​减少客户等待时间​​ 通过小程序预约功能&#xff0c;客户可提前选择体验时段&#xff0c;避免到店排队。数据显示&#…...

前端知识(vue3)

1.Vue3 1.1 介绍 Vue&#xff08;读音 /vjuː/, 类似于 view&#xff09;是一款用于构建用户界面的渐进式的JavaScript框架 官网&#xff1a;https://cn.vuejs.org 1.2 常见指令 指令&#xff1a;指的是HTML 标签上带有 v- 前缀的特殊属性&#xff0c;不同指令具有不同含义…...

nginx 代理 https 接口

代码中需要真实访问的接口是&#xff1a;https://sdk2.028lk.com/application-localizationdev.yml文件中配置&#xff1a; url: http:/111.34.80.138:18100/sdk2.028lk.com/该服务器111.34.80.138上 18100端口监听&#xff0c;配置信息为&#xff1a; location /sdk2.028lk.c…...

网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解

简介 本文主要介绍内网&#xff08;局域网&#xff09;与外网&#xff08;互联网&#xff09;的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接&#xff1a;iperf.fr/iperf-download.php该链接提供了不…...

解决TF-IDF增量学习问题的思路与方案

TF-IDF的传统实现面临增量学习困难&#xff0c;因为IDF计算依赖全局文档统计信息。但是实际的工作当中往往数据是增量的&#xff0c;并且定期增量和不定期增量混合&#xff0c;所以为了实际考虑&#xff0c;还是有必要思考如何解决TF-IDF增量问题的。 一、增量学习核心挑战 ID…...

【亲测】Linux 使用 Matplotlib 显示中文

文章目录 安装中文字体在Matplotlib中使用该字体来显示中文 在 Linux 系统中使用 Matplotlib 绘制图表时&#xff0c;如果需要显示中文&#xff0c;可能会遇到中文字符显示为方块或者乱码的问题。这是因为Matplotlib 默认使用的字体不支持中文。本文手把手带你解决这个问题。 …...

git clone阻塞问题

问题描述 git clone采用的ssh协议&#xff0c;在克隆仓库的时候&#xff0c;会经常卡一下&#xff0c;亦或是直接卡死不动。 最开始以为是公司电脑配置的问题&#xff0c;想着自己实在解决不了找it帮忙。 查阅资料发现&#xff0c;最终发现是git版本的问题&#xff0c;这个是…...

Json快速入门

引言 Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化&#xff0c;它实现了将多个数据对象组织成 为Json格式字符串&#xff0c;以及将 Json 格式字符串解析得到多个数据对象的功能&#xff0c;独立于开发语言。 Json数据对象 Json数据对象类的表示&#xff1a; …...

【QT】学习笔记1

QT概述 Qt是一个1991年由QtCompany开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器&#xff08;…...

【Kafka基础】生产者命令行操作指南:从基础到高级配置

Kafka作为分布式消息系统&#xff0c;其生产者是数据管道的起点。掌握kafka-console-producer.sh工具的使用对于开发测试和运维都至关重要。本文将系统介绍该工具的各种用法&#xff0c;帮助您高效地向Kafka发送消息。 1 基础消息生产 1.1 最简单的消息发送 /export/home/kafk…...

【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识

【Java面试系列】Spring Boot中自动配置原理与自定义Starter开发实践详解 - 3-5年Java开发必备知识 引言 Spring Boot作为Java生态中最流行的框架之一&#xff0c;其自动配置机制和Starter开发是面试中的高频考点。对于3-5年经验的Java开发者来说&#xff0c;深入理解这些原理…...

reid查找余弦相似度计算修正(二)

上一篇文章 reid查找余弦相似度计算(一) 上一篇的遗留问题就是reid 的结果部分正确&#xff0c;我们参考一下 fast-reid的demo&#xff0c;把里面的抽取特征提取出来 修改提取特征 首先发现图像改变大小的不同&#xff0c;fast 使用的是[128&#xff0c;384]&#xff0c; 如…...

嵌入式---加速度计

一、基本概念与定义 定义 加速度计&#xff08;Accelerometer&#xff09;是一种测量物体加速度&#xff08;线性加速度或振动加速度&#xff09;的传感器&#xff0c;可检测物体运动状态、振动幅度、倾斜角度等&#xff0c;输出与加速度成比例的电信号&#xff08;模拟或数字信…...

Redis如何判断哨兵模式下节点之间数据是否一致

在哨兵模式下判断两个Redis节点的数据一致性&#xff0c;可以通过以下几种方法实现&#xff1a; 一、检查主从复制偏移量 使用INFO replication命令 分别在主节点和从节点执行该命令&#xff0c;比较两者的master_repl_offset&#xff08;主节点&#xff09;和slave_repl_offs…...

Spring 核心注解深度解析:@Autowired、@Repository 与它们的协作关系

引言 在 Spring 框架中&#xff0c;​依赖注入&#xff08;DI&#xff09;​​ 是实现松耦合架构的核心机制。Autowired 和 Repository 作为两个高频使用的注解&#xff0c;分别承担着 ​依赖装配​ 和 ​数据访问层标识​ 的关键职责。本文将深入探讨它们的功能特性、协作模式…...

LeetCode541反转字符串②

思路&#xff1a; 关键是判断反转的右边界&#xff0c; ①当剩余字符数<k&#xff0c;是反转当前所有字符&#xff0c;右边界就是rightlen-1&#xff0c;不可以超过len-1&#xff0c;会越界&#xff1b; ②当剩余字符数>k且<2k,反转k个字符&#xff0c;右边界就是righ…...

Ubuntu 22 Linux上部署DeepSeek+RAG知识库操作详解(Dify方式)之2

上一篇在ubuntu上通过docker拉取了dify并启动与它相关的服务&#xff0c;本篇主要介绍两个知识点&#xff1a; 一是配置模型&#xff0c;使用之前通过Xinference搭建的本地deepseek模型&#xff0c;启动过程参考前期文档&#xff0c;这里就不做介绍了。&#xff08;注意一点&a…...

如何在多线程中安全地使用 PyAudio

1. 背景介绍 在多线程环境下使用 PyAudio 可能会导致段错误&#xff08;Segmentation Fault&#xff09;或其他不可预期的行为。这是因为 PyAudio 在多线程环境下可能会出现资源冲突或线程安全问题。 PyAudio 是一个用于音频输入输出的 Python 库&#xff0c;它依赖于 PortAu…...

Spring MVC与Spring Boot文件上传配置项对比

Spring MVC与Spring Boot文件上传配置项对比 一、Spring MVC配置项&#xff08;基于不同MultipartResolver实现&#xff09; 1. 使用 CommonsMultipartResolver&#xff08;Apache Commons FileUpload&#xff09; Bean public MultipartResolver multipartResolver() {Common…...

多类型医疗自助终端智能化升级路径(代码版.上)

大型医疗自助终端的智能化升级是医疗信息化发展的重要方向,其思维链一体化路径需要围绕技术架构、数据流协同、算法优化和用户体验展开: 一、技术架构层:分布式边缘计算与云端协同 以下针对技术架构层的分布式边缘计算与云端协同模块,提供具体编程实现方案: 一、边缘节点…...

Chrome 浏览器插件收录

1. Responsive Viewer 可以在同个窗口内&#xff0c;针对同一网站&#xff0c;添加多个不同设备屏幕显示。 在前端开发&#xff0c;需要多端适配&#xff0c;尤其是移动端响应式适配的网站开发中&#xff0c;可以同时测试多个不同屏幕的适配效果。 2. VisBug 提供工具栏&#x…...

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…...

文档大模型

处理流程&#xff1a; 对表格或者文章文档切分成chunk&#xff0c;将其存入DB根据chunk文档内容&#xff0c;通过prompt生成问题&#xff08;qwen&#xff09;通过sentencetransformer生成embbedding(Text embedding 模型 stella_large 模型&#xff0c;长文本编码), 第二步 抽…...

基于分布式指纹引擎的矩阵运营技术实践:突破平台风控的工程化解决方案

一、矩阵运营的技术痛点与市场现状 风控机制升级 主流平台通过复合指纹识别&#xff08;Canvas渲染哈希WebGL元数据AudioContext频率分析&#xff09;检测多账号关联传统方案成本&#xff1a;单个亚马逊店铺因关联封号月均损失$5000&#xff0c;矩阵规模越大风险指数级增长 …...

SpringBoot 统一功能处理

1.拦截器 1.1什么是拦截器 拦截器是Spring框架提供的核心功能之一&#xff0c;主要是用来拦截用户的请求&#xff0c;在用户请求指定的方法执行前后&#xff0c;可以根据业务需要执行实现预定的代码。 通过拦截器&#xff0c;开发人员就可以根据需求针对一些特殊的请求&#…...

Redis到底能不能做主数据库?

张三拍案而起&#xff1a;“Redis 是缓存数据库&#xff0c;怎么能当主数据库用&#xff1f;简直是天方夜谭&#xff01;” 李四冷笑回应&#xff1a;“你没用过&#xff0c;凭什么说不行&#xff1f;我已经用 Redis 做主数据库好几年了&#xff0c;系统稳定得像铁板一块&…...

C++ 基础进阶

C 基础进阶 内容概述&#xff1a; 函数重载&#xff1a;int add(int x, inty);&#xff0c;long long add(long long x, long long y);&#xff0c;double add(double x, double y);模板函数&#xff1a;template<typename T> 或 template<class T>结构体&#x…...

从C语言到Go语言:新手快速入门指南

对于刚学会C语言的新手来说&#xff0c;学习Go语言&#xff08;Golang&#xff09;可能是一个既有趣又有挑战性的过程。Go语言由Google开发&#xff0c;以简洁、高效和并发支持著称&#xff0c;被广泛用于现代软件开发。相比C语言&#xff0c;Go语言在语法上更加现代化&#xf…...

Vue.js 中 v-model 的使用及其原理

在 Vue.js 开发中&#xff0c;v-model是一个非常重要且常用的指令。它极大地简化了表单元素与数据之间的双向绑定操作&#xff0c;让开发者能够更高效地处理用户输入和数据更新。接下来&#xff0c;我们将深入探讨v-model的使用场景及其背后的工作原理。​ 一、v-model 的基本…...

深入解析哈希表:从原理到实现(拉链法详解)

哈希表&#xff08;Hash Table&#xff09;是计算机科学中最重要的数据结构之一&#xff0c;它能够在平均 O(1) 时间内完成数据的插入、删除和查找操作。本文将围绕**拉链法&#xff08;Chaining&#xff09;**的实现&#xff0c;结合代码示例和图示&#xff0c;深入讲解哈希表…...

okcc呼叫中心系统坐席签入长签和普通签入的区别

在OKCC呼叫中心系统中&#xff0c;坐席的长签&#xff08;持久签入&#xff09;与普通签入&#xff08;常规签入&#xff09;是两种不同的登录模式&#xff0c;主要区别体现在 会话保持时长、资源占用、业务场景适配性 等方面。以下是具体对比&#xff1a; 一、核心区别对比 维…...

2024年博客之星的省域空间分布展示-以全网Top300为例

目录 前言 一、2024博客之星 1、所有排名数据 2、空间属性管理 二、数据抓取与处理 1、相关业务表的设计 2、数据抓取处理 3、空间查询分析实践 三、数据成果挖掘 1、省域分布解读 2、技术开发活跃 四、总结 前言 2024年博客之星的评选活动已经过去了一个月&#xf…...

7.3 在通知中显示图片或视频(UNNotificationAttachment)

在iOS通知中显示富媒体内容可以显著提升用户体验。通过UNNotificationAttachment&#xff0c;我们可以为本地和远程通知添加图片、音频、视频等内容。 基本实现方法 1. 创建带附件的通知 func scheduleNotificationWithImage() {// 1. 创建通知内容let content UNMutableNo…...

1.5-APP的架构\微信小程序的架构

1.5-APP的架构\微信小程序的架构 APP的三种开发架构&#xff1a; 原生态APP类型 APP-开发架构-原生态-IDEA 演示&#xff1a;remusic项目源码 NP管理器&#xff1a; http://normalplayer.top/ HttpCanary&#xff1a;https://github.com/mingww64/HttpCanary-SSL-Magisk 安全影…...

Python缩进完全指南:语法规则、使用场景与最佳实践

一、Python缩进的核心概念 Python的缩进不仅是代码风格问题&#xff0c;更是语法的一部分&#xff0c;这是Python区别于其他编程语言最显著的特征之一。 1.1 什么是缩进&#xff1f; 缩进是指在代码行前添加空格或制表符来实现代码块的层级结构。在Python中&#xff0c;缩进…...

高通音频数据从HAL到DSP

概述 参考高通平台8155 从数据流的角度整理下安卓平台音频数据从HAL层到达DSP这个流程; 以 MultiMedia22 --> QUIN_TDM_RX_0 播放为例; 主要关注pcm数据写到dsp, 以及将前后端路由信息告知dsp两个点。 <!-- more --> [Platform:高通 8155 gvmq Android 11] [Ker…...

第六天 开始Unity Shader的学习之Unity中的基础光照之漫反射光照模型

Unity Shader的学习笔记 第六天 开始Unity Shader的学习之Unity中的基础光照之漫反射光照模型 文章目录 Unity Shader的学习笔记前言一、漫反射光照模型1.逐像素光照① 更改v2f② 传递法线信息给片元着色器③ 片元着色器计算漫反射光照模型 二.半兰伯特模型总结 前言 提示&am…...

【RabbitMQ】队列模型

1.概述 RabbitMQ作为消息队列&#xff0c;有6种队列模型&#xff0c;分别在不同的场景进行使用&#xff0c;分别是Hello World&#xff0c;Work queues&#xff0c;Publish/Subscribe&#xff0c;Routing&#xff0c;Topics&#xff0c;RPC。 下面就分别对几个模型进行讲述。…...

【Java设计模式】第3章 软件设计七大原则

3-1 本章导航 学习开辟原则(基础原则)依赖倒置原则单一职责原则接口隔离原则迪米特法则(最少知道原则)里氏替换原则合成复用原则(组合复用原则)核心思想: 设计原则需结合实际场景平衡,避免过度设计。设计模式中可能部分遵循原则,需灵活取舍。3-2 开闭原则讲解 定义 软…...

Axure中继器(Repeater): 列表展示

文章目录 引言I 中继器说明中继器的作用中继器的结构中继器例子II 中继器基础应用:列表展示表头制作列表内容表头中的列与中继器的列绑定填充数据内容引言 中继器是Axure RP 7.0推出的新功能,用于快速设计一些复杂的交互界面(制作“高保真”的动态原型)。 I 中继器说明 中…...

mybatis的第五天学习笔记

12. 动态SQL 12.1 动态SQL概述 新增内容&#xff1a; 动态SQL执行流程 MyBatis如何解析动态SQLSQL语句构建过程参数绑定机制 新增示例 // 动态条件查询接口示例 List<User> searchUsers(Param("name") String name,Param("age") Integer age,Para…...

LeetCode 941 有效的山脉数组

算法探索&#xff1a;如何精准判断有效山脉数组 在计算机科学领域&#xff0c;算法和数据结构堪称基石&#xff0c;它们不仅是解决复杂问题的有力工具&#xff0c;更是衡量程序员技术水平的重要指标。数组作为最基础、应用最广泛的数据结构之一&#xff0c;围绕它衍生出了大量…...

java设计模式-单例模式

单例模式 1、饿汉式(静态常量) Slf4j public class SingletonTest01 {public static void main(String[] args) {Singleton singleton Singleton.getInstance();Singleton singleton2 Singleton.getInstance();log.info("比对结果&#xff1a;{}",singletonsingl…...

对抗Prompt工程:构建AI安全护栏的攻防实践

大语言模型的开放性与自然语言交互特性使其面临前所未有的Prompt工程攻击威胁。本文通过分析2021-2023年间157个真实越狱案例&#xff0c;揭示语义混淆、上下文劫持、多模态组合三重攻击路径的技术原理&#xff0c;提出融合动态意图拓扑分析&#xff08;DITA&#xff09;、对抗…...

CentOS 环境下 MySQL 数据库全部备份的操作指南

最近阿里云个人服务到期&#xff0c;因为是很久之前买的测试机器&#xff0c;配置较低&#xff0c;上面运行的有技术博客 和以往的测试项目&#xff0c;所以准备放弃掉。 需要备份下上面的表结构和数据、以及代码仓库。 下面是一个完整的 CentOS 环境下 MySQL 数据库全部备份…...

回溯算法补充leetcode

1. 组合 leetcode题目链接&#xff1a;77. 组合 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 示…...

利用 AI 实现雷池 WAF 自动化运维

欢迎加入雷池社区&#xff1a;雷池 WAF | 下一代 Web 应用防火墙 | 免费使用 已经升级到 8.4.0 的兄弟们应该会发现雷池又多了一些 AI 能力&#xff0c;8.4.0 更新公告。 感谢 Web2GPT 为雷池提供的 AI 能力支持。 主要变化 右下角多了一个 AI 小助手 按钮右上角多了一个 连…...

【嵌入式面试】

1、如果中断函数中有耗时较长的内容&#xff0c;会导致以下问题&#xff0c;如何解决&#xff1f; 对系统实时性的影响 阻塞低优先级中断&#xff1a;中断函数执行时间过长&#xff0c;会阻塞其他低优先级中断的响应。例如&#xff0c;如果一个高优先级中断处理程序中包含耗时…...

【Hadoop入门】Hadoop生态之HDFS

1 HDFS核心设计原理 HDFS&#xff08;Hadoop Distributed File System&#xff09;是专为大规模数据存储设计的分布式文件系统&#xff0c;其核心设计基于以下原则&#xff1a; 数据分块与分布式存储&#xff1a; 分块机制&#xff1a;文件被切分为固定大小的数据块&#xff08…...