百度OCR:证件识别
目录
一、编写目的
二、准备工作
2.1 OCR密钥
三、代码实现
3.1 配置文件
3.2 请求接收封装
3.3 请求响应封装
3.4 服务类参数初始化
3.5 服务类实现
3.6 解析结果
3.7 定义Web接口
四 测试效果
五、总结
欢迎来到盹猫🐱的博客
本篇文章主要介绍了
[百度OCR:证件识别]
❤博主广交技术好友,喜欢文章的可以关注一下❤
一、编写目的
本篇文章是记录SpringBoot调用百度OCR识别身份证和银行卡信息服务接口的实现步骤,通过测试,识别速度快,识别信息准确。该功能可以用在方便用户认证、注册、用户信息更新等方面,为方便日后使用和查询,在这里对实现流程进行记录,希望可以帮到有需要的开发者。
二、准备工作
2.1 OCR密钥
可以在OCR文字识别_免费试用_图片转文字-百度AI开放平台 进行账号的注册,如果已经有账号可以直接登录。点击立即使用进入百度控制台,开通[身份证识别]和[银行卡识别]两个功能:
这里有1000次的免费使用,当然付费该功能也很便宜。
在应用列表功能中,单击创建一个应用,创建一个包含OCR识别功能的应用,当然可以选取全部功能,这样所有功能就都可以使用了。
在应用列表中复制已创建应用的AppID、APIKey、Secret Key,在后续的application.yml配置文件中需要用到。
三、代码实现
3.1 配置文件
创建一个基础的SpringBoot项目,并在配置文件中将已申请的AppID、APIKey、Secret Key 添加到application.yml文件(没有则在resources目录下进行创建)中,由于百度是通过access_token进行接口调用,在这里将access_token的获取地址和OCR功能请求地址一并配置,具体内容如下:
baidu:app_id: APPIDapi_key: API_KEYsecret_key: SECRET_KEYaccess_token_url: https://aip.baidubce.com/oauth/2.0/tokenocr:base_url: https://aip.baidubce.com/rest/2.0/ocr/v1
3.2 请求接收封装
要实现的功能是用户可以对请求的识别的实体卡进行指定,同时可以指定识别正面和反面,所以这边先定期请求数据的接收(也就是接收POST的JSON数据),实体内容如下:
package com.uav.models;import com.uav.common.validator.group.UpdateGroup;
import lombok.Data;import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;@Data
public class BaiduOcrRequestDTO {/**正反面*/@Pattern(regexp = "^(front|back)$",message = "side 只能是 'front' 或 'back'",groups = UpdateGroup.class) // 可选:分组校验private String side;@NotEmpty(message = "图片url不能为空")private String url;@Pattern(regexp = "^(idcard|bankcard)$",message = "type 只能是 'idcard' 或 'bankcard'",groups = UpdateGroup.class)private String type;
}
3.3 请求响应封装
返回的数据可能是身份证,也可能是银行卡,所以这边需要定义两个请求响应的封装,内容如下:
银行卡响应
package com.uav.models;import lombok.Data;@Data
public class BankCardDTO {private String validDate; // 有效期private String bankCardNumber; // 银行卡号private String bankName; // 银行名称private int bankCardType; // 卡类型private String holderName; // 持卡人姓名
}
身份证响应
package com.uav.models;import lombok.Data;@Data
public class OcrIdCardDTO {private String name; // 姓名private String nation; // 民族private String address; // 住址private String idNumber; // 公民身份号码private String birthDate; // 出生日期private String gender; // 性别// 反面信息private String expiryDate; // 失效日期private String issuingAuthority; // 签发机关private String issueDate; // 签发日期
}
3.4 服务类参数初始化
因为请求有两个类型,先进行识别类型枚举RecognizeType的定义,它可以在代码编写过程中减少硬编码,增加可维护性,内容如下:
/*** 支持的识别类型枚举*/public enum RecognizeType {IDCARD("idcard"),BANKCARD("bankcard");private final String type;RecognizeType(String type) {this.type = type;}public String getType() {return type;}/*** 根据类型字符串获取枚举值** @param type 类型字符串* @return 对应的枚举值,如果不存在则抛出异常*/public static RecognizeType fromString(String type) {for (RecognizeType recognizeType : values()) {if (recognizeType.getType().equalsIgnoreCase(type)) {return recognizeType;}}throw new IllegalArgumentException("不支持的识别类型: " + type);}}
同样的,我们需要用到Http请求,这里使用OKhttpClient进行请求,同时将之前定义的参数通过@Value进行注入,内容如下:
@Value("${baidu.api_key}")private String API_KEY;@Value("${baidu.secret_key}")private String SECRET_KEY;@Value("${baidu.access_token_url}")private String ACCESS_TOKEN_URL;@Value("${baidu.ocr.base_url}")private String ORC_BASE_URL;// 使用 final 确保线程安全,并在 @PostConstruct 中初始化private OkHttpClient httpClient;/*** 初始化 OkHttpClient 实例*/@PostConstructpublic void init() {httpClient = new OkHttpClient.Builder().readTimeout(300, TimeUnit.SECONDS).build();}
3.5 服务类实现
在服务类的实现时,需要先获取百度的access_token然后进行OCR接口的请求,所以这里先定义一个获取access_token的方法,内容如下:
private String getAccessToken() throws IOException {RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"),"grant_type=client_credentials&client_id=" + API_KEY + "&client_secret=" + SECRET_KEY);Request request = new Request.Builder().url(ACCESS_TOKEN_URL).post(body).addHeader("Content-Type", "application/x-www-form-urlencoded").build();try (Response response = httpClient.newCall(request).execute()) {if (!response.isSuccessful()) {log.error("获取访问令牌失败,状态码: {}, 响应: {}", response.code(), response.body() != null ? response.body().string() : "null");throw new SysException("获取访问令牌失败,状态码: " + response.code());}String responseBody = Objects.requireNonNull(response.body()).string();JSONObject jsonResponse = JSON.parseObject(responseBody);if (!jsonResponse.containsKey("access_token")) {log.error("访问令牌响应中缺少 access_token 字段: {}", responseBody);throw new SysException("访问令牌响应格式错误");}return jsonResponse.getString("access_token");} catch (Exception e) {log.error("获取访问令牌过程中发生错误", e);throw new SysException("获取访问令牌失败,请重试!", e);}}
然后开始编写识别图片方法,该方法的接收参数为一个请求封装的参数,即上面定义的BaiduOcrRequestDTO,内容如下:
@Overridepublic Object recognizeImage(BaiduOcrRequestDTO requestDTO) throws IOException {try {// 获取访问令牌String accessToken = getAccessToken();// 构建请求 URL 和 BodyString requestUrl = buildRequestUrl(requestDTO.getType(), accessToken);String bodyContent = buildRequestBody(requestDTO);RequestBody body = RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), bodyContent);// 构建请求Request request = new Request.Builder().url(requestUrl).post(body).addHeader("Content-Type", "application/x-www-form-urlencoded").addHeader("Accept", "application/json").build();// 发送请求并获取响应Response response = httpClient.newCall(request).execute();if (!response.isSuccessful()) {log.error("OCR 请求失败,状态码: {}, 响应: {}", response.code(), response.body() != null ? response.body().string() : "null");throw new SysException("OCR 请求失败,状态码: " + response.code());}String result = Objects.requireNonNull(response.body()).string();log.debug("OCR 响应结果: {}", result);// 解析结果return new OcrParser().parseCardInfo(result, requestDTO.getType(), requestDTO.getSide());} catch (Exception e) {log.error("OCR 识别过程中发生错误,请求数据: {}", requestDTO, e);throw new SysException("OCR 识别失败,请重试!", e);}}
3.6 解析结果
百度OCR返回的为json字符串,但是其中有很多并不需要的信息,这样返回到前端并不利用阅读和解析,同时占用大量带宽,所以这里使用自定义的OcrParser 工具类对响应的数据进行解析,将其转换为上面提到的请求响应参数格式,内容如下:
package com.uav.common.util;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.uav.common.exception.SysException;
import com.uav.models.BankCardDTO;
import com.uav.models.OcrIdCardDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;/*** OCR 解析工具类,用于解析身份证和银行卡信息。*/
@Slf4j
public class OcrParser {/*** 识别类型枚举*/public enum CardType {IDCARD("idcard"),BANKCARD("bankcard");private final String type;CardType(String type) {this.type = type;}public String getType() {return type;}/*** 根据类型字符串获取枚举值** @param type 类型字符串* @return 对应的枚举值,如果不存在则抛出异常*/public static CardType fromString(String type) {for (CardType cardType : values()) {if (cardType.getType().equalsIgnoreCase(type)) {return cardType;}}throw new IllegalArgumentException("不支持的识别类型: " + type);}}/*** 解析卡片信息** @param cardJson JSON 字符串* @param type 识别类型("idcard" 或 "bankcard")* @param side 仅对身份证有效,"front" 表示正面,其他表示反面* @return 解析后的 DTO 对象* @throws SysException 如果解析失败*/public Object parseCardInfo(String cardJson, String type, String side) {try {JSONObject root = JSON.parseObject(cardJson);CardType cardType = CardType.fromString(type);switch (cardType) {case IDCARD:return parseIdCardInfo(root, side);case BANKCARD:return parseBankCardInfo(root);default:throw new SysException("不支持的识别类型: " + type);}} catch (IllegalArgumentException e) {throw new SysException("不支持的识别类型: " + type, e);} catch (Exception e) {log.error("解析卡片信息失败,JSON: {}, 类型: {}, 方向: {}", cardJson, type, side, e);throw new SysException("识别解析格式错误,请重新尝试!", e);}}/*** 解析身份证信息** @param root JSON 根对象* @param side "front" 表示正面,其他表示反面* @return OcrIdCardDTO 对象* @throws SysException 如果解析失败*/private OcrIdCardDTO parseIdCardInfo(JSONObject root, String side) throws SysException {JSONObject wordsResult = root.getJSONObject("words_result");if (wordsResult == null) {throw new SysException("JSON 中缺少 'words_result' 字段");}OcrIdCardDTO idCardInfo = new OcrIdCardDTO();if (StringUtils.equalsIgnoreCase(side, "front")) {parseFrontSide(wordsResult, idCardInfo);} else {parseBackSide(wordsResult, idCardInfo);}return idCardInfo;}/*** 解析身份证正面信息** @param wordsResult JSON 中的 words_result 对象* @param idCardInfo 目标 DTO 对象* @throws SysException 如果解析失败*/private void parseFrontSide(JSONObject wordsResult, OcrIdCardDTO idCardInfo) throws SysException {try {idCardInfo.setName(getWord(wordsResult, "姓名"));idCardInfo.setNation(getWord(wordsResult, "民族"));idCardInfo.setAddress(getWord(wordsResult, "住址"));idCardInfo.setIdNumber(getWord(wordsResult, "公民身份号码"));idCardInfo.setBirthDate(getWord(wordsResult, "出生"));idCardInfo.setGender(getWord(wordsResult, "性别"));} catch (Exception e) {throw new SysException("解析身份证正面信息失败", e);}}/*** 解析身份证反面信息** @param wordsResult JSON 中的 words_result 对象* @param idCardInfo 目标 DTO 对象* @throws SysException 如果解析失败*/private void parseBackSide(JSONObject wordsResult, OcrIdCardDTO idCardInfo) throws SysException {try {idCardInfo.setExpiryDate(getWord(wordsResult, "失效日期"));idCardInfo.setIssuingAuthority(getWord(wordsResult, "签发机关"));idCardInfo.setIssueDate(getWord(wordsResult, "签发日期"));} catch (Exception e) {throw new SysException("解析身份证反面信息失败", e);}}/*** 安全地从 words_result 中获取指定字段的 words 值** @param wordsResult JSON 中的 words_result 对象* @param fieldName 字段名称* @return 对应的 words 值* @throws SysException 如果字段不存在或解析失败*/private String getWord(JSONObject wordsResult, String fieldName) throws SysException {JSONObject field = wordsResult.getJSONObject(fieldName);if (field == null) {throw new SysException("缺少字段: " + fieldName);}String words = field.getString("words");if (StringUtils.isBlank(words)) {throw new SysException("字段 '" + fieldName + "' 的 words 值为空");}return words;}/*** 解析银行卡信息** @param root JSON 根对象* @return BankCardDTO 对象* @throws SysException 如果解析失败*/private BankCardDTO parseBankCardInfo(JSONObject root) throws SysException {try {JSONObject result = root.getJSONObject("result");if (result == null) {throw new SysException("JSON 中缺少 'result' 字段");}BankCardDTO bankCardDTO = new BankCardDTO();bankCardDTO.setValidDate(result.getString("valid_date"));bankCardDTO.setBankCardNumber(result.getString("bank_card_number"));bankCardDTO.setBankName(result.getString("bank_name"));bankCardDTO.setBankCardType(result.getInteger("bank_card_type"));bankCardDTO.setHolderName(result.getString("holder_name"));// 可选:对银行卡号进行脱敏处理if (StringUtils.isNotBlank(bankCardDTO.getBankCardNumber())) {bankCardDTO.setBankCardNumber(bankCardDTO.getBankCardNumber());}return bankCardDTO;} catch (Exception e) {throw new SysException("解析银行卡信息失败", e);}}/*** 对银行卡号进行脱敏处理** @param cardNumber 原始银行卡号* @return 脱敏后的银行卡号*/private String maskBankCardNumber(String cardNumber) {if (StringUtils.isBlank(cardNumber)) {return cardNumber;}// 假设银行卡号为 16-19 位,保留前4位和后4位,中间用 * 替换int length = cardNumber.length();if (length <= 8) {return "****"; // 如果长度不足,返回固定脱敏}return cardNumber.substring(0, 4) + "****" + cardNumber.substring(length - 4);}
}
3.7 定义Web接口
定义一个OcrController接口,对前端页面发送的数据进行响应,直接调用已编写好的识别服务,内容如下:
package com.uav.controller.ocr;import com.uav.common.util.Result;
import com.uav.common.validator.ValidatorUtils;
import com.uav.common.validator.group.UpdateGroup;
import com.uav.models.BaiduOcrRequestDTO;
import com.uav.service.OcrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.*;@RequestMapping("/ocr")
@RestController
public class OcrController {@AutowiredOcrService ocrService;@PostMapping(value = "/idcard/recognize")public Result<Object> recognizeImage(@RequestBody BaiduOcrRequestDTO requestDTO) throws IOException {ValidatorUtils.validateEntity(requestDTO, UpdateGroup.class);return new Result<>().ok(ocrService.recognizeImage(requestDTO));}}
四 测试效果
使用Apifox测试一下接口,效果图如下:
五、总结
上述内容即为百度OCR:证件识别的全部过程了,虽然百度官方也有API示例代码,但上述代码对数据进行了更好的解析和封装。如果你需要身份证和银行卡信息识别,可以直接拿来使用。希望可以帮到你。
如果你对区块链内容感兴趣可以查看我的专栏:小试牛刀-区块链
感谢您的关注和收藏!!!!!!
相关文章:
百度OCR:证件识别
目录 一、编写目的 二、准备工作 2.1 OCR密钥 三、代码实现 3.1 配置文件 3.2 请求接收封装 3.3 请求响应封装 3.4 服务类参数初始化 3.5 服务类实现 3.6 解析结果 3.7 定义Web接口 四 测试效果 五、总结 欢迎来到盹猫🐱的博客 本篇文章主要介绍了 [百…...
纯前端实现图文识别 OCR
Tesseract.js Tesseract.js 是一个基于 Google Tesseract OCR 引擎的 JavaScript 库,利用 WebAssembly 技术将的 OCR 引擎带到了浏览器中。它完全运行在客户端,无需依赖服务器,适合处理中小型图片的文字识别。 基本使用 以下示例展示了如何…...
2025.05.01【Barplot】柱状图的多样性绘制
Custom color A few examples showing how to custom barplot color. Horizontal barchart It makes sense to make your barchart horizontal: group labels are now much easier to read 文章目录 Custom colorHorizontal barchart 探索Barplot的奥秘Barplot基础什么是Barp…...
在资源受限环境下,移动端如何实现流畅动画?如何在内存、CPU、GPU、网络等多种限制条件下,依然保持动画高帧率、低延迟、不卡顿?
在日常生活中,移动设备已经成为不可或缺的工具。从社交、购物到游戏、教育,几乎所有的应用场景都依赖于移动终端的计算和显示能力。然而,随着用户体验的不断提升需求,动画成为了界面交互中不可忽视的一环。动画不仅提升了视觉吸引…...
HJ10 字符个数统计【牛客网】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ10 字符个数统计 一、题目描述 二、测试用例 三、解题思路 基本思路: 建立字符串的散列表,然后统计不同字符个数具体思路: 遍历字符串的字…...
关键点检测算法-RTMPose
一、网络框架(top-down模式) 二、各部分内容 1、骨干网络 对于网络而言,CXPset太大,可以换成starnet 2、一个卷积层 7x7的卷积核对性能提升最大 3、一个全连接层 将一维关键点表示扩展到由超参数控制的所需维度。 4、一个用…...
云原生安全:错误策略S3存储桶ACL设置为Everyone:FullControl
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——从基础到实践的深度解析 1. 基础概念 S3存储桶与ACL Amazon S3(Simple Storage Service)是AWS提供的对象存储服务,支持存储和检索任意规模的数据。ACL(访问控制列表…...
Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…...
图漾相机错误码解析(待补充)
文章目录 1.相机错误码汇总2.常见报错码2.1 -1001报错2.1.1 没有找到相机2.1.2 SDK没有进行初始化 2.2 -1005报错2.2.1 跨网段打开相机2.2.2 旧版本SDK在软触发失败后提示的报错2.2.3 相机初始化上电时报错2.2.4 USB相机被占用 2.3 -1009报错2.3.1 相机本身不支持改属性 2.4 -1…...
SpringBoot 中文转拼音 Pinyin4j库 拼音转换 单据管理 客户管理
介绍 在客户管理系统中部分客户的名字会有生僻字为了沟通时候不叫错客户的名称,因此决定将客户名称的拼音一起返回给前端,也可以直接交给前端去处理。这里介绍后端的做法 Pinyin4j 是一个用于将汉字转换为拼音的 Java 库。在需要对中文文本进行拼音转换…...
使用 Whisper 生成视频字幕:从提取音频到批量处理
生成视频字幕是许多视频处理任务的核心需求。本文将指导你使用 OpenAI 的 Whisper 模型为视频文件(如电视剧《Normal People》或电影《花样年华》)生成字幕(SRT 格式)。我们将从提取音频开始,逐步实现字幕生成…...
Kotlin Compose Button 实现长按监听并实现动画效果
想要实现长按按钮开始录音,松开发送的功能。发现 Button 这个控件如果去监听这些按下,松开,长按等事件,发现是不会触发的,究其原因是 Button 已经提前消耗了这些事件所以导致,这些监听无法被触发。因此为了…...
SQL练习——(15/81)
目录 1.计算次日留存率 2.多条件查询 方法1:子查询 方法2:窗口函数实现 3.条件查询——自连接相关 1.计算次日留存率 550. 游戏玩法分析 IV - 力扣(LeetCode) 错误查询1:(没有考虑从首次登录日期开始…...
数据中心 智慧机房解决方案
该文档介绍数据中心智慧机房解决方案,涵盖模块化数据中心(机柜式、微模块),具备低成本快速部署、标准化建设等特点;监控管理系统(DCIM)可实现设施、资产、容量、能效管理;节能解决方案含精密空调节能控制柜,节能率高达 30%;还有7X24 小时云值守运维服务。方案亮点包括…...
网络-MOXA设备基本操作
修改本机IP和网络设备同网段,输入设备IP地址进入登录界面,交换机没有密码,路由器密码为moxa 修改设备IP地址 交换机 路由器 环网 启用Turbo Ring协议:在设备的网络管理界面中,找到环网配置选项,启用Turb…...
Docker构建 Dify 应用定时任务助手
概述 Dify 定时任务管理工具是一个基于 GitHub Actions 的自动化解决方案,用于实现 Dify Workflow 的定时执行和状态监控。无需再为缺乏定时任务支持而感到困扰,本工具可以帮助设置自动执行任务并获取实时通知,优化你的工作效率。 注意&…...
前端测试策略:单元测试到 E2E 测试
引言 在现代前端开发中,测试已成为确保应用质量和可靠性的关键环节。随着前端应用复杂度的不断提高,仅依靠手动测试已经远远不够。一个全面的前端测试策略应该包含多个层次的测试,从最小粒度的单元测试到模拟真实用户行为的端到端(E2E)测试。…...
Web漏洞扫描服务的特点与优势:守护数字时代的安全防线
在数字化浪潮中,Web应用程序的安全性已成为企业业务连续性和用户信任的核心要素。随着网络攻击手段的不断升级,Web漏洞扫描服务作为一种主动防御工具,逐渐成为企业安全体系的标配。本文将从特点与优势两方面,解析其价值与应用场景…...
大中型水闸安全监测系统解决方案
一、系统概述 水闸是重要的水利基础设施,具有防洪、挡潮、排涝、灌溉、供水、生态、航运和水力发电等综合功能,在国家水网构建、支撑经济社会高质量发展等方面具有十分重要的作用。我国水闸工程面广量大,据2021年统计数据,我国已建…...
紫光同创FPGA实现AD9238数据采集转UDP网络传输,分享PDS工程源码和技术支持和QT上位机
目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的以太网方案本方案在Xilinx系列FPGA的应用方案 3、设计思路框架工程设计原理框图AD输入源AD9238数据采集AD9238数据缓存控制模块…...
ffmpeg 把一个视频复制3次
1. 起因, 目的: 前面我写过,使用 python 把一个视频复制3次但是速度太慢了,我想试试看能否改进。而且我想换一种新的视频处理思路,并试试看速度如何。 2. 先看效果 效果就是能行,而且速度也快。 3. 过程: 代码 1…...
仿腾讯会议——添加音频
1、实现开启或关闭音频 2、 定义信号 3、实现开始暂停音频 4、实现信号槽连接 5、回收资源 6、初始化音频视频 7、 完成为每个人创建播放音频的对象 8、发送音频 使用的是对象ba,这样跨线程不会立刻回收,如果使用引用,跨线程会被直接回收掉&a…...
从零训练一个大模型:DeepSeek 的技术路线与实践
从零训练一个大模型:DeepSeek 的技术路线与实践 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 从零训练一个大模型:DeepSeek 的技术路线与实践摘要引言技术路线对比1. 模型架构:…...
interface接口和defer场景分析
接口 接口这里主要两点: 设计业务结构时采用依赖倒转:业务层向下依赖抽象层,实现层向上依赖抽象层。 相比于之前: 之后: 注意struct中嵌套interface和不嵌套interface的区别: type Myinterface interfac…...
【数据结构篇】排序1(插入排序与选择排序)
注:本文以排升序为例 常见的排序算法: 目录: 一 直接插入排序: 1.1 基本思想: 1.2 代码: 1.3 复杂度: 二 希尔排序(直接插入排序的优化): 2.1 基本思想…...
FastAPI自定义异常处理:优雅转换Pydantic校验错误
FastAPI自定义异常处理:优雅转换Pydantic校验错误 背景需求 当使用FastAPI开发API服务时,Pydantic的自动校验异常默认会返回如下格式的422响应: {"detail": [{"type": "missing","loc": ["body", "user", &…...
C++--内存管理
内存管理 1. C/C内存分布 在C语言阶段,常说局部变量存储在栈区,动态内存中的数据存储在堆区,静态变量存储在静态区(数据段),常量存储在常量区(代码段),其实这里所说的栈…...
YOLOV3 深度解析:目标检测的高效利器
在计算机视觉领域,目标检测一直是一个重要且热门的研究方向,广泛应用于安防监控、自动驾驶、机器人视觉等诸多场景。YOLO(You Only Look Once)系列算法凭借其出色的实时性和较高的检测精度,在目标检测领域占据着重要地…...
select * from 按时间倒序排序
在SQL中,如果你想要根据时间字段来倒序排序查询结果,你可以使用ORDER BY子句,并结合DESC关键字来实现这个目的。这里有几个常见的场景和示例,假设我们有一个表events,里面包含一个时间戳字段event_time。 示例1&#…...
数据结构-DAY06
一、树的概念 1.链表是数的一部分(斜树) 2.树的查找速度很快 3.层序:前序:根左右 中序:左根右 后序: 左右根 4.树的存储:顺序结构,链式结构 5.特点: 1…...
JavaWeb:SpringBoot处理全局异常(RestControllerAdvice)
问题 GlobalExceptionHandler 小结...
免费私有化部署! PawSQL社区版,超越EverSQL的企业级SQL优化工具面向个人开发者开放使用了
1. 概览 1.1 快速了解 PawSQL PawSQL是专注于数据库性能优化的企业级工具,解决方案覆盖SQL开发、测试、运维的整个流程,提供智能SQL审核、查询重写优化及自动化巡检功能,支持MySQL、PostgreSQL、Oracle、SQL Server等主流数据库及达梦、金仓…...
buuctf RSA之旅
BUUCTF-RSA的成长之路 rsarsaRSA1RSA3RSA2RSARSAROLLDangerous RSA[GUET-CTF2019]BabyRSArsa2RSA5[NCTF2019]childRSA[HDCTF2019]bbbbbbrsaRSA4[BJDCTF2020]rsa_output[BJDCTF2020]RSA[WUSTCTF2020]babyrsa[ACTF新生赛2020]crypto-rsa0[ACTF新生赛2020]crypto-rsa3[GWCTF 2019]…...
javascript 编程基础(2)javascript与Node.js
文章目录 一、Node.js 与 JavaScript1、基本概念1.1、JavaScript:动态脚本语言1.2、Node.js:JavaScript 运行时环境 2、核心区别3、执行环境差异3.1、浏览器中的JavaScript3.2、Node.js中的JavaScript 4、共同点5、为什么需要Node.js? 一、No…...
IDEA+AI 深度融合:重构高效开发的未来模式
在 Java 开发领域,IntelliJ IDEA(以下简称 IDEA)作为最受欢迎的集成开发环境之一,一直是开发者的得力工具。而飞算 JavaAI 凭借强大的人工智能技术,为 Java 开发带来了全新的效率提升可能。当 IDEA 与飞算 JavaAI 深度…...
深度学习中常见损失函数激活函数
损失函数 一、分类任务损失函数 二、回归任务损失函数 三、生成对抗网络(GAN)损失函数 四、其他专用损失函数 五、损失函数选择原则 任务类型:分类用交叉熵,回归用MSE/MAE。 数据分布:类别不平衡时选择Focal Loss或…...
入职软件开发与实施工程师了后........
时隔几个月没有创作的我又回来了,这几个月很忙,我一直在找工作,在自考(顺便还处理了一下分手的事),到处奔波,心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生,做我不愿意做的普通…...
告别Spring AI!我的Java轻量AI框架实践(支持多模型接入|注解式MCP架构|附开源地址)
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 1. 开发初衷 \quad 大家好,我是犬余,之前,为了体验一下MCP架构的JAVA实现,犬余使用了Spring AI框…...
【软考-架构】15、软件架构的演化和维护
✨资料&文章更新✨ GitHub地址:https://github.com/tyronczt/system_architect 文章目录 软件架构演化和定义面向对象软件架构演化软件架构演化方式的分类软件架构演化原则软件架构演化评估方法大型网站架构演化软件架构维护 软件架构演化和定义 软件架构生命周…...
编译Qt5.15.16并启用pdf模块
编译Qt5.15.16并启用pdf模块 标题1.目录设置 -q-bulid –qt-everywhere-src-5.15.16 –bulid cd bulid 必须,否则会提示Project ERROR: You cannot configure qt separately within a top-level build. create .qmake.stash and .qmake.super in build folder …...
spring中的EnvironmentPostProcessor接口详解
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 EnvironmentPostProcessor 是 Spring Boot 提供的一个关键扩展接口,允许开发者在 Spring 应用环境初始化后、应用上下文创建前&…...
自学嵌入式 day20-数据结构 链表
注:gdb调试工具用法 3.链表的常规操作 (6)尾部插入 int InsertTailLinkList(LinkList* ll, DATATYPE* data) { if (IsEmptyLinkList(ll))//判断链表是否为空 { return InsertHeadLinkList(ll, data); } else { …...
Java设计模式之外观模式:从入门到精通(保姆级教程)
外观模式是结构型设计模式中非常实用的一种,它为复杂的子系统提供了一个统一的简化接口。本文将全面深入地剖析外观模式,从基础概念到高级应用,通过丰富的代码示例、图表和日常生活类比,帮助您彻底掌握这一模式。 一、外观模式基础概念 1.1 什么是外观模式? 外观模式(…...
Ubuntu 20.04 postgresql
安装命令 $ sudo apt-get update $ sudo apt-get install -y postgresql查看postgresql版本 $ psql --version psql (PostgreSQL) 12.22 (Ubuntu 12.22-0ubuntu0.20.04.3)查看系统用户组是否存在postgres $ getent group postgres postgres:x:115: $ getent passwd postgres…...
游戏引擎学习第295天:堆叠房间用于Z层调试
关于确定哪些系统影响许多其他系统,并尽早将其固定下来 目前我们的游戏开发已经进入了一个关键阶段,我们觉得是时候来彻底解决 Z(深度)相关的问题了。之前我们在 Z 轴的处理上做了一些尝试,但始终没有一个明确的定论&…...
【Python 算法零基础 4.排序 ② 冒泡排序】
目录 一、引言 二、算法思想 三、时间复杂度和空间复杂度 1.时间复杂度 2.空间复杂度 四、冒泡排序的优缺点 1.算法的优点 2.算法的缺点 五、实战练习 88. 合并两个有序数组 算法与思路 ① 合并数组 ② 冒泡排序 2148. 元素计数 算法与思路 ① 排序 ② 初始化计数器 ③ 遍历数组…...
【工具】Windows|外接的显示器怎么用软件调亮度(Brightness Slider)
文章目录 工具安装及使用Twinkle Tray:Brightness Slider补充背景知识1. DDC/CI(Display Data Channel Command Interface)2. WMI(Windows Management Instrumentation)3. Twinkle Tray如何结合两者?对比总…...
1.3.3 数据共享、汇聚和使用中的安全目标
探索数据共享、汇聚与使用中的安全目标 在当今数字化时代,数据的价值愈发凸显,数据共享、汇聚与使用成为了推动业务发展、促进创新的重要环节。然而,在这一过程中,数据安全至关重要,我们需要明确并保障保密性、完整性…...
【QT】类A和类B共用类C
当类A和类B需要操作同一个输入框时,需要采用共享实例的设计模式。以下是具体实现方案: 1. 核心实现思路 #mermaid-svg-cdmYFhkgOZ5C0uI5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-cdmYF…...
《算法导论(第4版)》阅读笔记:p86-p90
《算法导论(第4版)》学习第 19 天,p83-p85 总结,总计 3 页。 一、技术总结 无。 二、英语总结(生词:2) 1. inkling (1)inkling: inclen(“utter in an undertone,低声说话”) c. a hint(提示);a slight knowledg…...