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

JAVA身份证件图像识别(100%可以用)

绝对能用在这里插入图片描述
在这里插入图片描述

1.请不要自己使用开源的OCR,识别率巨低,时间成本、优化成本太大!
2.对比网上的价格,百度的智能云更便宜。我算了下是1.6分每次
直接上代码(包含前端和后端,前端展示2种,图一是elementUI,图二是vantui的移动端。后端就是springboot)
我这里贴出来elementui的代码供你参考。
我会将关键参数抹除,你买完把参数直接放上去就能用
elementUI:

<template>
<div class="id-card-container" style="flex: 1;">
						<el-card class="id-card-box">
							<el-upload
									class="upload-demo"
									drag
									:action="uploadUrl"
									:headers="headers"
									:data="uploadData"
									:on-success="handleIdCardSuccess"
									:on-error="handleError"
									:before-upload="beforeUpload"
									:show-file-list="false"
									accept="image/*"
							>
								<i class="el-icon-upload"></i>
								<div class="el-upload__text">
									拖拽身份证到此或<em>点击上传</em>
								</div>
								<div class="el-upload__tip" slot="tip">
									支持JPG/PNG格式,文件大小不超过5MB
								</div>
							</el-upload>

							<div v-if="idCardLoading" class="loading-container">
								<el-progress type="circle" :percentage="50" :indeterminate="true"></el-progress>
								<p>正在识别中,请稍候...</p>
							</div>

							<div v-if="result" class="result-container">
								<el-descriptions :column="1" border>
									<el-descriptions-item label="姓名">{{ result.words_result.姓名.words || '未识别' }}</el-descriptions-item>
									<el-descriptions-item label="身份证号">{{ result.words_result.公民身份号码.words || '未识别' }}</el-descriptions-item>
								</el-descriptions>
							</div>
						</el-card>
					</div>
</template>

export default {
    data() {
        return {
			uploadUrl: '请输入你自己的URL/baidu/api/idcard/front',
			headers: {},
			uploadData: {},
			idCardLoading: false,
			result: null
			};
		},
		methods:{
			beforeUpload(file) {
				const isImage = file.type.startsWith('image/');
				const isLt5M = file.size / 1024 / 1024 < 5;
				if (!isImage) {
					this.$message.error('只能上传图片文件!');
					return false;
				}
				if (!isLt5M) {
					this.$message.error('图片大小不能超过5MB!');
					return false;
				}
	
				this.idCardLoading = true;
				this.result = null;
				return true;
			},
			handleIdCardSuccess(response, file, fileList) {
				this.idCardLoading = false;
				if (response.error) {
					this.$message.error(response.error);
					return;
				}
				this.result = response.data;
				this.optObj.userName = this.result.words_result.姓名.words;
				this.optObj.idcard = this.result.words_result.公民身份号码.words;
				this.$message.success('身份证识别成功');
			},
			handleError(err, file, fileList) {
				this.idCardLoading = false;
				console.error('上传失败:', err);
				this.$message.error('识别失败,请重试');
			}
		},
		mounted:{}
}

		
<style scoped>
.id-card-container {
	max-width
	: 300px;
	margin: 20px auto;
}

.id-card-box {
	padding: 1px;
}
.loading-container {
	text-align: center;
	margin: 3px 0;
}

.result-container {
	margin-top: 3px;
}
</style>

JAVA-controller

@RestController
@RequestMapping("/baidu/api")
public class BaiDuImagesController {

    @Autowired
    private BaiDuImagesService baiDuImagesService;

    /**
     * 识别身份证正面
     * @param imageFile 身份证正面图片
     * @return 识别结果
     */
    @PostMapping("/idcard/front")
    public ResponseData recognizeFront(@RequestParam("file") MultipartFile imageFile) {
        JSONObject jb = BaiDuIdCardImgClient.recognizeIdCard(imageFile.getBytes());
        ResponseData data = new ResponseData();
        data.setStatus(ResponseDataStatus.SUCCESS);
        data.setData(jb);
        return data;
    }

}

JAVA-具体方法接口

import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Base64;
import java.net.URLEncoder;
/**
 * @program: ic-client-postgreSQL
 * @description: 百度身份证识别
 * @author: 齐威龙
 * @create: 2025-04-02 14:18
 **/
public class BaiDuIdCardImgClient {
    public static final String API_KEY = "请输入你自己的API_KEY";
    public static final String SECRET_KEY = "请输入你自己的SECRET_KEY";

    static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();

    public static void main(String []args) throws IOException{
//        recognizeIdCard(imageBytes);
    }

    public static JSONObject recognizeIdCard(byte[] imageBytes) throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        // 将图片转换为Base64
        String imgStr = Base64.getEncoder().encodeToString(imageBytes);
        String imgParam = URLEncoder.encode(imgStr, "UTF-8");

        RequestBody body = RequestBody.create(mediaType, "id_card_side=front&image="+imgParam+"&detect_ps=false&detect_risk=false&detect_quality=false&detect_photo=false&detect_card=false&detect_direction=false");
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" + getAccessToken())
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .addHeader("Accept", "application/json")
                .addHeader("Authorization", "Bearer ")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        return JSONObject.parseObject(response.body().string());
    }

    /**
     * 获取文件base64编码
     *
     * @param path      文件路径
     * @param urlEncode 如果Content-Type是application/x-www-form-urlencoded时,传true
     * @return base64编码信息,不带文件头
     * @throws IOException IO异常
     */
    static String getFileContentAsBase64(String path, boolean urlEncode) throws IOException {
        byte[] b = Files.readAllBytes(Paths.get(path));
        String base64 = Base64.getEncoder().encodeToString(b);
        if (urlEncode) {
            base64 = URLEncoder.encode(base64, "utf-8");
        }
        return base64;
    }


    /**
     * 从用户的AK,SK生成鉴权签名(Access Token)
     *
     * @return 鉴权签名(Access Token)
     * @throws IOException IO异常
     */
    static String getAccessToken() throws IOException {
        MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
        RequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY
                + "&client_secret=" + SECRET_KEY);
        Request request = new Request.Builder()
                .url("https://aip.baidubce.com/oauth/2.0/token")
                .method("POST", body)
                .addHeader("Content-Type", "application/x-www-form-urlencoded")
                .build();
        Response response = HTTP_CLIENT.newCall(request).execute();
        return JSONObject.parseObject(response.body().string()).getString("access_token");
    }

}

相关文章:

  • Python 实现的运筹优化系统数学建模详解(多目标规划模型)
  • 报错:Nlopt
  • DICOM通讯(ACSE->DIMSE->Worklist)
  • STM32电机库 电机控制特性
  • 计算机网络(第四章)
  • TiDB 部署指南(单机模式) CentOS 7 安装 MariaDB 教程
  • 弱口令爆破
  • 亚马逊发货系统突发限制,卖家如何破局?
  • 转发表和路由表的差别
  • 详解关于VS配置好Qt环境之后但无法打开ui界面
  • Logisim——1位比较器,2位比较器,4位无符号比较器,16位无符号比较器(头歌平台实测通过)
  • Kubernetes Operator 是什么,以及它们的用途
  • Docker 与 Podman常用知识汇总
  • tmpfs的监控筛选/dev/shm下的shmem创建
  • Linux——基础开发工具
  • 【第43节】实验分析windows异常分发原理
  • 低功耗设计:Level Shift的种类(以SAED EDK 32/28nm工艺库为例)
  • ubuntu上,e1000e,i1210有线网卡驱动安装
  • 从暴力到动态规划再到双指针:使用 Java 探索接雨水问题的不同解法
  • 处理Long类型长度超长导致前端精度丢失问题
  • 美官员称与乌克兰会谈富有成效,但仍存重大分歧
  • 猿辅导武汉公司一员工猝死,死者亲属:他原计划5月2日举行婚礼
  • 泽连斯基:停火后愿进行“任何形式”谈判,但领土问题除外
  • 外汇局:将持续强化外汇形势监测,保持汇率弹性,坚决对市场顺周期行为进行纠偏
  • 三部门:对不裁员少裁员的参保企业实施稳岗返还政策至今年底
  • 宇树的任务已经完成?王兴兴也在等待行业拐点