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");
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qiweilong123456

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值