张伟超, 肖中俊, 严志国. 基于Opencv和Tesseract的行驶证识别系统设计[J]. 齐鲁工业大学学报, 2020, 34(1): 47-52. DOI: 10.16442/j.cnki.qlgydxxb.2020.01.009 

ZHANG W C, XIAO Z J, YAN Z G. Design of Vehicle License Identification System Based on OpenCV and Tesseract[J]. Journal of Qilu University of Technology, 2020, 34(1): 47-52. DOI: 10.16442/j.cnki.qlgydxxb.2020.01.009 

基于Opencv和Tesseract的行驶证识别系统设计 [PDF全文]

张伟超, 肖中俊, 严志国

原来网址:http://www.xml-data.cn/QLGYDXXB/html/354e8da7-9db3-4a70-bc1e-c13cf5b59728.htm

摘要:为了解决行驶证识别困难、识别率低的问题,设计了一套基于OpenCV和Tesseract的行驶证检测和识别系统。首先,利用OpenCV中的高光抑制、图像增强和分块最大类间差法对行驶证进行图像预处理;然后,对图像采用透视变换并将行驶证内芯裁剪下来,经过局部高斯阈值分割,得到清晰的文字;最后,采用Tesseract训练样本并结合单字识别模式,降低了噪点和中英文混合的干扰。测试结果表明,该方法结合优化策略的长短时记忆网络(LSTM)的识别正确率能达到94.1%。

关键词:行驶证    光学字符识别    开源计算机视觉库    长短时记忆网络

Design of Vehicle License Identification System Based on OpenCV and Tesseract

ZHANG Wei-chao, XIAO Zhong-jun, YAN Zhi-guo

Abstract: In order to solve the problem of difficulty and low recognition rate of vehicle license, a set of detection and recognition system based on OpenCV and Tesseract was designed.Firstly, OpenCV is used to preprocess the driving license image, especially the high-light suppression, image enhancement and block OTSU algorithm.Then, the image is transformed by perspective and cut off the inner core of driving license.After local Gaussian threshold segmentation, clear text is obtained.Finally, Tesseract is adopted for training and character recognition.In order to reduce noise and interference caused by Chinese-English mixture, the system adopts single-word recognition mode.The test results show that the recognition accuracy of LSTM can reach 94.1%.

Key words: driving license    optical character recognition    opencv    long short term memory

行驶证作为一种常用证件, 在车险理赔、二手车交易、违章处理、汽修保养等行业频繁使用, 但是行驶证不像银行卡一样可以刷卡识别, 常规采集行驶证信息的方式是手动登记, 这种方式存在低效率和易出错的问题[1]。随着光学字符识别技术(optical character recognition, OCR)[2]的迅速发展, 行驶证OCR逐渐进入市场, 帮助人们完成一些繁杂的证件录入工作。对百度、腾讯、阿里巴巴等开放平台的API进行测试, 准确率在95%左右。

由于行驶证特殊的防伪技术和套打样式, 行驶证的OCR识别存在以下难题:1)打印颜色有深浅, 有时候过深, 有时候过浅;2)信息错位, 内容信息和表格粘连;3)行驶证外套塑料薄膜反光;4)防伪底纹干扰。以上平台的OCR-API对不同程度的反光、倾斜等情况下, 准确率下降到80%左右。

该设计最终采用OpenCV[3]、Tesseract[4]、Python[5]进行算法设计, 通过改进图像处理算法, 改善了反光和倾斜的问题。

1 行驶证图像预处理1.1 转灰度图

灰度图(grey scale image)又称灰阶图, 是一幅只含亮度信息, 不含色彩信息的图像, 与原彩色图像比较, 它只有一个通道, 图像中每个像素其实就是亮度值(Intensity), 这样图像处理计算量也相应大幅减少[6]。要表示灰度图, 就需要把亮度值进行量化, 简单来说, 就是把彩色图像3个通道的分量按照一定的比例计算到灰度图像中, 通常将灰度值划分到0至255范围内, 其中0代表最暗, 255代表最亮。从RGB到灰度图转换公式为:

Gray=0.299R+0.587G+0.114BGray=0.299R+0.587G+0.114B (1)

1.2 高斯滤波

行驶证的防伪底纹对于提取内芯区域影响较大, 为了排除防伪底纹的干扰, 本文对灰度图采取高斯平滑滤波处理, 使得内芯的底纹背景融为一体, 便于进行阈值分割。我们把概率密度函数服从正态分布的噪声称为高斯噪声, 底纹大致符合正态分布, 因此可以当作高斯噪声进行处理。高斯滤波是一种用来消除高斯噪声的线性平滑滤波器, 所以可以使用它来模糊内芯的防伪底纹[6], 因为高斯滤波器具有滤除高频的特性, 因此也可以理解为一个低通滤波器。

高斯滤波是用一个掩模逐行逐列地扫描图像, 掩模其实就是权重矩阵, 离掩模中心越近的像素权重越高, 其运算实质是把掩模中心像素点的灰度值设置为掩模覆盖的区域内像素的加权平均灰度值。因此高斯滤波的平滑效果比均值滤波更加柔和, 而且边缘保留效果更好。

1.3 局部高光抑制

行驶证外面的薄膜极易反光, 在阳光、灯光下会形成局部镜面反射, 呈现在图像上的是高亮光斑, 一般出现在内芯边缘, 面积不大, 但是影响边缘检测, 所以可以先通过OpenCV的局部亮度改变算法(Illumination Change)削弱局部镜面反射对边缘的影响[7]。参数分别是源图(source)、掩码(mask)、结果图(result)、系数(α, β), 乘数范围在0~2之间, 0比较清晰, 2比较模糊。

1.4 图像增强

由于部分图像背景和主体对比较弱, 难以设置合适的灰度阈值, 所以对灰度图像采取图像增强处理, 使内芯明显地区别于背景, 达到增强对比度的效果。

本文采用是单尺度SSR(Single Scale Retinex)图像增强算法, Retinex是一种图像增强理论的统称, 它是retina(视网膜)和cortex(皮层)两个单词的组合[8]。记一幅给定的图像为S(xy), 单尺度SSR算法将该幅图像分解为反射图像R(xy)和亮度图像L(xy)两个图像, 由此可以得到单尺度SSR的公式为:

S(x,y)=R(x,y)⋅L(x,y)S(x,y)=R(x,y)⋅L(x,y) (2)

定义一个高斯函数G(xy), C为高斯环绕尺度, λ是一个尺度且满足以下条件。

G(x,y)=λℓ−(x2+y2)2,∬G(x,y)dxdy=1G(x,y)=λℓ−(x2+y2)2,∬G(x,y)dxdy=1 (3)

得到增强后的图像, R(xy)是输出图像, *代表卷积符号:

R(x,y)=logS(x,y)−log[F(x,y)∗S(x,y)]R(x,y)=log⁡S(x,y)−log⁡[F(x,y)∗S(x,y)] (4)

本文的SSR算法通过OpenCV for Python实现, 图像增强对比效果图如图 1所示, 单尺度SSR算法能在保持原始图像平均亮度的同时较好地增强灰度图对比度, 使得行驶证内芯背景与边缘黑白分明, 便于进一步阈值分割。

图 1 图像增强对比图

2 提取证件内芯区域2.1 OTSU阈值分割

行驶证经过以上图像预处理之后, 内芯和背景的对比度明显, 分界线清晰, 但是受不均匀光照影响, 直接采取阈值分割, 无法适用于多样的拍摄环境, 本文采取分块最大类间差法(OTSU)算法, OTSU阈值分割算法是根据灰度图像的全局特性, 找到一个合适的阈值将图像划分为背景和前景, 也就是求取直方图中两个峰值之间的最小值[9]。类间方差越大代表图像的背景和前景的差别越大。本设计将灰度图像分成9块, 逐个采用OTSU算法进行阈值分割, 经过二值化的图像如图 2所示。

图 2 采用分块OTSU算法的二值化对比图

然后采取无级别寻找轮廓, 并选取最大轮廓。在opencv里对应的函数为:findContours, 通过for循环对每个轮廓的面积(contourArea)比较, 找到最大轮廓。

2.2 直线拟合

通过drawcontours对轮廓内外所有区域均填充0(全黑), 并绘制宽6 pixl的白色轮廓线。通过arcLength和approxPolyDP找到四个轮廓拟合点, 将轮廓断开, 筛选出最长的四条轮廓线, 把白色的轮廓线看成一组点, 对每条实线分别直线拟合(fitLine), 拟合出四条直线。在OpenCV中采用的直线拟合是HUBER算法。公式(5)中, 记点到直线的距离函数ρ(r), 一个点(xy)到直线的距离为r, 其中C=1.345。

ρ(r)={r22C(r−r2)ifr<C,oterwise.ρ(r)={r22ifr<C,C(r−r2)oterwise. (5)
图 3 直线拟合

直线拟合效果如图 3所示。在获取四条拟合直线后, 利用getCrossPoint获取四条直线的交点(a, b, c, d)并排序, 行驶证内芯比例宽高比为8.8:6, 本文将内芯尺寸设置为1 760*1 200 pix。

2.3 透视矫正

OpenCV提供了两种图片变换的方式:仿射变换和透视变换, 两者的区别很容易区分, 前者是将矩形的图片变成平行四边形, 而后者是将图片变成梯形。这两种变换虽然都有各自的应用场景, 但在实际的图片变换中由于透视效应的存在, 后者的使用更加普遍[10]。

采用手机拍摄行驶证照片的时候, 受相机角度和高度的影响往往会拍出梯形的照片, 如图 4左图所示, 这样的照片不仅不够美观而且给文字识别带来较大难度, 将梯形的图片转换成标准的矩形就要对图片进行透视变换。透视变换实质上就是通过矩阵运算将图像投影到一个新的平面上, 通用的变换公式为:

[x′,y′,z′]=[u,v,w][T1T3T2a33][x′,y′,z′]=[u,v,w][T1T2T3a33] (6)
T=[T1T3T2a33]=⎡⎣⎢a11a21a31a12a22a32a13a23a33⎤⎦⎥T=[T1T2T3a33]=[a11a12a13a21a22a23a31a32a33] (7)

T1、T2、T3分别对应线性变换、透视变换、图像平移。透视变换的数学表达式为:

x=x′w′=a11u+a21v+a31a13u+a23v+a33x=x′w′=a11u+a21v+a31a13u+a23v+a33 (8)
y=y′w′=a12u+a22v+a32a13u+a23v+a33y=y′w′=a12u+a22v+a32a13u+a23v+a33 (9)

由2.2直线拟合求得的(a, b, c, d)和(a′, b′, c′, d′)四对像素点坐标, 即可求得透视变换矩阵。透视变换效果图如图 4所示。

图 4 透视变换

3 字符裁剪与分割3.1 二值化

在数字图像处理中, 图像的二值化(Image Binarization)主要是为了凸显感兴趣区域的轮廓, 方便进一步便于检测轮廓。灰度图的0代表全黑, 255代表最亮, 二值化就是要将图像像素点的灰度值比阈值小的置为0, 比阈值大的置为255, 使得灰度图呈现出黑白分明效果。有时为了选择暗处会设置反向(INV)。二值化包括全局二值化和局部二值化两大类。

全局二值化方法(Global Binariztion Method)只设置一个阈值划分整张图的前景和背景, 是否将像素点判定为前景点取决于该点的灰度值是否大于给定的阈值。平均灰度法、固定阈值法、OSTU方法和直方图法是常用的全局二值化方法。

局部二值化方法(Local Adaptive Binarization Method)又称为自适应二值化, 是通过分析像素点的邻域来计算该点的阈值[11]。如果灰度级高于阈值则将点视为背景点处理, 否则作为前景点处理。常见的局部二值化有自适应中值阈值分割、自适应高斯阈值分割。

采取局域自适应高斯阈值分割, 可以排除底纹的干扰, 如图 5所示, 自适应高斯阈值分割的效果明显好于自适应中值阈值分割和全局阈值分割。

图 5 局部阈值分割效果图

3.2 字条裁剪

行驶证打印的信息共有十条, 它们在行驶证上的范围是一定的, 所以可以根据相对原点的位置坐标定位文本行, 本设计中采用数组记录字条坐标, 通过for循环将文本行逐一裁剪成字条并保存到一个文件夹中, 按顺序命名, 便于查找。在Python中裁剪图片只需要知道字条相对于原点的左上角坐标(x0, y0)和右下角坐标(x1, y1), 最终裁剪效果图如图 6所示, 在这里为了节省空间, 特意将字条组合在了一起。

图 6 裁剪效果图

3.3 字符分割

由于行驶证印刷质量不统一, 颜色过浅会导致阈值分割的时候产生底纹噪点, 位置偏移会造成文字和虚线粘连, 这两个问题对文字识别的准确度影响较大, 处理起来也比较困难。

经验发现, 虚线点在文字下方, 并且比字符小, 所以可以判断面积大小筛选掉, 尽可能地将孤立的虚线点清除, 同时也可以清除掉底纹噪点, 这样可以排除虚线粘连的干扰。但是还是会有一小部分粘连, 所以后续采用单个文符识别的模式进行识别。

图 7 汉字、英文、数字的分割效果图

字符分割前先进行8*8的闭运算, 以避免左右结构的汉字被分割成两个字符。先采取竖向垂直投影分割[12], 然后再对单个字符采取横向垂直投影分割, 在分割前都需要进行一次闭运算, 主要是为了避免单个字符被误判为两个字符, 分割效果图如图 7所示。

4 文字识别4.1 Tesseract和LSTM介绍

本文使用的Tesseract4.0是一款文字识别引擎, 它的核心是长短时记忆网络(LSTM)[13]。LSTM是一种改进的循环神经网络(RNN), 它在实践中不需要付出很大代价就可以记住长期的信息, 完美解决了普通RNN在实际应用中很难处理长距离文本的缺陷, 这也是它本身具有的能力。LSTM示意图如图 8所示, LSTM设计思路简单, 但结构复杂, 基础LSTM网络一般包含三个门(输入门、遗忘门、输出门)和一个神经元细胞。LSTM示意图如图 8所示, t时刻, LSTM有三个输入:当前时刻输入值xt、上一时刻输出值ht-1和上一时刻的细胞状态ct-1;LSTM有两个输出:当前时刻输出值ht和当前时刻的细胞状态ct。

图 8 LSTM示意图

4.2 训练字符识别库

行驶证上的字体和一般字体不同, 数字和英文是专用防伪字体, 汉字是宋体, 但是由于各个地方印刷质量不同, 有深有浅, 有粗有细, 经过二值化处理后的字体和常规字体差别较大, 表现为轮廓粗糙、断点、粘连等, 所以只有选择单独训练库。通过程序批量二值化1万张图片, 并将裁剪的字条保存作为训练样本, 最终将样本训练成两个库, 一个是汉字库, 一个是英文数字库。

在实验中, 采用jtessboxeditor训练文字库。如图 9所示, 训练过程相对简单, 但工作量大, 耗时两个多星期, 主要是对box文件进行逐一矫正。最终将几个文件合并为trainddata文件, 也就是训练的库。将trainddata文件放置到tessdata文件夹, 就可以正常引用此文字识别库了。

图 9 训练和矫正过程示意图

4.3 识别过程与效果

Tesseract对于中文字符的识别不太友好, 经常将1个汉字识别为两个汉字, 造成识别信息错乱, 本文将头文件(tovars.h)里的文字间距变量(textord_dotmatrix_gap)设置为合适的数值。中文字符和汉字和英文的区别是汉字为趋近方形, 英文和数字为瘦长型, 因此可以根据轮廓的长宽判断是哪一类, 对于汉字采用汉字库进行识别, 英文和数字采用数字和英文识别库判断, 增加识别成功率。

从表 1识别率对比看出, Tesseract自带库识别率极低。经过训练后的库与百度API开放平台的API进行对比测试, 训练库和算法结合的识别效果在边缘反光和倾斜方面比百度API略高, 但是对于打印偏移和字体过浅问题识别效果较差。正常情况下识别率达到94.1%。图 2的最终识别结果保存到文本文件中, 结果如图 10所示。

表 1 识别率对比
 
图 10 最终识别效果图

5 结论

本文设计了一种行驶证识别系统, 主要包括四部分:图像预处理, 图像矫正, 字符切割, 字符识别。经过测试, 本文采取的文字定位和识别方法效果良好, 能适用于普通手机拍摄的照片, 平均识别率达到94.1%。但是对于一些恶劣情况, 例如:打印颜色浅、文字偏移严重、边缘不全等, 无法精确识别, 后续将针对这些问题对系统加以改进。

参考文献

[1]

李亮.基于Tesseract_OCR的驾驶证识别系统设计与实现[D].成都: 电子科技大学, 2018. http://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CMFD&filename=1018708658.nh

[2]

IMAD Q H, ZEYAD Q A. Enhanced ensemble technique for optical character recognition[M]. Switzerland: Springer International Publishing, 2018: 23-30.

[3]

AMIN A T. Computer vision with opencv3 and qt5[M]. Iran: Packt Publishing, 2018: 89-99.

[4]

FLORIAN R, THOMAS S. Time-drifts in event streams using series of evolving rolling averages of completion times[J]. Information Systems, 2018, 15(3): 130-135.

[5]

韩晓冬, 王浩森, 王硕, 等. Python在图像处理中的应用[J]. 北京测绘, 2018, 32(03): 312-317.

[6]

RAFAEL C, GONZALE Z. Digital image processing[M]. Beijing: Publishing House of Electronics Industry, 2008: 110-117.

[7]

郑红波, 石豪. 光照不均匀的结构光图像的条纹快速提取方法[J]. 计算机科学, 2019, 46(05): 272-278.

[8]

张诗.基于Retinex理论的图像与视频增强算法研究[D].南京: 南京邮电大学, 2018.

[9]

赵世峰, 何皙健. 基于OpenCV的复杂环境下图像二值化方法[J]. 电子测量技术, 2018, 41(06): 55-59.

[10]

MIKKO H, LASSE M, STEPHEN K. Multi-sided market places and the transformation of retail:A service systems perspective[J]. Journal of Retailing and Consumer Services, 2019, 49(1): 380-388.

[11]

BILAL B, SITI N. An adaptive local binarization method for document images based on a novel thresholding method and dynamic windows[J]. Pattern Recognition Letters, 2011, 32(14): 1803-1805.

[12]

冉令峰. 基于垂直投影的车牌字符分割方法[J]. 通信技术, 2012, 45(04): 89-91. DOI:10.3969/j.issn.1002-0802.2012.04.029

[13]

YU L Z, REN J H. Long short-term memory networks for CSI300 volatility prediction with baidu search volume[J]. Concurrency and Computation:Practice andExperience, 2019, 31(10): 1-7.

基于Opencv和Tesseract的行驶证识别系统设计相关推荐

  1. OCR-基于OpenCV、Tesseract的银行卡号识别

    title: 'OCR:基于OpenCV.Tesseract的银行卡号识别' type: categories date: 2016-12-01 16:50:30 categories: OC tag ...

  2. 图像处理项目——基于机器视觉技术的人脸在线识别系统设计

    基于机器视觉技术的人脸在线识别系统设计 本设计研究人脸检测与识别技术,在基于机器视觉技术上,构建了一套人脸在线检测识别系统,系统将由以下几个部分构成:计算机图像预处理.数据收集和预处理. 人脸图像定位 ...

  3. 基于 SoC 的卷积神经网络车牌识别系统设计(3-1)基于 Python 编程的车牌识别预处理、定位、分割、缩放的效果一览

    引言         这是一个在基于 OpenCV 的 Python 程序下,整体车牌定位.分割.识别的各个步骤的处理结果的展示,相当于算法的验证,只有先在软件上经过正确的严格的验证,才能进行硬件上的 ...

  4. python读取视频流做人脸识别_基于OpenCV和Keras实现人脸识别系列——二、使用OpenCV通过摄像头捕获实时视频并探测人脸、准备人脸数据...

    基于OpenCV和Keras实现人脸识别系列手记: 项目完整代码参见Github仓库. 本篇是上面这一系列手记的第二篇. 在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,而 ...

  5. html5摄像头手势识别,基于OpenCV的摄像头动态手势轨迹识别及其应用

    [实例简介] 基于OpenCV的摄像头动态手势轨迹识别及其应用,前沿的研究,最新论文 2012 B_0% random t Xo X,XX 4_1.42.B0 Bhattacharyya glsl. ...

  6. 基于opencv和pillow实现人脸识别系统(附demo)

    更多python教程请到友情连接: 菜鸟教程https://www.piaodoo.com 初中毕业读什么技校 http://cntkd.net 茂名一技http://www.enechn.com p ...

  7. python人脸识别opencv_Python基于Opencv来快速实现人脸识别过程详解(完整版)

    前言 随着人工智能的日益火热,计算机视觉领域发展迅速,尤其在人脸识别或物体检测方向更为广泛,今天就为大家带来最基础的人脸识别基础,从一个个函数开始走进这个奥妙的世界. 首先看一下本实验需要的数据集,为 ...

  8. 基于 SoC 的卷积神经网络车牌识别系统设计(2-1)基于 Arm Cortex-M3 SoC 车牌识别系统的搭建

    基于 SoC 的卷积神经网络车牌识别系统设计(2-1)基于 Arm Cortex-M3 SoC 车牌识别系统的搭建 版权所有, ⌊ 新芯设计 ⌉ \lfloor新芯设计\rceil ⌊新芯设计⌉,转载 ...

  9. 基于opencv的人脸检测与识别(python)(1)

    基于opencv的人脸检测与识别(python语言)(1) 人脸检测和识别技术就目前而言,已经相对成熟,各类算法层出不穷,这都归功于各位奋斗在一线的大佬的努力(站在巨人的肩膀上的感觉就是爽).本文是参 ...

  10. 基于机器视觉技术的条形码在线识别系统设计

    本文来自公众号"AI大道理". 这里既有AI,又有生活大道理,无数渺小的思考填满了一生. 本设计研究EAN13条形码识别的译码技术,在基于机器视觉技术上,构建了一套条形码在线检测识 ...

最新文章

  1. svn的merge,解决冲突
  2. Jmeter JDBC请求-----数据库读取数据进行参数化 通过SSH跳板机连接数据库
  3. 不只是舒适,简直是享受,Google公司用的腰靠,到底有什么秘密?
  4. jQuery最简单的留言功能^-^
  5. SQL Server 2005中的分区表(四):删除(合并)一个分区
  6. 寒假作业 使用xmind脑图小结课程内容
  7. MySQL:MySQL基础(一)
  8. 云速建站_华为云域名专场钜惠,助推中小企业云速建站
  9. 全国省份、城市、地区全数据(SQL版与XML版)包括各城市邮编
  10. c语言程序设计立体化教程,C语言程序设计立体化教程
  11. SQL数据表中按中文数字一二三四五排序
  12. c语言铺地板,【北理乐学】铺地板
  13. inventor牙距_10 INVENTOR螺纹特征,是否有何设置,可让螺纹类型默认为GB Metric
  14. 计算机发展英文文献,计算机技术发展英文参考文献 计算机技术发展论文参考文献哪里找...
  15. Vue+el-table实现不规则表格
  16. c语言对数组取反,C语言中按逆取反是什么意思
  17. MyEclipse2014用外部的浏览器运行web项目
  18. python plt画图_【Python】 【绘图】plt.figure()的使用
  19. WPS表格 JSA-单格内,按文字颜色处理文字
  20. window xp 自动登陆系统

热门文章

  1. Linux 部署turnserver
  2. 乐高ev3搭建图_你所不知道的乐高EV3发展史
  3. php api权限,如何设计RESTful的API权限
  4. EDFbrowser查看edf文件及睡眠分期认识
  5. 13M initrd .config ubuntu 4.15.18
  6. jrtplib 打包做了哪些事_使用jrtplib打包发送h264数据,关使用vlc|mplayer播放 | 学步园...
  7. 视频教程-8086汇编语言讲座-其他
  8. uipath数据爬取(结构化数据)
  9. smarty 模板php,PHP 模板之Smarty 模板介绍
  10. eXtremeComponents文档