1.识别流程

  • 手机获取身份证图片
  • 计算机图片身份证号码所在的区
    • 需要用到OpenCV,进行图像处理
  • OCR文本训练
  • 记忆样本移植
  • 图像文字识别
    • 使用Tesseract-OCR文字

所以身份证别的关键:找到身份证号所在的区域、获取号码图片

2.图片预处理

  • 图片无损压缩

    #define DEFAULT_CARD_WIDTH 640
    #define DEFAULT_CARD_HEIGHT 400
    #define  FIX_CARD_SIZE Size(DEFAULT_CARD_WIDTH,DEFAULT_CARD_HEIGHT)Mat dst;
    /*图片无损压缩*/
    resize(src_img,src_img,FIX_CARD_SIZE);
    
  • 图片灰度化,图片的降噪处理:去除噪色提高比对效率

    • 图片压缩,加快图片扫描的速度
    • 图片提取灰度颜色分量,加快图片比对的效率 035911公式
    cvtColor(src_img, dst, COLOR_BGR2GRAY);
    
  • 灰度图片二值化:过滤掉颜色浅的区域,留下关键信息

    threshold(dst, dst, 150, 255, 0);
    
  • 图像膨胀:膨胀成一个块区域便于轮廓检测

    Mat erodeElement = getStructuringElement(MORPH_RECT, Size(20, 10));
    
  • 轮廓检测

    findContours(dst, contours, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
    
  • 图片分割

    rectangle(src_img, finalRect, Scalar(255, 255, 0));
    
  • 提取身份证核心区域

    Mat dst_img = src_img(finalRect);
    

3.Android openCV集成

3.1.将OpenCV头文件放置在main/cpp路径下面
3.2.配置CMakeLists.txt
cmake_minimum_required(VERSION 3.18.1)project("msopencv")
#引入头文件
include_directories(${CMAKE_SOURCE_DIR}/include)
#编译源文件
file(GLOB all_file  *.cpp *.c)add_library(msopencvSHARED${all_file})add_library( lib_opencv SHARED IMPORTED)
set_target_properties(lib_opencv PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}/libopencv_java3.so)find_library( log-liblog)target_link_libraries( # Specifies the target library.msopencvjnigraphicsandroidlib_opencv${log-lib})
3.3.通过native方法获取图片核心区域
/*** 获取图片身份证号核心区域*/
extern "C"
JNIEXPORT jobject JNICALL
Java_com_meishe_msopencv_ImageProcess_getIdNumber(JNIEnv *env, jclass clazz, jobject src,jobject config) {Mat src_img;Mat dst_img;//imshow("src_", src_img);/*将bitmap转换为Mat型格式数据*/Java_org_opencv_android_Utils_nBitmapToMat2(env, clazz, src, (jlong) &src_img, 0);Mat dst;/*无损压缩 640*400*/resize(src_img, src_img,FIX_IDCARD_SIZE);//imshow("dst", src_img);/*灰度化*/cvtColor(src_img, dst, COLOR_BGR2GRAY);//imshow("gray", dst);/*二值化*/threshold(dst, dst, 150, 255, CV_THRESH_BINARY);//imshow("threshold", dst);/*膨胀*/Mat erodeElement = getStructuringElement(MORPH_RECT, Size(20, 10));erode(dst, dst, erodeElement);//imshow("erode", dst);/*轮廓检测 arraylist*/vector< vector<Point> > contours;vector<Rect> rects;findContours(dst, contours, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));for (int i = 0; i < contours.size(); i++){Rect rect = boundingRect(contours.at(i));//rectangle(dst, rect, Scalar(0, 0, 255));  // 在dst 图片上显示 rect 矩形if (rect.width > rect.height * 9) {rects.push_back(rect);rectangle(dst, rect, Scalar(0,255,255));dst_img = src_img(rect);}}// imshow("轮廓检测", dst);if (rects.size() == 1) {Rect rect = rects.at(0);dst_img = src_img(rect);}else {int lowPoint = 0;Rect finalRect;for (int i = 0; i < rects.size(); i++){Rect rect = rects.at(i);Point p = rect.tl();if (rect.tl().y > lowPoint) {lowPoint = rect.tl().y;finalRect = rect;}}rectangle(dst, finalRect, Scalar(255, 255, 0));//imshow("contours", dst);dst_img = src_img(finalRect);}/*身份证核心区域生成bitmap*/jobject  bitmap = createBitmap(env,dst_img,config);src_img.release();dst_img.release();dst.release();return  bitmap;}

拿到图片核心区域,返回bigtmap

3.4.通过OCR识别图片上的身份证号信息
3.4.1初始化TessBaseAPI
 mSubscribe = Observable.just(1).observeOn(Schedulers.io()).subscribe(new Consumer<Integer>() {@Overridepublic void accept(Integer integer) throws Exception {Log.e("lpf","----doInBackground---");mTessBaseAPI = new TessBaseAPI();try {InputStream is = null;is = getAssets().open(mLanguage + ".traineddata");File file = new File(PathUtils.getTessDir()+File.separator + mLanguage + ".traineddata");if (!file.exists()) {file.getParentFile().mkdirs();FileOutputStream fos = new FileOutputStream(file);byte[] buffer = new byte[2048];int len;while ((len = is.read(buffer)) != -1) {fos.write(buffer, 0, len);}fos.close();}is.close();PathUtils.getTessDir();mTessBaseAPI.init(PathUtils.getRootDir(), mLanguage);} catch (IOException e) {e.printStackTrace();Log.e("lpf","----copy error:"+e.getMessage());}}
});
3.4.2识别图片上的号码
mTessBaseAPI.setImage(mResultImage);
mTvCardNumberView.setText(mTessBaseAPI.getUTF8Text());

总结:这样就通过OpenCV将身份证号识别出来了,其中traineddata数据是训练的结果,文案训练请查看

身份证号训练教程

源码地址

Android OpenCV 身份证识别实战相关推荐

  1. Android实现身份证识别

    Android实现身份证识别(印刷文字识别-身份证识别-阿里云) 在做实名认证的时候客户要求要自动识别身份证上的个人信息,我们使用的是阿里云的OCR印刷文字识别-身份证识别 阿里云的文档写的还是很清楚 ...

  2. android ocr 身份证识别

    ocr opencv 想必做过程图像识别的同学们都对这两个词不陌生吧. ocr (optical character recognition ,光学字符识别) 是指电子设备(例如扫描仪或数码相机)检查 ...

  3. android opencv 银行卡识别,NDK 开发之使用 OpenCV 实现银行卡号识别

    前言 在日常的开发中,我们有时会遇到添加银行卡的需求,这时候,产品可能会让你仿一下支付宝之类的相机扫描识别银行卡号.很多时候,做这样的需求会去找找稳定的第三方,本文通过 OpenCV 结合识别的需求带 ...

  4. 深度学习-服务端训练+android客户端物体识别实战(caffe入门教程+mobilenet+ncnn+android)

    文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术 公司业务需求 深度学习简介 深度学习的位置 深度学习概念 深度学习优势 深度学习基础知识 感知机 激活函数 多层感知机 卷积神经网络 ...

  5. 深度学习-服务端训练+android客户端物体识别实战(caffe+mobilenet+ncnn+android)

    文章目录 背景 物体识别简介 自动驾驶 淘宝京东使用物体识别技术 公司业务需求 深度学习简介 深度学习的位置 深度学习概念 深度学习优势 深度学习基础知识 感知机 激活函数 多层感知机 卷积神经网络 ...

  6. android opencv颜色识别,opencv学习(2)-简单颜色识别并跟踪

    本次来我们用opencv来实现识别跟踪蓝色物体并返回位置坐标的功能. 该功能分为两部分,识别颜色,跟踪颜色. 要想实现颜色的识别,我们要打开摄像头,读取捕获的图像.将图像的颜色通道转化为HSV,设置选 ...

  7. android opencv颜色识别,OpenCV学习——颜色识别的简单应用(一)

    第1步:获取到桌球台的图像信息 需要获取桌面固定区域的实时图像(这里为了方便,直接截取了一张图片) 第2步:识别出球杆和白球 创建滑条from cv2 import cv2 import numpy ...

  8. android opencv 银行卡识别,【opencv小应用】银行卡号识别(一)

    银行卡几何校正及卡号定位 一.首先看下效果:                                                                               ...

  9. 身份证识别Web系统(opencv)

    注:本项目为学习研究项目,不可用作其他用途 基于opencv身份证识别Web系统(界面清新版,Python代码) 已实现功能包括 摆正 + 识别 实现的大概过程: - 技术栈包括 前端:html + ...

最新文章

  1. Android中蓝牙的基本使用
  2. (C#)如何利用Graphics画出一幅图表
  3. 基于LBS功能应用的Geohash方案
  4. Win10系统开机任务栏一直转圈怎么解决
  5. Java基础入门笔记-字符串
  6. 概率论和数理统计 - 04 -
  7. java学习-BeanUtils给对象的属性赋值
  8. ABBYY FineReader 12扫描对页的步骤有哪些
  9. 三星oneui主屏幕费电_这或许是单手握持手感最佳的手机 三星Galaxy S20上手体验...
  10. 【转】推荐下载使用:功能强大的光盘刻录软件NERO 9.0中文版(最新官方原版+有效序列号)...
  11. 使用华为云WeLink,体验无纸化办公的这些优点
  12. 使用javaw在windows上部署jar包在后台运行,并关闭
  13. Linux下通过rdesktop连接Windows远程桌面
  14. 哪种台灯的灯光适合学生用?盘点真正适合孩子的护眼台灯
  15. 用Java实现一个台球小游戏
  16. U-boot下编写代码对SPI flash进行操作
  17. xstream 对象 -》xml
  18. 基于无线信号的手势识别研究现状调查
  19. execjs安装及相关问题解决
  20. 陕西万德信息科技面试题

热门文章

  1. can和could的用法_can和could的用法辨析
  2. Python 教你用OpenCV实现给照片换底色
  3. #云栖大会# 移动安全专场——APP渠道推广作弊攻防那些事儿(演讲速记)
  4. 区块链需要学习哪些东西_区块链入门需要学哪些知识?
  5. Python 将TXT格式转换为手机通讯录格式vcf
  6. anconda 下的pip路径_修改conda环境和缓存默认路径/修改Python 的 pip install 默认安装依赖路径/提高conda安装速度,其实就是改了下载源。...
  7. JAVA数组首位末位互换_数组元素前移,第一个元素放置数组末位
  8. Linux设置软件开机自启动的三种方式(中标麒麟、银河麒麟、ubuntu)
  9. 需求人员使用CQ的基本职责
  10. Python3,我把新年祝福写在“雨“中,你看,雨一直下,气氛还算融洽,在同个屋檐下....