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

百度智能云:
百度智能云是百度提供的公有云平台,于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"><Buttonandroid: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;}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {@Overridepublic void onResult(AccessToken accessToken) {String token = accessToken.getAccessToken();}@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void run() {Toast.makeText(getBaseContext(),msg,Toast.LENGTH_LONG).show();}});//           infoTextView.setText("本地质量控制初始化错误,错误原因: " + msg);}});button=findViewById(R.id.identity_button);button.setOnClickListener(this);}@Overridepublic 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;}}@Overrideprotected 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, 越大图像质量越好但是请求时间越长。 不设置则默认值为20param.setImageQuality(20);param.setDetectRisk(true);OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>(){@Overridepublic void onResult(IDCardResult result) {if (result != null) {runOnUiThread(new Runnable() {@Overridepublic 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().);}}@Overridepublic void onError(OCRError error) {System.out.println(error);//              alertText("", error.getMessage());}});}private void alertText(final String title, final String message) {this.runOnUiThread(new Runnable() {@Overridepublic void run() {alertDialog.setTitle(title).setMessage(message).setPositiveButton("确定", null).show();}});}
}

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

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

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

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

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

相关文章

C语言数据结构之顺序表

目录 1.线性表2.顺序表2.1顺序表相关概念及结构2.2增删查改等接口的实现 3.数组相关例题 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性&#xff08;数据类型相同&#xff09;的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff…

2024年阿里云服务器明细报价整理总结

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

Zynq 7000 SoC器件的复位系统

Zynq7000 SoC器件中的复位系统包括由硬件、看门狗定时器、JTAG控制器和软件生成的复位。每个模块和系统都包括一个由复位系统驱动的复位。硬件复位由上电复位信号&#xff08;PS_POR_B&#xff09;和系统复位信号&#xff08;PS_SRST_B&#xff09;驱动。 在PS中&#xff0c;有…

JAVA基础面试题(第九篇)中! 集合与数据结构

JAVA集合和数据结构也是面试常考的点&#xff0c;内容也是比较多。 在看之前希望各位如果方便可以点赞收藏&#xff0c;给我点个关注&#xff0c;创作不易&#xff01; JAVA集合 11. HashMap 中 key 的存储索引是怎么计算的&#xff1f; 首先根据key的值计算出hashcode的值…

隧道代理的优势与劣势分析

“随着互联网的快速发展&#xff0c;网络安全已经成为一个重要的议题。为了保护个人和组织的数据&#xff0c;隧道代理技术逐渐成为网络安全的重要工具。隧道代理通过在客户端和服务器之间建立安全通道&#xff0c;加密和保护数据的传输&#xff0c;有效地防止黑客入侵和信息泄…

15-partition table (分区表)

ESP32-S3的分区表 什么是分区表&#xff1f;&#x1f914; ESP32-S3的分区表是用来确定在ESP32-S3的闪存中数据和应用程序的布局。每个ESP32-S3的闪存可以包含多个应用程序&#xff0c;以及多种不同类型的数据&#xff08;例如校准数据、文件系统数据、参数存储数据等&#x…

Scala 第一篇 基础篇

Scala 第一篇 基础篇 一、变量与常量 1、变量2、常量 二、数据类型 1、数据基本类型概览2、元组的声明与使用3、Range介绍和使用4、Option 类型的使用和设计5、类型别名 三、运算符四、程序逻辑 1、一切都是表达式2、分支语句3、循环语句 五、集合 1、List2、Set3、Map4、Arra…

MySQL高级(索引-性能分析-explain执行计划)

explain 或者 desc 命令获取 MySQL 如何执行 select 语句的信息&#xff0c;包括在 select 语句执行过程中表如何连接和连接的顺序。 -- 直接在 select 语句之前加上关键字 explain / desc explain select 字段列表 from 表名 where 条件 &#xff1b; explain select * …

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere&#xff0c;从字面意思就可以知道MTPA算法的目的是一个寻优最值问题&#xff0c;可以从以…

SQL Server 2022 安装及使用

SQL Server 2022 前言一、安装SQL Server 2022下载SQL Server 2022安装SQL Server 2022配置SQL Server 2022 二、安装SQL Server Management Studio下载SQL Server Management Studio安装SSMS-Setup-CHS 三、使用SQL Server 2022四、解决连接到服务器报错问题 前言 SQL Serve…

git 快问快答

我在实习的时候&#xff0c;是用本地开发&#xff0c;然后 push 到 GitHub 上&#xff0c;之后再从 Linux 服务器上拉 GitHub 代码&#xff0c;然后就可以了。一般程序是在 Linux 服务器上执行的&#xff0c;我当时使用过用 Linux 提供的命令来进行简单的性能排查。 在面试的时…

应用编程之进程(三-通信篇)

所谓进程间通信指的是系统中两个进程之间的通信&#xff0c;不同的进程都在各自的地址空间中、相互独立、隔离&#xff0c;所以它们是处在于不同的地址空间中&#xff0c;因此相互通信比较难&#xff0c;Linux 内核提供了多种进程间通信的机制。 大部分的程序是不要考虑进程间…

Microchip逆市扩张,接连收购2家公司

尽管年初传来降薪停工的消息&#xff0c;全球领先的半导体解决方案供应商Microchip并未因此停下扩张的脚步。相反&#xff0c;该公司在短短的一个月内&#xff0c;接连宣布收购两家公司&#xff0c;展现了其坚定的市场布局和前瞻的战略眼光。 4月11日&#xff0c;Microchip成功…

二进制OpenStack

二进制搭建OpenStack 1.环境准备 1.1机器的准备 主机名服务器配置操作系统IP地址controller-node4C8Gcentos7.9172.17.1.117computer-node4C8Gcentos7.9172.17.1.118 1.2网络架构 [rootcotroller-node ~]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noque…

Java JNI调用本地方法1(调用C++方法)

一、基础概念 1、JNI&#xff08;Java Native interface&#xff09;:sun公司提供的JNI是Java平台的一个功能强大的接口&#xff0c;实现java和操作系统本地代码的相互调用功能&#xff0c;系统本地代码通常是由其他语言编写的&#xff0c;如C。 二、JNI使用步骤 1、定义一个J…

选定进行压缩的卷可能已损坏。请使用chkdsk来修复损坏问题,然后尝试再次压缩该卷

Windows Server 2008R2环境下&#xff0c;进行磁盘重新分区时&#xff0c;想要对系统盘进行“压缩卷”&#xff0c;结果报错提示“选定进行压缩的卷可能已损坏。请使用Chkdsk来修复损坏问题&#xff0c;然后尝试再次压缩该卷。”这是硬盘出现了坏道导致的&#xff0c;硬盘出错无…

中仕公考:教师编制和事业单位d类一样吗?

教师编制和事业单位D类在考试内容、专业要求、晋升途径等方面有很大的不同中仕为大家介绍一下&#xff1a; 考试内容&#xff1a;教师编的考试包括教育综合知识和学科专业知识&#xff0c;有的地区会额外考公共基础知识。事业单位D类的考试更侧重于职业能力倾向测验和综合应用…

Linux的学习之路:14、文件(1)

摘要 有一说一文件一天学不完&#xff0c;细节太多了&#xff0c;所以这里也没更新完&#xff0c;这里部分文件知识&#xff0c;然后C语言和os两种的文件操作 目录 摘要 一、文件预备 二、c文件操作 三、OS文件操作 1、系统文件I/O 2、接口介绍 四、思维导图 一、文件…

uniapp全局监听分享朋友圈或朋友

把大象装进冰箱需要几步&#xff1a; 1、创建shart.js文件 export default{data(){return {//设置默认的分享参数//如果页面不设置share&#xff0c;就触发这个默认的分享share:{title:标题,path:/pages/index/index,imageUrl:图片,desc:描述,content:内容}}},onLoad(){let ro…

若依前后端部署到一起

引用&#xff1a;https://blog.csdn.net/qq_42341853/article/details/129127553 前端改造&#xff1a; 配置打包前缀 修改router.js 编程hash模式&#xff1a; 前端打包&#xff1a;npm run build:prod 后端修改&#xff1a; 添加thymeleaf包&#xff0c;和配置文件 spri…