参考了很多网上的博客资源,有些只讲了如何提取身份证区域,有些只讲了如何做训练集。我将各个方法做了一些筛选和整合。身份证素材均来自网络。

实验目标
完成身份证识别程序,通过输入一张身份证图片,可以自动识别其身份证号码等信息。
软件环境
Opencv4.2+MFC
实现思路
1、 通过降噪、增强、计算阈值二值化输入的身份证图片,经过轮廓提取出身份证号所在的区域。
2、 整理训练集所用的身份证图片,反复利用(1)中方法切割提取出身份证上身份证号码的数字二值化图像,并依次整理分类至0~X的标签作为训练集。
3、 利用SVM支持向量模型,通过训练集的图像数据训练得识别模型。
4、 输入测试集的身份证图片,同样通过(1)中的过程提取出每个数字的二值化图像,通过(3)中的SVM进行预测识别,最终提取得出身份证号码。
实现过程

为了方便,测试集测试和训练集的相关操作都放在一个对话框上完成。

选择一张光线正常、角度正常的身份证照片,将其缩放至合适大小。

 //转灰度cvtColor(dst, dst, COLOR_RGB2GRAY);// 二值化图,主要将灰色部分转成白色,使内容为黑色threshold(dst, dst, 165, 255, CV_THRESH_OTSU);

将图片转成灰度图,并利用OTSU阈值算法进行二值化。

 // 中值滤波,用于降噪medianBlur(dst, dst, 3);// 腐蚀操作,主要将内容部分向高亮部分腐蚀,使得内容连接,方便最终区域选取erode(dst, dst, Mat(16, 16, CV_8U));

通过medianBlur()中值滤波进行降噪,通过erode()腐蚀将数字和文字相连接,方便进行区域选择。

 //定义变量vector<vector<Point>> contours;vector<Vec4i> hierarchy;//轮廓检测findContours(dst, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);//身份证号的裁剪区域Mat result;Rect id_rect;for (int i = 0; i < hierarchy.size(); i++){Rect rect = boundingRect(contours.at(i));// 定义身份证号位置大于图片的3/4,并且宽度是高度的6倍以上if (rect.y > raw.rows * 3 / 4 && rect.width / rect.height > 6 && rect.width / rect.height < 12){id_rect = rect;}rectangle(raw, rect, Scalar(255, 0, 255));}imshow("轮廓图", raw);resize(m_image, raw, Size(w_a, w_a*h / w));result = raw(id_rect);imshow("身份证号", result);

通过findContours()寻找连通图的轮廓,利用身份证号区域的长宽特殊性进行裁切,取出身份证号的区域。


 // 身份证转灰度cvtColor(result, result, COLOR_RGB2GRAY);threshold(result, result, 165, 255, CV_THRESH_OTSU);// 中值滤波,用于降噪medianBlur(result, result, 3);imshow("二值化后", result);vector<Mat> numbers = getSplitNumber(result);vector<int> predict_numbers;Ptr<SVM> svm = SVM::load(m_train_data_folder + "\\svm.xml");for (Mat number : numbers){number.convertTo(number, CV_32FC1);              // 转换为 float 类型单通道图片float res = svm->predict(number.reshape(1, 1));// 预测结果predict_numbers.push_back(res);}String id = "";for (int number : predict_numbers){id += number == 10 ? 'X' : (number + '0');}GetDlgItem(IDC_EDIT1)->SetWindowTextW((CString)id.c_str());

训练集生成

利用GetSplitNumber()函数,输入的Mat图像为截取出的身份证区域,返回一个数组,每个元素为切割出来的符合规范的数字图像。
因SVM模型训练的要求,每份图片都需要长宽像素相等。故设定25*25的训练集数据大小,运用对于大小不符的数据进行四边的黑色像素填充,需要注意Mat数据的通道问题。
最终在指定文件夹下输出了训练集数据,并将其分类至相应的0-X的文件夹下。

 Mat trainImages;                            // 训练数据vector<int> trainLabels;                   // 训练标签Ptr<SVM> svm = SVM::create();svm->setType(SVM::C_SVC);svm->setKernel(SVM::LINEAR);svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));int classes[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };   // 10 代表 Xstd::vector<cv::String> filenames;Mat img;for (auto x : classes)                        // 遍历每个分类文件夹{filenames.clear();cv::glob(m_train_data_folder + "\\" + to_string(x), filenames);      // 获取该分类文件夹的所有图片for (auto file : filenames)                 // 读取该类图片{img = imread(file, 0);               // 读取灰度图if (img.empty()) continue;          // 判断是否为空threshold(img, img, 10, 255, THRESH_OTSU); // 二值化img.convertTo(img, CV_32FC1);     // 转换为 float 类型单通道图像trainImages.push_back(img.reshape(0, 1));// 图片转化为一行 加入训练数据中trainLabels.push_back(x);            // 保存对应图片标签}}img.release();                             // 释放 img 占用的内存// 训练svm->train(trainImages, ROW_SAMPLE, trainLabels);// 训练模型svm->save(m_train_data_folder + "\\svm.xml");  //保存模型svm->clear();trainT.stop();

模型训练部分的关键代码。

部分测试集结果


【opencv+mfc】实现身份证上的身份证号识别相关推荐

  1. 实战24:基于opencv神经网络Flask实现口红图片色号识别及商品推荐系统 附完整版代码

    根据上传的图片自动化图像处理后分析脸部特征,并判断其嘴部妆容状态,依托现有大数据分析,识别其口红色号,并推荐相关商品,通过 Flask 服务器框架返回到网页前端并动态呈现 直接看效果图 运行方式:运行 ...

  2. c++ 图片验证码识别_基于tensorflow 实现端到端的OCR:二代身份证号识别

    最近在研究OCR识别相关的东西,最终目标是能识别身份证上的所有中文汉字+数字,不过本文先设定一个小目标,先识别定长为18的身份证号,当然本文的思路也是可以复用来识别定长的验证码识别的. 本文实现思路主 ...

  3. rhel 8.2不识别unicode_基于tensorflow 实现端到端的OCR:二代身份证号识别

    最近在研究OCR识别相关的东西,最终目标是能识别身份证上的所有中文汉字+数字,不过本文先设定一个小目标,先识别定长为18的身份证号,当然本文的思路也是可以复用来识别定长的验证码识别的.本文实现思路主要 ...

  4. python 调c++生成的dll 中识别char *_基于tensorflow 实现端到端的OCR:二代身份证号识别...

    最近在研究OCR识别相关的东西,最终目标是能识别身份证上的所有中文汉字+数字,不过本文先设定一个小目标,先识别定长为18的身份证号,当然本文的思路也是可以复用来识别定长的验证码识别的. 本文实现思路主 ...

  5. 上传身份证照片js_国际快递为什么需要上传身份证,怎么上传?

    因为涉及到个人信息,我被问到了好多关于上传身份证的问题,现在慧子帮你一一解答,如果没有完全解答您的问题,可以微信私聊- 问题1:为什么国际快递需要上传身份证件? 问题2:上传身份证安全么? 问题3:怎 ...

  6. 物联卡要求上传身份证实名认证安全吗,不认证无法使用

    为什么物联网卡有的需要身份证实名有的不需要身份证实名呢,这个也是目前很多朋友都遇见的问题,如果实名的话是否安全?关于对物联网卡的实名问题,51物联卡小编有话要讲. 近日,有朋友咨询小编买了一张物联卡, ...

  7. 身份证过期了,银行卡上的身份证信息是不是都要去银行更新?

    身份证过期后,不但严重影响银行卡的正常使用,而且还将被中止第三方快捷支付交易(不包含微信.支付宝提现).所以说,身份证过期,一般银行都会以短信的方式告知客户并且提醒客户及时更新证件信息. 众所周知,目 ...

  8. 电商收付通,商户进件,上传身份证、营业执照自动识别相关信息

    作为开发者,当然希望开发的系统,对使用者能够更友好,使用的越简单,越方便越好,缩短工作时间,提高效率.也可以说是一种使用体验,体验效果越好那当然说明系统越棒了. 二级商户进件的时候,需要提交的资料不少 ...

  9. Android平台上实现身份证识别(通过阿里云Api-印刷文字识别_身份证识别)

    Android平台上实现身份证识别(通过阿里云Api-印刷文字识别_身份证识别) 一: 前言 继上一篇文章有段时间了,上一篇文章的身份证和银行卡的识别时通过本地的opencv库,tess-two库识别 ...

最新文章

  1. 【Android Gradle 插件】Gradle 映射文件 ( settings.gradle 映射为 Settings 类 | build.gradle 映射为 Project 类 )
  2. jQuery 自定义事件的学习笔记
  3. 【转】摩托罗拉推开源硬件平台计划Project Ara
  4. java中类与方法叙述正确的是
  5. vue2.0 element学习
  6. 4-2 数据模型的生成
  7. 最简单的视频编码器:基于libvpx(编码YUV为VP8)
  8. Mac升级macOS Big Sur之前如何优化并增加内存空间?
  9. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。
  10. Word批量设置章节为标题格式
  11. 【SPIE独立出版∣IEEE Fellow特邀主讲】人工智能、网络等多主题征稿
  12. 承包一座山能做什么_您为什么没有得到最好的承包商,又能做些什么(第2部分)...
  13. Python获取指定月份的所有天数
  14. 算法提高 解二元一次方程组
  15. 关于爱情的英文经典名言
  16. python元类_Python基础:元类
  17. ★Kali信息收集★8.Nmap :端口扫描
  18. 【机器学习】有监督、无监督、自监督、半监督、弱监督的区别
  19. 在深圳转户口这件小事
  20. 什么是VMware VSP和VTSP

热门文章

  1. 值得推荐的技术类微信公众号汇总
  2. android acfun,AcFun弹幕视频网
  3. 【9】tensorflow下图像预处理之图像批量处理
  4. 基于保角形变换的电磁波导波结构设计
  5. lightroom使用小结八 调整作品 笔刷滤镜局部调整
  6. matlab符号数字计算,Matlab:有没有办法加快计算数字的符号?
  7. 邀请好友我赚了1026个集分宝 分享庆祝下
  8. Photoshop教程:将室内照片转为卡通手绘
  9. 从UI层到硬件层优化Android应用
  10. 权威发布 鸿蒙涅槃,鸿蒙涅槃 曾圣《鸿蒙》雕塑走进河北美院受追捧