Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)

项目中需要使用到身份证识别,所以经过调研后决定从阿里云上购买,在经过我的两天研究和客服对接,我基本把坑全踩完了,所以在此总结一套整体的流程

首先,在我买过之后才发现,阿里云的官网上面有两套ocr,第一套是读光的OCR,第二套是视觉智能的OCR,但是他们的官网并没有描述,我是在买完之后扣费时发现不对的,问了三个客服才能给我解答,其他客服也说不清楚,很坑

        (1):读光的OCR:读光的OCR是我在调通视觉智能的OCR之后才知道我第一次买的是读光下面的,但是我因为已经用了视觉智能的,所以我就没有再用了,我在此就把读光的OCR的购买 方式和开发文档放在这,有需要的自己去集成:

        购买方式:从这里面进去,购买的是读光的OCRJava实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第1张图片

然后在这个页面内购买预付包

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第2张图片

 他的开发调用链接是:RecognizeIdcard - 文字识别(OCR) - 阿里云

需要的朋友可以自己去集成一下,我主要说一下第二种方式,通过视觉智能的OCR集成的方式,看起来也比读光简单一些

        (2):觉智能的OCR

 视觉智能的OCR购买方式不是从上面的方式进去购买的,目前我找的时候是从他给的开发文档内去购买的:身份证识别 - 阿里云视觉智能开放平台 - 阿里云

        Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第3张图片

 点击立即开通,如果你开通了,他会弹出框提示,如果没有开通的话,你就直接选择上海然后开通就行,我这边已经开通了

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第4张图片

 然后控制台内点击下面的能力购买,或者下面服务列表后面的购买,随便一个就行

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第5张图片

 然后进入之后就是付费页面,这个付费是以点数来抵扣的,抵扣规则就是下面的付费能力抵扣系数,你购买的点数是包含下面的所有识别的,所以随便从哪里点击购买都行,然后根据你的需求去购买,测试的话,第一次是一分钱,我这是第二次,所以贵

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第6张图片

 买完之后就会跟我刚刚的首页一样,会有一千点的抵扣点,然后我们再回到我们的开发文档:身份证识别 - 阿里云视觉智能开放平台 - 阿里云

看到这个api,他的参数ImageUrl必须是上海地域的OSS链接,所以,我们需要再次购买他的OSS服务,

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第7张图片

 点击链接之后跳转OSS教程:

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第8张图片

 因为我已经开通了,所以截图就放在这了,开通的选择规则请看:反正也是免费的,怎么便宜怎么来  创建存储空间 - 对象存储 OSS - 阿里云

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第9张图片

 然后我们还需要创建一个AccessKey,因为我们开的服务都需要通过AccessKey去创建

创建AccessKey是在随便你的哪个工作台都可以,在OCR的工作台或者OSS的工作台都行:

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第10张图片

 然后进去点击继续使用,创建就是一路点:

Java实现阿里云OCR的身份证识别等功能具体流程(包括android思路)_第11张图片

 然后背景板就是我创建过后的,不想截图了,太累了,然后我们需要的AccessKey ID就是我打码的那个,然后AccessKeySecret就是后面那个查看Secret,需要通过验证码的方式,你刚开始创建的时候就记好,这样就不用再验证码了

现在我们都写好了,就差写代码了,我们如果用这个写的话,最好是后台去访问,然后通过接口的方式返回给我们移动端,后台起码安全一些,也简单一些,所以移动端的朋友们可以让你们的后台来学这个,如果用读光的话,我没有写,那个不知道能不能使用到android,所以有感兴趣的朋友也可以去研究一下读光的OCR

1.首先是依赖注入:


            com.aliyun
            ocr20191230
            1.0.19
        

        
            com.aliyun
            viapi-utils
            1.0.2
        
        
            com.aliyun
            aliyun-java-sdk-viapiutils
            1.0.0
        
        
            com.aliyun
            aliyun-java-sdk-core
            4.4.8
        
        
            com.aliyun.oss
            aliyun-sdk-oss
            3.4.2
        

        
            org.apache.commons
            commons-lang3
            3.9
        

 2.就是写代码了,然后我这边是集成了三个,其他的都是一样的,我写了身份证、驾驶证、行驶证三个证件识别,有哪里不懂记得看注释,打印不出来记得看注释,不要复制进去就开跑:

import com.aliyun.com.viapi.FileUtils;
import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;

import java.io.*;

/**
 * @Author: 四块五毛六
 * @Date: 2022/7/19 14:49
 */
public class SampleOCR {

    public static void main(String[] args_) throws Exception {
        Config config = new Config();
        //你的accessKeyId
        config.accessKeyId = "你的accessKeyId";
        //你的accessKeySecret
        config.accessKeySecret = "你的accessKeySecret";
        config.type = "access_key";
        config.regionId = "cn-shanghai";
        // config.endpointType="internal";  //默认通过公网访问OSS,如需通过内网请打开这一行
        Client client = new Client(config);
        RuntimeOptions runtimeOptions = new RuntimeOptions();
        FileUtils fileUtils = FileUtils.getInstance("你的accessKeyId", "你的accessKeySecret");
        //这个是通过本地上传的方式,然后如果是移动端的话,他传过来的就应该是一个file文件,直接用file.getInputStream就行
        InputStream in = new FileInputStream(new File("C:\\Users\\Chongchong\\Desktop\\23.jpg"));
        //这个前面的fileName是生成后的ossUrl的后缀,其实有没有都无所谓,或者你自己取一个,如果加上.jpg等图片后缀,
        //访问这个链接的时候就是下载一张本地图片,如果不加的话,下载的就是一个未识别的文件,如果改后缀可以变成图片
        String ossUrl = fileUtils.upload("", in);
        //url方式

        //身份证
//        recognizeIdCardAdvance(client, ossUrl);

        //驾驶证
//        recognizeDriverLicense(client, ossUrl);

        //行驶证
        recognizeDrivingLicense(client, ossUrl);


        config.endpoint = "ocr.cn-shanghai.aliyuncs.com";

    }

    //行驶证(就写了这一个,因为其他的都跟这个一样,只有方法不一样)
    private static void recognizeDrivingLicense(Client client, String ossUrl) {
        //face是正面,back是背面,我们一般用正面就行,这个可以传过来的
        RecognizeDrivingLicenseRequest request = new RecognizeDrivingLicenseRequest()
                .setImageURL(ossUrl)
                .setSide("face");
        try {
            // 复制代码运行请自行打印 API 的返回值
            RecognizeDrivingLicenseResponse recognizeDrivingLicenseResponse = client.recognizeDrivingLicense(request);
            //这个打印的就是recognizeDrivingLicenseResponse就是内容,最好用断点打,这是整个的内容,打印不出来东西的,
            //需要你自己从中间解析,解析我就不写了,因为我也没有解析
            System.out.println(recognizeDrivingLicenseResponse);
        } catch (TeaException error) {
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        }
    }

    //驾驶证
    private static void recognizeDriverLicense(Client client, String ossUrl) {
        RecognizeDriverLicenseRequest request = new RecognizeDriverLicenseRequest()
                .setImageURL(ossUrl)
                .setSide("face");
        try {
            // 复制代码运行请自行打印 API 的返回值
            RecognizeDriverLicenseResponse recognizeDriverLicenseResponse = client.recognizeDriverLicense(request);
            System.out.println(recognizeDriverLicenseResponse);
        } catch (TeaException error) {
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        }
    }

    //身份证
    private static void recognizeIdCardAdvance(Client client, String ossUrl) throws Exception {
        RecognizeIdentityCardRequest recognizeIdentityCardRequest = new RecognizeIdentityCardRequest()
                .setImageURL(ossUrl)
                .setSide("face");
        RuntimeOptions runtime = new RuntimeOptions();
        try {
            // 复制代码运行请自行打印 API 的返回值
            RecognizeIdentityCardResponse recognizeIdentityCardResponse = client.recognizeIdentityCardWithOptions(recognizeIdentityCardRequest, runtime);

            System.out.println(recognizeIdentityCardResponse);
        } catch (TeaException error) {
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        } catch (Exception _error) {
            TeaException error = new TeaException(_error.getMessage(), _error);
            // 如有需要,请打印 error
            com.aliyun.teautil.Common.assertAsString(error.message);
            System.out.println(error.message);
        }
    }
}

然后接口就调试完了,如果要用到其他的服务,我这里面没写到的,可以自己去那个开发文档里面找方法名,我没有一个一个测,我感觉他们的调用就是把方法改了一下,其他的什么也没变,很方便。

你可能感兴趣的:(java,开发语言,android)