Py学习  »  Python

opencv+python 机读卡识别

开源中国 • 6 年前 • 994 次点击  

长按上图识别二维码报名济南源创会


摘要: 通过随意一张机读卡的照片,识别其中选择题题号,选项,以及相关数字识别。这个系列的解决方案不止一种,调参的方法也是各种各样,反正能够满足需求就极好了

1.预处理


这次的机读卡识别项目来源暑期培训,主要包括内容一张手机拍摄的机读卡位置定位,识别其中选择题模块及少量数字识别,给出样例图片: 

预处理目的:

对于这个识别问题而言,把图像变成二值图应该是最简单粗暴的方法了。为了找准边界,才能良好切割。而对于边缘检测的函数也只能传入灰度图……

1.1.环境配置

环境是python3.5的,大体部分需要配置的是numpy+mlk版本,scipy,来支持opencv,另外辅助以imutils,这个包里面含有4点变换函数以及matplotlib来辅助绘图

1.2.图片预处理 为了方便找出图片的4个顶点,所以需要一次自适应二值化,为了使图片效果更好,所以在二值化之前还加了一层高斯滤波

2.图像切割


图像切割的目的是将图像定个便于识别的样子。比如这里四角变换结束以后会吧图像变为2400*2800的大小,无论是什么样的案例图片,都是这个格式,这样最后在局部分割,如选择题答案的识别和数字区域的确定这套程序才能有较好的通用性

2.1.边缘检测 

预处理得到二值图像就很容易做边缘检测了,找出4个点,方便之后的4点变换

顶点坐标的存放形式为3维数组,所以若想演示最大的4个顶点应做如下操作:

2.2.四点变换 

四点变换直接调用大佬写好放在imutils中的函数就好了。这里存了两个,一个原图一个灰度图,原图用来配合展示,灰度图用来支配

3.对选择题识别


3.1.对选择题图像部分预处理 

经过四点变换后的图像需要经过重新转换标准长宽,以便对选择题部分标定题号及答案。这里的图像定义为2400*2800 。选择题部分最大的特点是需要将黑块突出,以及过滤掉没填涂的选项,以便确认。预处理方法选择均值滤波及二进制二值化的方法。

3.2.寻找结果中黑块坐标

这里寻找坐标的目的是为了确定黑块所代表的题号及选项,用轮廓中心来进行描述

3.3.计算选择题题号及答案 

比较绕,主要还是根据取余和倍数关系

输出运算结果:

至此完成选择题部分 

4.数字识别,调用百度api


数字识别经过测试总的感觉还是可以。需要注意的地方是要对数字板块需要切割出来这样给机器会好认点,但也不能单个字拿出来。最好能有一串,同时也需要注意图片尺寸

4.1.对数字图像部分进行处理 

预处理部分同样需要,步骤与选择题模块相似,但目的不同,文字部分主要将数字变粗,便于识别。其实也就是和选择题模块相比变了几个参数

4.2.调用百度ocr api 

试过多种检测方式,还是用别人家现成的好http://apistore.baidu.com/ 百度api使用方法: 首先需要注册一个百度云账号,这样在个人中心里就会看到apikey。这个就是和百度进行交流的钥匙。然后找到百度ocr的入口找到接口地址。虽然这里给出了但还是可以看下文档,里面有些细节,比如图片想免费就要300k以内。上面给的python示例代码是py2的,这里给出py3的方式(http://apis.baidu.com/idl_baidu/baiduocrpay/idlocrpaid)

4.3.切割图片 

根据具体情况需要切割图片才能让百度api识别,具体限制因素还是图片大小,切割方式,这里只给出示例

之后调用,若识别为英文需要转化,比如可能将0识别为D,这时转换即可,如:

效果如图展示  当然若是能想办法去掉答题卡外围边框效果应该会更好……


更多干货请前往公众号菜单栏“读我”->“干货分享”查看。


推荐阅读

轻松建站,20 个 PHP 开源内容管理系统(CMS)推荐

Go 语言飚升至前十,Java 暴跌 6.03%

如何理解并正确使用 MySql 索引

默默维护 30 年,glibc 创始人兼维护者辞职

点击“阅读原文”查看更多精彩内容


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/U5GdWWkjHT
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2629
 
994 次点击