调用阿里云身份证识别服务识别本地图片,很详细,附工具类

这篇具有很好参考价值的文章主要介绍了调用阿里云身份证识别服务识别本地图片,很详细,附工具类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、先购买阿里云的身份证识别服务,拿到对应的AccessKey ID 和 AccessKey Secret

二、在项目中添加阿里云的相关依赖,找到对应的工具类,这里用的是新版依赖

java 阿里云身份证识别,学习,阿里云,云计算,java

1、引入阿里云图片识别的依赖

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>ocr20191230</artifactId>
    <version>${aliyun.ocr.version}</version>
</dependency>

这是对应的依赖版本号查询地址,新版和旧版的依赖都可以在这里查

https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-ocr

接入步骤中的依赖我只添加了这个,json处理的依赖包项目本身就有,看自己情况,没有缺少对应的依赖就不需要添加了。

这是阿里云的示例地址

https://help.aliyun.com/document_detail/153132.htm?spm=a2c4g.11186623.0.0.65296d04gaIiFP#task-2406409

2、查询引入依赖,看是否导入成功

但是在调用过程发现引入依赖后与示例有点不一样!!!
我并没有看到com.aliyun:ocr:0.0.3这个依赖,以为是版本的问题,但看了一下也没有0.0.3这个版本

这是阿里云示例地址中的截图
java 阿里云身份证识别,学习,阿里云,云计算,java

这是我引入的阿里云依赖后,找到最像示例中的依赖包
java 阿里云身份证识别,学习,阿里云,云计算,java

RecognizeBankCardAdvanceRequest和RecognizeBankCardRequest这两个类倒是有,可是我的models包下面没有Config这个类,当时就想,示例代码中是需要这个类的,就算是高版本的jar包也不应该删了啊,保留疑问继续往下走。

既然和示例中的jar包有些出入,就先看看识别身份证的相关类吧,阿里云示例中提到

对于同一个接口,如果 SDK 中包含类似 xxxAdvanceRequest 的结构,那么这个接口支持本地文件上传,否则不支持。

示例截图中框的是识别银行卡的,我需要的是识别身份证的,那就找相关的工具类吧。

3、这是我找工具类的过程,可以跳过

(1)、识别身份证的类

识别身份证的是RecognizeIdentityCardAdvanceRequest和RecognizeIdentityCardRequest,其中RecognizeIdentityCardAdvanceRequest支持本地上传,那么就用这个。

java 阿里云身份证识别,学习,阿里云,云计算,java

识别本地图片的话,就将本地图片的输入流赋值给RecognizeIdentityCardAdvanceRequest实例的imageURLObject属性,示例代码中也有提到。

(2)、调用服务的类

调用身份证识别的服务需要Client这个类,通过在Client实例的recognizeIdentityCardAdvance方法中传入RecognizeIdentityCardAdvanceRequest实例进行图片识别,阿里云示例中没有明说Client这个是那个包中,引入的依赖和示例截图中(不同依赖)都有这个类,当时就想着先使用已经引入的依赖中的Client类,不行再换。
java 阿里云身份证识别,学习,阿里云,云计算,java

(3)、调用服务的类需要的Config实例,也是前面提到的没有看到的Config类

在实例化Client这个类中需要传入Config类的示例,因为modules中没有Config,进入Client源码,发现使用的是com.aliyun.teaopenapi.models这个包下的Config,行,那就用这个吧。
java 阿里云身份证识别,学习,阿里云,云计算,java

(4)、Config实例传参

一开始还不知道Config实例如何传参,后面看到阿里云身份证识别产品体验的示例代码(示例代码是旧版依赖的调用方式)中传了regionId、AccessKey ID 和 AccessKey Secret,加上Config确实有对应的变量,那就传这三个参数试试吧。

这是阿里云产品体验中心的代码:
java 阿里云身份证识别,学习,阿里云,云计算,java

三、示例代码

java 阿里云身份证识别,学习,阿里云,云计算,java

Config实例中的regionId沿用示例代码中的cn-shanghai。

运行测试一下
java 阿里云身份证识别,学习,阿里云,云计算,java
识别成功!

完整代码如下:

import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.google.gson.Gson;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * TODO
 *
 * @author:user
 * @date: 2022-08-08 14:21
 */
public class IdCardIdentifyUtil {

    public static void main(String[] args) throws Exception {
        Config config = new Config();
        config.setAccessKeyId("你的accessKeyId");
        config.setAccessKeySecret("你的accessKeySecret");
        config.setRegionId("cn-shanghai");

        Client client = new Client(config);

        InputStream inputStream = new FileInputStream(new File("D:\\opt\\jeecg-boot\\upload\\temp\\upload_1644998658029.jpg"));

        //这是上传本地图片的
        RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();
        request.setSide("face");
        request.imageURLObject = inputStream;

        //识别本地图片才要上传,但只是new一个实例进行传参,也没做什么
        RuntimeOptions runtimeOptions = new RuntimeOptions();

        RecognizeIdentityCardResponse response = null;
        try {
            response = client.recognizeIdentityCardAdvance(request, runtimeOptions);
        } catch (ServerException e) {
            e.printStackTrace();

            throw new RuntimeException(e.getMessage());
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());

            throw new RuntimeException("ErrCode:" + e.getErrCode() + ",ErrMsg:" + e.getErrMsg());
        }

        System.out.println("response::" + new Gson().toJson(response));
    }

}

四、工具类

这是我改造后的工具类,个人觉得比较适合在项目中使用。文章来源地址https://www.toymoban.com/news/detail-791435.html

1、身份证识别服务的请求参数

import lombok.Data;

/**
 * 身份证识别接口的参数
 *
 * @author:user
 * @date: 2022-08-08 15:28
 */
@Data
public class IdCardRequestParam {

    //阿里云accessKeyId
    private String accessKeyId;

    //阿里云accessSecret
    private String accessSecret;

    //阿里云识别身份证的regionId,设置请求参数的方法有横线,似乎废弃了
    private String regionId;

    //身份证正反面
    private String side;

    //上传图片路径
    private String imageURL;
}

2、身份证正面识别的接收dto

import lombok.Data;

/**
 * 身份证正面dto
 *
 * @author:user
 * @date: 2022-08-08 14:59
 */
@Data
public class IdCardFrontDto {

    //地址
    private String Address;

    //出生日期
    private String BirthDate;

    //性别
    private String Gender;

    //身份证号码
    private String IDNumber;

    //姓名
    private String Name;

    //民族
    private String Nationality;

    //身份证位置,目前没有用到
    private String CardAreas;
}

3、身份证反面识别的接收dto

import lombok.Data;

/**
 * 身份证反面dto
 *
 * @author:user
 * @date: 2022-08-08 15:09
 */
@Data
public class IdCardBackDto {

    //开始日期
    private String StartDate;

    //结束日期
    private String EndDate;

    //发证机关
    private String Issue;
}

4、身份证正反面枚举类

/**
 * 身份证正反面枚举类
 *
 * @author:user
 * @date: 2022-08-08 16:09
 */
public enum IdCardSideEnum {
    FACE("face", "人像面"),
    BACK("back", "国徽面");

    private String code;
    private String desc;

    IdCardSideEnum(String code, String desc) {
        this.code = code;
        this.desc = desc;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public static String getDesc(String code) {
        for (IdCardSideEnum value : IdCardSideEnum.values()) {
            if (value.code.equals(code))
                return value.desc;
        }
        throw new RuntimeException("未知状态:" + code);
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }
}

5、身份证识别工具类

import com.alibaba.fastjson.JSONObject;
import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.google.gson.Gson;

import org.jeecg.common.util.VerifyUtil;
import org.jeecg.modules.aliyun.enums.IdCardSideEnum;
import org.jeecg.modules.aliyun.dto.IdCardBackDto;
import org.jeecg.modules.aliyun.dto.IdCardFrontDto;
import org.jeecg.modules.aliyun.dto.IdCardRequestParam;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

/**
 * TODO
 *
 * @author:user
 * @date: 2022-08-08 14:21
 */
public class IdCardIdentifyUtil {

    /**
     * 识别身份证,泛型方法
     * @param param 识别身份证需要的参数
     * @param c 识别身份证正面传IdCardFrontDto.class;识别身份证反面传IdCardBackDto.class
     * @param <T>
     * @return
     */
    public static <T> T getIdCardInfo(IdCardRequestParam param, Class<T> c) throws Exception {
        VerifyUtil.checkBean(param); //这是之前写的一个校验方法,可以用自己的方式校验空值,之前的博客中也有该方法的代码

        //校验传入身份证正反面码是否合法
        String side = param.getSide();
        IdCardSideEnum.getDesc(side);

        if (IdCardSideEnum.FACE.getCode().equals(side) && !IdCardFrontDto.class.equals(c))
            throw new RuntimeException("识别身份证正面,应传入【IdCardFrontDto.class】");

        if (IdCardSideEnum.BACK.getCode().equals(side) && !IdCardBackDto.class.equals(c))
            throw new RuntimeException("识别身份证反面,应传入【IdCardBackDto.class】");

        String regionId = param.getRegionId();

        //这是阿里云身份证识别案例代码中拿过来的
        Config config = new Config();
        config.setAccessKeyId(param.getAccessKeyId());
        config.setAccessKeySecret(param.getAccessSecret());
        config.setRegionId(regionId);

        Client client = new Client(config);

        //这是识别网络路径的,需要开通oss服务
//        RecognizeIdentityCardRequest request = new RecognizeIdentityCardRequest();
        request.setRegionId(param.getRegionId());
//        request.setSide(side);
//        request.setImageURL(param.getImageURL());

        InputStream inputStream = new FileInputStream(new File(param.getImageURL()));

        //这是上传本地图片的
        RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();
        request.setSide(side);
        request.imageURLObject = inputStream;

        //识别本地图片才要上传,但只是new一个实例进行传参,也没做什么
        RuntimeOptions runtimeOptions = new RuntimeOptions();

        RecognizeIdentityCardResponse response = null;
        try {
            response = client.recognizeIdentityCardAdvance(request, runtimeOptions);
        } catch (ServerException e) {
            e.printStackTrace();

            throw new RuntimeException(e.getMessage());
        } catch (ClientException e) {
            System.out.println("ErrCode:" + e.getErrCode());
            System.out.println("ErrMsg:" + e.getErrMsg());
            System.out.println("RequestId:" + e.getRequestId());

            throw new RuntimeException("ErrCode:" + e.getErrCode() + ",ErrMsg:" + e.getErrMsg());
        }

        System.out.println("response::" + response);

        //将返回的json转化成JSONObject
        JSONObject responseJsonObject = JSONObject.parseObject(new Gson().toJson(response));

        //返回结果中嵌套了data,不能写错,data就是身份证的信息,
        //身份证正反面的返回键不一样,需要单独处理
        JSONObject idCardJsonObject = responseJsonObject.getJSONObject("body").getJSONObject("data");

        String idCardDataStr = null;
        if (IdCardSideEnum.FACE.getCode().equals(side)) {
            idCardDataStr = idCardJsonObject.getString("frontResult");
        } else if (IdCardSideEnum.BACK.getCode().equals(side)) {
            idCardDataStr = idCardJsonObject.getString("backResult");
        }

        return JSONObject.parseObject(idCardDataStr, c);
    }

}

到了这里,关于调用阿里云身份证识别服务识别本地图片,很详细,附工具类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 身份证识别ocr、身份证实名认证接口文档

    每一次验证背后,都是对用户数据安全的承诺,对平台信誉的坚守。翔云身份证实名认证API,通过身份证识别接口仅需一键上传身份证图片即可快速识别身份证信息,翔云实名认证接口实时联网查验证件信息的真伪。 ​PHP身份证实名认证接口文档代码如下:

    2024年04月17日
    浏览(63)
  • 小程序OCR身份证识别

    使用两种OCR识别:小程序和腾讯云 1.基于微信小程序OCR插件实现身份证拍照、上传并OCR识别的示例: 首先,在小程序中添加身份证拍照的功能,可以使用wx.chooseImage()选择照片并使用wx.uploadFile()上传,代码如下: 将上传的照片传到服务器端后,使用小程序OCR插件进行身份证识

    2024年02月07日
    浏览(60)
  • 基于Python实现身份证信息识别

    2024年01月19日
    浏览(52)
  • Python使用阿里API进行身份证实名认证

    孟莉苹,女,西安工程大学电子信息学院,2021级硕士研究生,张宏伟人工智能课题组 研究方向:机器视觉与人工智能 电子邮件:2425613875@qq.com 凭借领先的人工智能与知识图谱技术,对身份证正反面自动识别,并提取姓名、出生日期、身份证号、住址、性别、民族、发证机关

    2024年02月02日
    浏览(51)
  • 8.OpenCV-识别身份证号码(Python)

    需求描述: 通过OpenCV识别身份证照片上的身份证号码(仅识别身份证号码) 实现思路: 1.将身份证号中的0,1,2,3,4,5,6,7,8,9作为模板,与身份证照片中的身份证号码区域进行模板匹配。 2.先要制作一个身份证号码模板,我这里弄了一个,基本上可以用。  3.识别出身份证照片身

    2024年02月11日
    浏览(51)
  • uniapp小程序引入身份证识别、营业执照识别

    首先去微信服务市场  下滑 找到微信证件OCR识别 点击购买   选择你的小程序 可以在我的订单 -- 开发者资源 -- 使用中 看到 然后直接copy代码  就大功告成! 想了解参数意思  看文档   请注意---- 我们是直接调用微信OcrAllInOne接口,而不是使用微信Ocr插件,因此像其他文章,

    2024年03月18日
    浏览(57)
  • 微信小程序实现身份证识别-ocr

        项目中有一个识别身份证的需求,经过调研,最后决定使用微信小程序ocr插件进行开发。 一:首先登录小程序公众平台。 1:进入设置 第三方设置。   2:添加ocr插件。 3:添加完后,需要领取免费额度,100次/天。  https://fuwu.weixin.qq.com/service/detail/000ce4cec24ca026d37900ed551415  注意

    2024年01月16日
    浏览(70)
  • OpenCV-Python身份证信息识别

    本篇文章使用OpenCV-Python和CnOcr来实现身份证信息识别的案例。想要识别身份证中的文本信息,总共分为三大步骤:一、通过预处理身份证区域检测查找;二、身份证文本信息提取;三、身份证文本信息识别。下面来看一下识别的具体过程CnOcr官网。识别过程视频 这里的环境需

    2024年02月04日
    浏览(42)
  • 使用Python和OpenCV实现身份证识别

    Python是一种功能强大的编程语言,可以用于各种各样的应用场景,包括身份证识别。在本文中,我们将介绍如何使用Python来识别身份证,并提供一个示例代码来演示这个过程。 身份证是中国公民的重要证件,包含了个人的基本信息,如姓名、性别、出生日期、民族、住址等。

    2024年02月16日
    浏览(47)
  • 从0-1,使用腾讯OCR进行身份证识别

    目录 1.申请腾讯OCR权限 2.代码思路 3.Postman测试​  获取 secretId 和 secretKey,见上文 从0到1,申请cos服务器并上传图片到cos文件服务器-CSDN博客 https://blog.csdn.net/m0_55627541/article/details/133902798 入参有两个值,第一个为图片的云服务器路径,第二个为版面(正面/反面) controller servic

    2024年02月07日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包