Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

news2025/2/24 15:28:05

百度智能云:
百度智能云是百度提供的公有云平台,于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景,致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。
百度智能云为金融、城市、医疗、客服与营销、能源、制造、电信、文娱、交通等众多领域领军企业提供服务。例如,它提供了多模态的搜索与查重能力,包括以视频搜视频、以图搜视频、以图搜图等功能,以帮助企业提高用户的检索体验和效率,维护平台内容生态,探索新的业务增长点。
此外,百度智能云还提供了灵活、智能、强大的应用可视化设计与发布平台,以及行业智能应用、一款面向工业的视觉AI开发平台、开发者服务等,以满足不同领域和企业的多样化需求。
在AI开发方面,百度智能云深入剖析AI开发全流程,专注提升开发效率和应用效果。它基于飞桨企业版,面向不同人群推出AI开发双平台模式,并通过提供业界适配最为广泛的端与边缘部署服务,使推理速度最高提升10倍。
在这里插入图片描述
百度智能云链接

文章目录

  • 前言:为什么要应用OCR技术
  • 一、OCR是什么?
  • 二、使用步骤
    • 1.百度智能云、注册、登录、认证
    • 2.创建应用
    • 3.SDK开发文档
    • 4.下载SDK 解压后:
    • 5. 根据开发文档提示进行相应的配置(截图分析+代码)
  • 三、作者在完成上述配置后需要解决一部分错误:
      • 1. 导入的模块中的build.gradle中配置与我创建项目的配置版本不同
      • 2.提示有重复的主题 添加下述红圈代码![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/2bf25506b1c640acaefe4a6f684e4922.png)
      • 3.build进行构建后 根据报红的错误提示删除import包重新导入
  • 四、完成上述配置后进行代码的编写
      • 1 xml
      • 2 获取文件的工具类
      • 3.MainActivity
  • 效果(由于信息隐私问题 不能真正的演示身份证,选择一张样例)


前言:为什么要应用OCR技术

OCR(光学字符识别)技术的应用之所以广泛,主要是因为其能够为多个领域带来诸多便利和效率提升。以下是应用OCR技术的主要原因:

提高工作效率:OCR技术可以快速、准确地将纸质文档、图片等中的文字转化为可编辑的文本格式,从而减少了手动输入的时间和劳动量,大大提高了工作效率。

简化数据管理:通过OCR技术,大量的纸质文档可以被转化为数字格式,方便进行存储、传输和检索。这不仅可以节省存储空间,还可以使数据管理更加便捷和高效。

提高数据准确性:相比于人工输入,OCR技术的识别精度通常更高,能够降低数据录入错误的风险,提高数据的准确性。

跨平台应用:OCR技术识别出的文本可以方便地在各种设备上查看和编辑,实现跨平台的信息共享和协作。

推动自动化进程:OCR技术是实现自动化的关键工具之一。在文档管理、财务审计、客户服务等领域,OCR技术可以自动化处理大量文本数据,减少人工干预,提高业务流程的自动化程度。

促进数字化转型:随着企业数字化转型的加速,OCR技术成为将纸质文档转化为数字资产的重要工具,有助于企业实现全面的数字化转型。

改善无障碍访问:OCR技术可以帮助视觉障碍者通过语音合成器读取图片或纸质文档中的文字,提高信息获取能力,改善无障碍访问体验。

综上所述,OCR技术的应用能够带来工作效率的提升、数据管理的简化、数据准确性的提高以及自动化和数字化转型的推动等多个方面的优势,因此得到了广泛的应用和重视。


一、OCR是什么?

OCR(Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程。

OCR的核心原理是基于对图像的分析识别处理,获取文字和版面信息,是计算机视觉的一个典型任务。这个过程通常包括文本检测和文本识别两个子任务:文本检测是将图片中的文字区域位置检测出来;文本识别则是对文字区域中的文字进行识别。

OCR的应用场景十分广泛,如证件识别、银行卡识别、车牌识别、名片识别以及营业执照识别等。在证件识别中,OCR技术可以支持大陆二代身份证、台湾身份证、香港身份证、澳门身份证、护照、行驶证、驾驶证、港澳台通行证等20余种证件的识别。此外,OCR还可以用于识别车牌号码、车牌颜色、车牌类型、车标、车身颜色等车辆特征信息。

然而,OCR技术并非完美无缺,也存在一些缺点,如拒识率、误识率等问题,这是衡量一个OCR系统性能好坏的重要指标。同时,OCR技术还在不断发展中,包括基于传统算法和基于深度学习的OCR技术原理等,都在努力提高识别的准确性和效率。

二、使用步骤

1.百度智能云、注册、登录、认证

2.创建应用

在这里插入图片描述
在这里插入图片描述
选择身份证识别后点击0元领取(作者已经领取过了因此是灰色的)
在这里插入图片描述
领取之后创建应用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
应用包名:复制下方中的applicationId在这里插入图片描述
签名MD5:点击运行下方红圈位置
在这里插入图片描述

3.SDK开发文档

在这里插入图片描述

4.下载SDK 解压后:

在这里插入图片描述

打开开发文档:
在这里插入图片描述

5. 根据开发文档提示进行相应的配置(截图分析+代码)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了避免出错尽量放在英文名称下路径下
文件 ——>项目结构在这里插入图片描述
将ocr_ui作为模块依赖导入 导入后 配置文件中会出现:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、作者在完成上述配置后需要解决一部分错误:

1. 导入的模块中的build.gradle中配置与我创建项目的配置版本不同

这是官方的
在这里插入图片描述
这是修改后的
在这里插入图片描述

2.提示有重复的主题 添加下述红圈代码在这里插入图片描述

3.build进行构建后 根据报红的错误提示删除import包重新导入

四、完成上述配置后进行代码的编写

1 xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/identity_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="身份证识别"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

2 获取文件的工具类

/*
 * Copyright (C) 2017 Baidu, Inc. All Rights Reserved.
 */
package com.example.identity;

import java.io.File;

import android.content.Context;

public class FileUtil {
    public static File getSaveFile(Context context) {
        File file = new File(context.getFilesDir(), "pic.jpg");
        return file;
    }
}

3.MainActivity

   package com.example.identity;

import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;


import com.baidu.ocr.sdk.OCR;
import com.baidu.ocr.sdk.OnResultListener;
import com.baidu.ocr.sdk.exception.OCRError;
import com.baidu.ocr.sdk.model.AccessToken;
import com.baidu.ocr.sdk.model.IDCardParams;
import com.baidu.ocr.sdk.model.IDCardResult;
import com.baidu.ocr.ui.camera.CameraActivity;
import com.baidu.ocr.ui.camera.CameraNativeHelper;
import com.baidu.ocr.ui.camera.CameraView;

import java.io.File;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{
    private static final int REQUEST_CODE_PICK_IMAGE_FRONT = 201;
    private static final int REQUEST_CODE_PICK_IMAGE_BACK = 202;
    private static final int REQUEST_CODE_CAMERA = 102;

       private Button button;
       private AlertDialog.Builder alertDialog;

    private boolean checkGalleryPermission() {
        int ret = ActivityCompat.checkSelfPermission(this, Manifest.permission
                .READ_EXTERNAL_STORAGE);
        if (ret != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
                    new String[] {Manifest.permission.READ_EXTERNAL_STORAGE},
                    1000);
            return false;
        }
        return true;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {
            @Override
            public void onResult(AccessToken accessToken) {
                String token = accessToken.getAccessToken();

            }

            @Override
            public void onError(OCRError ocrError) {
                System.out.println("Application中出现错误");
                System.out.println(ocrError);

            }
        }, getApplicationContext());


        //  初始化本地质量控制模型,释放代码在onDestory中
        //  调用身份证扫描必须加上 intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL, true); 关闭自动初始化和释放本地模型
        CameraNativeHelper.init(this, OCR.getInstance(this).getLicense(),
                new CameraNativeHelper.CameraNativeInitCallback() {
                    @Override
                    public void onError(int errorCode, Throwable e) {
                        String msg;
                        switch (errorCode) {
                            case CameraView.NATIVE_SOLOAD_FAIL:
                                msg = "加载so失败,请确保apk中存在ui部分的so";
                                break;
                            case CameraView.NATIVE_AUTH_FAIL:
                                msg = "授权本地质量控制token获取失败";
                                break;
                            case CameraView.NATIVE_INIT_FAIL:
                                msg = "本地质量控制";
                                break;
                            default:
                                msg = String.valueOf(errorCode);
                        }
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(getBaseContext(),msg,Toast.LENGTH_LONG).show();

                            }
                        });

             //           infoTextView.setText("本地质量控制初始化错误,错误原因: " + msg);
                    }
                });


        button=findViewById(R.id.identity_button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.identity_button:
                Intent intent = new Intent(this, CameraActivity.class);
                intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
                intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,                     FileUtil.getSaveFile(getApplication()).getAbsolutePath());
                startActivityForResult(intent, REQUEST_CODE_CAMERA);

                break;
        }
    }
       @Override
       protected void onActivityResult(int requestCode, int resultCode, Intent data) {
           // 获取调用参数
           super.onActivityResult(requestCode, resultCode, data);
           String contentType = data.getStringExtra(CameraActivity.KEY_CONTENT_TYPE);
           // 通过临时文件获取拍摄的图片
           String filePath = FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath();
           // 判断拍摄类型(通用,身份证,银行卡等)
           if (requestCode == REQUEST_CODE_CAMERA && resultCode == Activity.RESULT_OK) {
               // 判断是否是身份证正面
               if (CameraActivity.CONTENT_TYPE_ID_CARD_FRONT.equals(contentType)) {
                   recIDCard(IDCardParams.ID_CARD_SIDE_FRONT, filePath);
                   // 获取图片文件调用sdk数据接口,见数据接口说明
               }
           }
       }
       private void recIDCard(String idCardSide, String filePath) {
           IDCardParams param = new IDCardParams();
           param.setImageFile(new File(filePath));
           // 设置身份证正反面
           param.setIdCardSide(idCardSide);
           // 设置方向检测
           param.setDetectDirection(true);
           // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
           param.setImageQuality(20);

           param.setDetectRisk(true);

           OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>()
           {
               @Override
               public void onResult(IDCardResult result) {
                   if (result != null) {

                       runOnUiThread(new Runnable() {
                           @Override
                           public void run() {
                               System.out.println(result.toString());
                               System.out.println(result.getIdNumber().toString());
                               Log.d("=================",result.getIdNumber().toString());
                               Toast.makeText(getBaseContext(),  result.getName().toString(),Toast.LENGTH_LONG).show();
                           }
                       });
//                       alertText("身份证信息", result.toString().);
                   }
               }

               @Override
               public void onError(OCRError error) {
                   System.out.println(error);
     //              alertText("", error.getMessage());
               }
           });
       }
       private void alertText(final String title, final String message) {
           this.runOnUiThread(new Runnable() {
               @Override
               public void run() {

                   alertDialog.setTitle(title)
                           .setMessage(message)
                           .setPositiveButton("确定", null)
                           .show();
               }
           });
       }
}

效果(由于信息隐私问题 不能真正的演示身份证,选择一张样例)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
作者亲自测试过 真实身份证可以获取到身份证内包含的所有信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jeecgflow之camunda工作流-并行网关

引言 书接上回&#xff0c;继续三国流程系列教程。 本文主要讲解并行网关。 并行网关允许流程中的多个任务同时执行&#xff0c;从而提高流程的执行效率。 并行网关会忽视序列流上的条件设置。 并行网关分为两部分。 Fork: 用于任务开始 Join:用于任务结束 体验文章demo演示站…

HarmonyOS-静态库(SDK)的创建和使用

文章目录 一、静态库&#xff08;SDK&#xff09;二、创建静态库1.新建静态库模块2. 开发静态库内容3. 编译静态库 三、使用静态库1. 配置项目依赖2. 在应用中使用静态库3. 注意事项 四、打包错误1. library引用本地har包错误 一、静态库&#xff08;SDK&#xff09; 在Harmon…

美团财务科技Java后端一面:面向对象、类加载过程、全限定类名相同的类是否可以同时被加载

更多大厂面试内容可见 -> http://11come.cn 美团财务科技Java后端一面&#xff1a;面向对象、类加载过程、全限定类名相同的类是否可以同时被加载 如何理解面向对象&#xff1f; 面向对象 是具有对象概念的编程范式&#xff0c;面向对象将程序实现分为了一个个独立的对象&…

Vue.js------Vue组件基础

能够理解Vue组件概念和作用能够掌握封装创建组件能力能够使用组件之间通信能够完成todo案例 一.Vue组件创建和使用 1.折叠面板-实现多个 创建一个文件夹demo 具体步骤请参考vue.js---vue基础 ⚫ 解决方案: 采用vue提供的单.vue文件-组件方式来封装一套然后复用 在component…

Hadoop的安装及配置

8.下面我们开始安装配置Hadoop 1&#xff09;首先下载hadoop-2.7.2的jar包 并添加到我们的jtxy1的/root/目录下 2&#xff09;yum install在线安装软件 yum install net-tools //支持ifconfig yum install vim //支持vim yum install glibc.i686 --java命令不好使 3&am…

人工智能论文GPT-3(2):2020.5 Language Models are Few-Shot Learners;微调;少样本Few-Shot (FS)

2 方法Approach 我们的基本预训练方法&#xff0c;包括模型、数据和训练&#xff0c;与GPT-2中描述的过程相似&#xff0c;只是模型规模、数据集规模和多样性&#xff0c;以及训练时长有所扩大&#xff0c;相对简单直接。 我们使用的上下文学习也与GPT-2相似&#xff0c;但在…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算&#xff08;判断&#xff09; 1~100中哪些是素数、哪些是合数。 素数也称为质数&#xff0c;是只能被1及其自身整除的自然数。与素数相对应的是合数&#xff0c;合数可以被分解为若干个素数的乘积&#xff0c;这些素数称为这个合数的质…

即席查询笔记

文章目录 一、Kylin4.x1、Kylin概述1.1 定义1.2 Kylin 架构1.3 Kylin 特点1.4 Kylin4.0 升级 2、Kylin 环境搭建2.1 简介2.2 Spark 安装和部署2.3 Kylin 安装和部署2.4 Kylin 启动环境准备2.5 Kylin 启动和关闭 3、快速入门3.1 数据准备3.2 Kylin项目创建入门3.3 Hive 和 Kylin…

Qt Debug模式下应用程序输出界面乱码【已解决】

Qt Debug模式下应用程序输出乱码 一、问题描述二、解决方法三、相关测试 一、问题描述 源码为utf-8编码. Qt Creator在Debug模式下运行程序&#xff0c;下方应用程序输出界面显示乱码. 但正常运行无乱码&#xff1a; 二、解决方法 尝试修改文件编码、执行编码无果… 可参考…

架构师系列-搜索引擎ElasticSearch(十)- 索引别名及重建

索引别名 别名&#xff0c;有点类似数据库的视图&#xff0c;别名一般都会和一些过滤条件相结合&#xff0c;可以做到即使是同一个索引上&#xff0c;让不同人看到不同的数据。 别名的作用 在开发中&#xff0c;一般随着业务需求的迭代&#xff0c;较老的业务逻辑就要面临更新…

小型燃气站3D可视化:打造安全高效的燃气新时代

随着科技的不断进步&#xff0c;越来越多的行业开始融入3D可视化技术&#xff0c;燃气行业也不例外。 小型燃气站作为城市燃气供应的重要节点&#xff0c;其安全性和运行效率至关重要。传统的燃气站管理方式往往依赖于人工巡检和纸质记录&#xff0c;这种方式不仅效率低下&…

JVM 讲解 (主要类加载其以及流程和机制(双亲委派))

JVM有什么用&#xff1f; 说白了&#xff0c;就是我们编写 Java 代码&#xff0c;编译 Java 代码&#xff0c;目的不是让它在 Linux、Windows 或者 MacOS 上跑&#xff0c;而是在 JVM 上跑。&#xff08;保证只要有JVM这个东西&#xff0c;就可以跨平台使用Java) 可以把JVM想象…

事务的传播行为介绍和事务失效

常用的就下图介绍的这两种&#xff0c;REQUIRED 支持当前事务&#xff0c;如果不存在&#xff0c;就新建一个&#xff0c;EQUIRES_NEW 如果有事务存在&#xff0c;挂起当前事务&#xff0c;创建一个新的事务 同一个service中必须用代理对象调用&#xff0c;否则失效

ADOP 万兆电口光模块:SFP+转RJ45端口解决方案

&#x1f335;在数据中心的接入层中&#xff0c;大多数服务器网卡&#xff08;NIC&#xff09;和存储设备都采用10GBASE-T RJ45端口&#xff0c;而与之相连的TOR&#xff08;机架顶部&#xff09;交换机通常配备SFP端口&#xff0c;且二者无法直接相连。为了解决该问题&#xf…

软考高级架构师:项目配置管理中产品配置例题

题目 项目配置管理中&#xff0c;产品配置是指一个产品在其生命周期各个阶段所产生的各种形 式和各种版本的文档、计算机程序、部件及数据的集合。该集合中的每一个元素 称为该产品配置中的 一个配置项&#xff0c; ( )不属于产品组成部分工作成果的配置项。 A需求文档 B设计文…

Redis中的事务(二)

事务 事务的实现 执行事务 当一个处于事务状态的客户端向服务器发送EXEC命令时&#xff0c;这个EXEC命令将立即被服务器执行&#xff0c;服务器会遍历这个客户端的事务队列&#xff0c;执行队列中保存的所有命令&#xff0c;最后将执行命令所得的结果全部返回给客户端。 例…

3、MYSQL-一条sql如何在MYSQL中执行的

MySQL的内部组件结构 大体来说&#xff0c;MySQL 可以分为 Server 层和存储引擎层两部分。 Server层 主要包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖 MySQL 的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函…

MIMO(多天线)通信的四种译码算法

目录 一. 介绍 二. 极大似然译码 三. 破零译码算法 四. 最小均方误差算法 五. 球形译码 一. 介绍 发射天线数记为Mt&#xff0c;接收天线数记为Mr。由此发射信号x为向量&#xff1a; 接受信号y为向量&#xff1a; 信道H为矩阵&#xff1a; 利用n代表噪声向量&#xff0c;…

【若依前后端分离】温湿度仪表盘

示例&#xff1a; 代码&#xff1a; TemperatureAndHumidity.vue组件 //温湿度仪表盘 <template><div><!-- 在这里放置你的图表组件 --><div ref"echarts" style"width: 100%; height: 400px;"></div></div> </t…

【C++干货基地】面向对象核心概念 const成员函数 | 初始化列表 | explicit关键字 | 取地址重载

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…