银行卡扫描识别
Ctrip Tech
背景介绍:
图像识别是人工智能的一个重要领域 。为了编制模拟人类图像识别活动的计算机程序,人们提出了不同的图像识别模型。图像识别经历了三个阶段的发展:文字识别,数字图像处理与识别,物体识别。文字识别的研究是从1950年开始的,一般是识别字母,数字和符号,从印刷文字识别到手写文字识别,应用非常广泛。
随着智能手机兴起,手机支付的行为越来越普及。但是用户在手机上输入银行卡卡号时,速度很慢,需要仔细的校对,用户体验很差。美国的PAYPAL 、苹果公司,中国的阿里公司和腾讯都在自己的手机支付软件上推出了银行卡号识别的方案。
信用卡识别的一般流程:
项目介绍:
随着智能手机兴起,手机支付的行为越来越普及。但是用户在手机上输入银行卡卡号时,速度很慢,需要仔细的校对,用户体验不好。
某开源方案提供了信用卡卡号拍照输入的支持,本项目在开源项目的基础上增加对中国本地借记卡的支持。
本项目的主要目标是在开源方案的基础上,增加对中国本地的19位凹凸卡、平面卡、复杂背景的银行卡的卡号识别,达到或接近支付宝的识别率。
项目成果:
原开源方案只支持15位、16位信用卡,并且对于背景很浅的或者有复杂背景的15、16位信用卡不能识别。经过研究和分析,使用原开源方案框架,新增了19位银行卡的支持,解决了原来部分15、16位信用卡不能识别的问题。
解决哪几项主要问题:
1、黑色印刷体银行卡的纵坐标识别:
某些中国本地银行卡由于不使用凹凸字体而是用黑色印刷字体,原方案的原有的方式无法识别卡号的纵坐标,需要一种识别能力更强并且识别更准确的算法,以代替或者补充原算法,并使其不降低原方案对于原有凹凸卡的识别率。
通过研究图形识别的一般概念,我们了解 kitty 算法可以用于计算二值化的阀值。反向思考,如果我们规定阀值,那么kitty算法将能很好的计算图像边缘。
按照每行分别计算图像边缘的多少,我们将得到每一行的分数。连续的高分则被认为是银行卡卡号的纵坐标。
2、背景为浅色的凹凸字体的银行卡的纵坐标识别:
某些中国本地借记卡由于颜色太浅,原方案的原有的方式无法识别卡号的纵坐标,需要一种识别能力更强并且识别更准确的算法,以代替或者补充原算法,并使其不降低原有凹凸卡的识别率。
通过研究图形学的一般知识,我们了解Prewit算子能够很好的识别线段,我们使用了一些特殊的方法和特殊的限制针对银行卡做了一些优化,使其能够很好地检测前景字体。
具体的流程如下:
3、字体为黑色印刷体的背景过滤;
通过研究图形识别的一般概念, 我们了解二值化是区分前景背景的一般方法。但是对于复杂背景,对于相同眼感官的黑色,其实,其灰度值并不相同,所以使用各种算法选取合适的阀值、然后二值化的方法,可能无法取到合适阀值;换一种说法则是合适的阀值,根本不存在。我们需要一种新的方法,区分字体的前景和背景。
我们综合Laplace算子和二值化算法,提出一种新的算法。该算法能较好的过滤背景,还原字体;以达到识别的所需要二值化图像。
4、黑色印刷体的单字识别;
由于Card.IO不具备印刷字体的单字符识别能力,所以我们需要一种轻量的能适用于多种银行卡字符的单字符识别算法。
中国银行卡的印刷并不是特别规范,具体来说是有两种字体,字体大小是也在某种范围之内,所以单字符识别算法必须特征提取和模板匹配两种方式相结合的方式。
由于银行卡的字体大小在某种范围之内,特征提取选取比较简单的横投影和总投影的方式。
举例说明 0 的横投影可能是4、4、6、4 ,纵投影是2、3、4、3、4、4 ,依靠其特征匹配后,选取有相同特征的字符,再做模板匹配。
5、银行卡卡号的验证;
事实证明由于银行卡的背景,虽然经过多次扫描并统计概率 ,扫描银行卡的识别的正确率仍然无法达到用户所需的100%正确程度,所以识别的银行卡卡号必须经过校验。
由于18位银行卡不符合中国的银行卡的校验规范,所以也无法支持18位银行卡。
中国的银行卡规范确定银行卡号为19位,最后一位为校验位。校验位的值通过lihn算法计算前18位数字得出。
具体算法为:
1、所有的偶数位乘2 。
2、大于9的数字,个位数和十位数相加。
3、所有数字相加之和乘以9 。
4、其结果的个位数就是校验位。