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

springboot实现调用百度ocr实现身份识别+二要素校验

一、技术选型

OCR服务:推荐使用百度AI

二、实现

1.注册一个服务

百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_=1742309417611

填写完之后可以获取到app-idapiKeySecretKey这三个后面文件配置会用到

2、导入依赖

        <!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.6.13</version></dependency><!-- 百度AI SDK(示例) --><dependency><groupId>com.baidu.aip</groupId><artifactId>java-sdk</artifactId><version>4.16.13</version></dependency><!--json依赖--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.40</version></dependency>

3、配置文件

spring:servlet:multipart:max-request-size: 10MB # 文件上传最大值max-file-size: 10MB # 单个文件最大值
baidu:ai:app-id: ***** 换成自己的secret-key: ***** 换成自己的api-key: ***** 换成自己的

4、编写OCR工具类

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.util.HashMap;
import java.util.Map;@Component
public class OcrService {@Value("${baidu.ai.app-id}")private String appId;@Value("${baidu.ai.api-key}")private String apiKey;@Value("${baidu.ai.secret-key}")private String secretKey;public Map<String, String> recognizeIdCard(MultipartFile file, boolean isFront) throws Exception {AipOcr client = new AipOcr(appId, apiKey, secretKey);// 读取图片字节byte[] imgData = file.getBytes();// 设置身份证正反面String idCardSide = isFront ? "front" : "back";// 设置其他识别选项(如果有)HashMap<String, String> options = new HashMap<String, String>();// 可以在这里添加其他选项,例如:// options.put("detect_direction", "true"); // 检测图像朝向// 调用身份证识别接口JSONObject res = client.idcard(imgData, idCardSide, options);// 检查返回结果if (res == null || !res.has("words_result")) {throw new Exception("OCR 识别失败: 返回结果为空或不包含 words_result");}// 解析结果Map<String, String> result = new HashMap<String, String>();JSONObject words = res.getJSONObject("words_result");// 根据正反面提取不同字段if (isFront) {result.put("姓名", words.optString("姓名", ""));result.put("性别", words.optString("性别", ""));result.put("民族", words.optString("民族", ""));result.put("出生日期", words.optString("出生年月日", ""));result.put("住址", words.optString("住址", ""));result.put("身份证号", words.optString("公民身份号码", ""));} else {result.put("签发机关", words.optString("签发机关", ""));result.put("有效期限", words.optString("失效日期", ""));}return result;}
}

5、文件上传接口

import com.alibaba.fastjson.JSON;
import com.cykj.service.OcrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("/api/idcard")
/*** 身份证识别控制器* 提供身份证图片上传和识别功能*/
public class IdCardController {@Autowiredprivate OcrService ocrService;/*** 上传身份证图片并进行识别* * @param frontFile 身份证正面图片* @param backFile 身份证反面图片* @return 身份证信息的Map,包括正面和反面的识别结果*/@PostMapping("/upload")public ResponseEntity<?> uploadIdCard(@RequestParam("frontFile") MultipartFile frontFile,@RequestParam("backFile") MultipartFile backFile) {System.out.println(frontFile);System.out.println(backFile);try {// 识别正面信息Map<String, String> frontInfo = ocrService.recognizeIdCard(frontFile, true);System.out.println("Front Info: " + frontInfo);// 识别反面信息Map<String, String> backInfo = ocrService.recognizeIdCard(backFile, false);System.out.println("Back Info: " + backInfo);// 合并结果Map<String, String> combined = new HashMap<String, String>();combined.putAll(frontInfo);combined.putAll(backInfo);// 身份证校验(示例)String idNumberJson = combined.get("身份证号");//解析获取身份证号com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(idNumberJson);String idNumber = jsonObject.getString("words");if (!validateIdCard(idNumber)) {return ResponseEntity.badRequest().body("身份证号校验失败");}return ResponseEntity.ok(combined);} catch (Exception e) {e.printStackTrace();return ResponseEntity.status(500).body("识别失败: " + e.getMessage());}}/*** 简单身份证号校验(正则表达式)* * @param idNumber 身份证号码字符串* @return 校验通过返回true,否则返回false*/private boolean validateIdCard(String idNumber) {String regex = "^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$";return idNumber != null && idNumber.matches(regex);}
}

三、前端写个测试页面

这边的action路径要改成自己的路径

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="http://localhost:8086/api/idcard/upload" method="post" enctype="multipart/form-data"><input type="file" name="frontFile" accept="image/*" required><input type="file" name="backFile" accept="image/*" required><button type="submit">上传并识别</button>
</form>
</body>
</html>

第一张为身份证正面(人)

第二张上传为身份证反面(国徽那面)

测试成功在页面和控制台都可以看见自己提取出来的信息就成功啦!

四、二要素校验

身份证上传也不能保证信息准确,毕竟还可以进行p图技术进行修改嘛

为了保证信息的正确,就得要引入二要素校验==》对姓名和身份证号码进行校验

(1)配置

https://www.apispace.com/explore/service

打开网址

首次购买有20次的免费使用!!! ,购买完如下~

往下滑可以看见主要的代码

(2)代码实现

/*** 二要素校验* @param idNumber 身份证* @param realname 姓名* @return true则为一致,匹配正确* @throws IOException*/private boolean validateIdCardAndName(String idNumber, String realname) throws IOException {// 示例:判断身份证号和姓名是否匹配OkHttpClient client = new OkHttpClient();//校验身份和姓名是否匹配 ==》二要素校验RequestBody body = RequestBody.create(okhttp3.MediaType.get("application/x-www-form-urlencoded"),"realname=" + realname + "&idcard=" + idNumber);//下面的addHeader和url都可以在上面购买完可以看见信息Request request = new Request.Builder().url("换成自己的!!!!!!!!!!").method("POST", body).addHeader("X-APISpace-Token", "换成自己的!!!!!!!!!!").build(); // 移除重复的 Content-Type 头Response response = client.newCall(request).execute();//System.out.println(response.body().string());//打印出来的{"requestId":"f20067dac6633685bd348f9e388b","data":{"valid":false,"incorrect":101,"message":"不一致"},"code":0,"message":"success"}if (response.code() != 200) {return false;}if (response.body() == null) {return false;}try {JSONObject responseJson = JSON.parseObject(response.body().string());if (responseJson.containsKey("data") && responseJson.getJSONObject("data").containsKey("message")) {JSONObject dataJson = responseJson.getJSONObject("data");String dataMessage = dataJson.getString("message");return "一致".equals(dataMessage);} else {System.out.println("响应缺少必要字段");return false;}} catch (Exception e) {e.printStackTrace();return false;}}

// 获取姓名String nameInfo = combined.get("姓名");JSONObject nameJson = JSON.parseObject(nameInfo);String realname = nameJson.getString("words");//校验姓名和身份证是否匹配boolean validateIdCardAndName = validateIdCardAndName(idNumber, realname);if (!validateIdCardAndName){//说明当前身份证于当前姓名不匹配return ResponseEntity.badRequest().body("姓名和身份不匹配,请检查填写信息是否正确");}

完事~

相关文章:

springboot实现调用百度ocr实现身份识别+二要素校验

一、技术选型 OCR服务&#xff1a;推荐使用百度AI 二、实现 1.注册一个服务 百度智能云控制台https://console.bce.baidu.com/ai-engine/ocr/overview/index?_1742309417611 填写完之后可以获取到app-id、apiKey、SecretKey这三个后面文件配置会用到 2、导入依赖 <!-- …...

MATLAB 控制系统设计与仿真 - 28

MATLAB状态空间控制系统分析 - 极点配置 就受控系统的控制律的设计而言,由状态反馈极点配置和输出反馈极点配置。 状态反馈极点配置问题就是:通过状态反馈矩阵K的选取,使闭环系统的极点,即(A-BK)的特征值恰好处于所希望的一组给定闭环极点的位置。 另外,线性定常系统可…...

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…...

加速还是安全?CDN与群联云防护的本质差异与适用场景

一、核心功能定位对比 维度传统CDN群联云防护核心目标内容加速&#xff08;降低延迟、提升访问速度&#xff09;安全防护&#xff08;抵御DDoS/CC攻击、隐藏源站&#xff09;技术重心缓存优化、边缘节点分发流量清洗、AI行为分析、加密隧道主要能力静态资源缓存、负载均衡攻击…...

简单理解机器学习中top_k、top_p、temperature三个参数的作用

在机器学习中&#xff0c;top_k、top_p 和 temperature 是用于控制生成模型&#xff08;如语言模型&#xff09;输出质量的参数&#xff0c;尤其在文本生成任务中常见。然而&#xff0c;网上文章很多很全&#xff0c;但大多晦涩难懂&#xff0c;今天我们来用最简单的语言谈谈它…...

Java面试黄金宝典6

1. 什么是 CAS 原理&#xff1a; CAS &#xff08;Compare-And-Swap&#xff09;是一种硬件级别的原子操作指令&#xff0c;在 Java 并发编程中常被用于实现无锁算法。其核心逻辑是&#xff1a;在进行数据更新时&#xff0c;会先将内存位置 V 的值与预期原值 A 进行比较&#x…...

【深度学习新浪潮】AI ISP技术与手机厂商演进历史

本文是关于AI ISP(人工智能图像信号处理器)的技术解析、与传统ISP(图像信号处理器)的区别、近三年研究进展,以及各大手机厂商在该领域演进历史的详细报告。本报告综合多个权威来源的信息,力求全面、深入地呈现相关技术发展脉络与行业动态。 第一部分:AI ISP的定义及与传…...

C语言基础08

内容提要 数组 排序算法&#xff1a;冒泡排序 二维数组 字符数组 数组 冒泡排序 排序思想&#xff08;向前冒泡&#xff09; 一次只排好一个数&#xff0c;针对n个数&#xff0c;最差情况需要n-1次就可以排好 每次排序假定第一个元素是最大或者最小&#xff0c;用第一个…...

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法

基于Arm GNU Toolchain编译生成的.elf转hex/bin文件格式方法 已经弃用的版本&#xff08;Version 10.3-2021.10&#xff09;&#xff1a;gcc-arm-none-eabi&#xff1a;https://developer.arm.com/downloads/-/gnu-rmArm GNU Toolchain当前版本&#xff1a;https://developer.a…...

1.angular介绍

初級使用视频添加链接描述 angular工具 angular.module(‘名’, [依赖模块]) 模块 angular.bind(*) : 修改this指向 angualr.copy() // a angular.copy(a, b) —a完全覆盖了b,c就是a angular.extend(a, b) a里面集成了b属性 angular.isArray angular.isDate angular.isDefin…...

java项目40分钟后token失效问题排查(40分钟后刷新页面白屏)

项目40分钟后token失效问题排查&#xff08;40分钟后刷新页面白屏&#xff09; 经过我 对比失效前token 可以正常访问接口&#xff0c;失效后的token 不能访问系统&#xff0c; 得出结论&#xff0c;我系统对接第三方 sso 系统&#xff0c;token 失效时间 在他们那边配置&…...

音频进阶学习二十——DFT离散傅里叶变换

文章目录 前言一、FT、FS、DTFT、DFS1.FT和FS2.DTFT和DFS 二、DFT定义1.对于DFT的理解1&#xff09;DTFT和DFT2&#xff09;DFS和DFT3&#xff09;有限长序列和周期序列 2.圆周卷积1&#xff09;线性卷积2&#xff09;圆周卷积 三、频率采样和插值恢复1.频率采样的影响2.频率采…...

【Rust】集合的使用——Rust语言基础16

文章目录 1. 前言2. Vector2.1. 构建一个 vector2.2. 获取 vector 中的元素2.3. 遍历 vector2.4. 使用枚举来储存多种类型 3. String3.1. 新建字符串3.2. 更新字符串3.3. 字符串的内部结构3.3.1. 字符串如何访问内部元素&#xff1f;3.3.2. 字节、标量值和字形簇 3.4. 字符串 s…...

centos 7 部署ftp 基于匿名用户

在 CentOS 7 上搭建基于匿名用户的 FTP 服务&#xff0c;可按以下步骤进行&#xff1a; 1. 安装 vsftpd 服务 vsftpd 是一款常用的 FTP 服务器软件&#xff0c;可使用以下命令进行安装&#xff1a; bash sudo yum install -y vsftpd2. 启动并设置开机自启 vsftpd 服务 bash …...

Apache SeaTunnel脚本升级及参数调优实战

最近作者针对实时数仓的Apache SeaTunnel同步链路&#xff0c;完成了双引擎架构升级与全链路参数深度调优&#xff0c;希望本文能够给大家有所启发&#xff0c;欢迎批评指正&#xff01; Apache SeaTunnel 版本 &#xff1a;2.3.9 Doris版本&#xff1a;2.0.6 MySQL JDBC Conne…...

算法 | 优化算法比较

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 优化算法 ‌一、主流优化算法分类‌1‌、传统梯度类算法‌2‌、启发式算…...

破局 MySQL 死锁:深入理解锁机制与高效解决方案

死锁的原理 1. 什么是死锁&#xff1f; 当 多个事务 在并发执行时&#xff0c;每个事务都 持有其他事务需要的锁&#xff0c;同时又在 等待对方释放锁&#xff0c;导致所有事务都无法继续执行的状态&#xff0c;称为 死锁&#xff08;Deadlock&#xff09;。 2. 死锁的四个必要…...

学习记录-cssjs-综合复习案例(二)

目录 商城复合案例功能实现&#xff08;二&#xff09;商城首页实现步骤1.准备工作2. 搭建html框架3. 编写js代码 完整实例代码完整项目心得 商城复合案例功能实现&#xff08;二&#xff09; 使用html&#xff0c;css&#xff0c;基于bootstrap框架以及媒体查询搭建响应式布局…...

使用 JDBC 插入数据并获取自动生成的主键(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代码,包含详细注释

以下是使用 JDBC 插入数据并获取自动生成的主键&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代码&#xff0c;包含详细注释&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 数据库连接参数private static final St…...

图解AUTOSAR_CP_EEPROM_Abstraction

AUTOSAR EEPROM抽象模块详细说明 基于AUTOSAR标准的EEPROM抽象层技术解析 目录 1. 概述 1.1 核心功能1.2 模块地位2. 架构概览 2.1 架构层次2.2 模块交互3. 配置结构 3.1 主要配置容器3.2 关键配置参数4. 状态管理 4.1 基本状态4.2 状态转换5. 接口设计 5.1 主要接口分类5.2 接…...

汇川EASY系列之以太网通讯(MODBUS_TCP做从站)

汇川easy系列PLC做MODBUS_TCP从站,不需要任何操作,但是有一些需要知道的东西。具体如下: 1、汇川easy系列PLC做MODBUS_TCP从站,,ModbusTCP服务器默认开启,无需设置通信协议(即不需要配置),端口号为“502”。ModbusTCP从站最多支持31个ModbusTCP客户端(ModbusTCP主站…...

QT 图表(拆线图,栏状图,饼状图 ,动态图表)

效果 折线图 // 创建折线数据系列// 创建折线系列QLineSeries *series new QLineSeries;// series->append(0, 6);// series->append(2, 4);// series->append(3, 8);// 创建图表并添加系列QChart *chart new QChart;chart->addSeries(series);chart->setTit…...

基于vue框架的在线影院系统a079l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,电影,电影类别,电影库 开题报告内容 基于Vue框架的在线影院系统开题报告 一、研究背景与意义 随着文化娱乐产业的蓬勃发展&#xff0c;电影院作为人们休闲消遣的重要场所&#xff0c;其管理效率和服务质量直接影响着顾客的观影体…...

vscode/cursor中python运行路径设置 模块导入问题

vscode/cursor中python运行路径设置 ## 文件路径设置 问题描述 pycharm的项目用cursor运行&#xff0c;出现目录找不到 后来利用 os.getcwd()&#xff0c;经过打印调试发现是IDE的本身配置问题 pycharm中&#xff0c;os.getcwd()默认打开当前脚本所在目录 vscode/cursor中…...

OpenCV图像拼接(1)概述

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此图说明了在Stitcher类中实现的拼接模块流程。使用该类&#xff0c;可以配置/移除某些步骤&#xff0c;即根据特定需求调整拼接流程。流程中的所…...

NFS 安装与测试

NFS 安装与测试 服务器 # NFS 共享目录 mkdir -p ${HOME}/Share/nfs && sudo chown -R nobody:nogroup ${HOME}/Share/nfs# 安装 NFS Server sudo apt install nfs-kernel-server# 配置 NFS 目录 sudo cp -arf /etc/exports /etc/exports.bak sudo tee -a /etc/exports…...

深度学习与传统算法在人脸识别领域的演进:从Eigenfaces到ArcFace

一、传统人脸识别方法的发展与局限 1.1 Eigenfaces&#xff1a;主成分分析的经典实践 算法原理 Eigenfaces是基于主成分分析&#xff08;PCA&#xff09;的里程碑式方法。其核心思想是将人脸图像视为高维向量&#xff0c;通过协方差矩阵计算特征向量&#xff08;即特征脸&…...

基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着信息时代的来临&#xff0c;过去的学科竞赛管理方式的缺点逐渐暴露&#xff0c;本次对过去的学科竞赛管理方式的缺点进行分析&#xff0c;采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献&#xff0c;研究国内外相关技术&#xff0c;提出了一种关于竞赛信息…...

【嵌入式学习】触发器 - ADC - DAC

# 触发器 基本概念&#xff1a;一种能够存储一位二进制信息的数字逻辑电路&#xff0c;其输出不仅取决于当前输入&#xff0c;还与之前的状态有关。 常见触发器类型&#xff1a; ①RS触发器&#xff1a;最基本的双稳态电路&#xff0c;包含两个输入&#xff08;置位S和复位R&…...

[特殊字符][特殊字符][特殊字符][特殊字符][特殊字符][特殊字符]壁紙 流光染墨,碎影入梦

#Cosplay #&#x1f9da;‍♀️Bangni邦尼&#x1f430;. #&#x1f4f7; 穹妹 Set.01 #后期圈小程序 琼枝低垂&#xff0c;霜花浸透夜色&#xff0c;风起时&#xff0c;微光轻拂檐角&#xff0c;洒落一地星辉。远山隐于烟岚&#xff0c;唯余一抹青黛&#xff0c;勾勒出天光水…...