百度智能云:
百度智能云是百度提供的公有云平台,于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景,致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。
百度智能云为金融、城市、医疗、客服与营销、能源、制造、电信、文娱、交通等众多领域领军企业提供服务。例如,它提供了多模态的搜索与查重能力,包括以视频搜视频、以图搜视频、以图搜图等功能,以帮助企业提高用户的检索体验和效率,维护平台内容生态,探索新的业务增长点。
此外,百度智能云还提供了灵活、智能、强大的应用可视化设计与发布平台,以及行业智能应用、一款面向工业的视觉AI开发平台、开发者服务等,以满足不同领域和企业的多样化需求。
在AI开发方面,百度智能云深入剖析AI开发全流程,专注提升开发效率和应用效果。它基于飞桨企业版,面向不同人群推出AI开发双平台模式,并通过提供业界适配最为广泛的端与边缘部署服务,使推理速度最高提升10倍。
百度智能云链接
文章目录
前言:为什么要应用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.提示有重复的主题 添加下述红圈代码![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/76bff07ac5cb4baf8a890690c4ceb314.png)
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();
}
});
}
}
效果(由于信息隐私问题 不能真正的演示身份证,选择一张样例)
作者亲自测试过 真实身份证可以获取到身份证内包含的所有信息