基于OpenCV手机拍照快递单文字识别的研究

2015-03-10 01:35马玲玉
关键词:轮廓灰度像素

胡 文,马玲玉

(哈尔滨商业大学 计算机与信息工程学院,哈尔滨 150028)

基于OpenCV手机拍照快递单文字识别的研究

胡 文,马玲玉

(哈尔滨商业大学 计算机与信息工程学院,哈尔滨 150028)

基于OpenCV在Android手机上设计了快递单文字识别机制,识别内容主要分为电话和姓名识别.手机拍摄快递单后,在屏幕上画出两个矩形框,根据矩形框的周长面积特征,判定电话和姓名区域并提取这两部分图片;对这两个图片进行灰度化、二值化、形态学处理,再进行字符分割、归一化处理.为了提高数字分割速度提出一种基于轮廓检测的分割方法.根据数字和汉字的不同特征选取不同的识别方法进行字符识别.

文字识别;openCV;Android;快递单识别

随着电子商务的飞速发展,物流行业呈现出前所未有的盛况.物流站点收发包裹需联系大量收件人,若用手机拍照快递单后,将其信息提取到手机上,会节省很多时间和人力.当前字符识别系统很多,大多是扫描整个图片进行识别.本文只提取图片的重要部分进行识别,提高识别精度,降低识别时间.

OpenCV 是一款内嵌图像处理、模式识别、机器

学习等各种算法的跨平台开源计算机视觉库,基于此开发的程序可提高系统的速度、精度和可靠性[1].

Android是一款基于Linux 平台的开源手机操作系统,界面友好,操作简易.其应用程序通过Android SDK(Software Development Kit)利用Java 编程语言进行开发,也可利用第三方C/C++ 库协助开发[2].

1 开发环境搭建

本实验为windows32位系统,首先下载集成环境adt-bundle-windows-x86,运行Eclipse程序.然后添加AndroidSDK,安装android-ndk-r10.最后导入OpenCV-2.4.6-android-sdk,先加载Opencv-sdk包中的库,再加载示例程序.

2 快递单文字识别机制的设计

快递单上包含很多信息,本文只研究姓名和电话号码识别,设计流程如图1所示.手机拍照后手动用矩形框画出电话号码和姓名部分,根据两个矩形框的的周长面积特征判定所画出的图片类别,依次对其进行灰度化、二值化、形态学处理和字符分割.数字分割用轮廓检测方法,汉字分割用低谷投影检测法.最后进行归一化.预处理后根据数字和汉字的不同进行特征提取,依据这些特征进行字符识别.

图1 设计流程

2.1 图片定位提取

本程序有两个Activity,主Activity用于照片的获取.CameraBridgeViewBase抽象类扩展了Android的SurfaceView,其实例实现了为相机提供了回调操作的两个接口.本文实现的是可在RGBA色彩或灰度格式中获得一幅Mat图像的CvCameraViewListener2接口[2].CvCamer ViewListener2接口提供三个回调方法.本程序通过onCameraFrame方法对相机帧进行实时处理,包括滤镜及图片的保存.滤镜过程用到 UnivariateInterpolator等类,需导入commons-math-3.4.1.jar包.滤镜关键代码如下:UnivariateInterpolator interpolator;

if (valIn.length > 2) {

interpolator = new SplineInterpolator();

} else {

interpolator = new LinearInterpolator();}

return interpolator.interpolate(valIn, valOut);

}}

该滤镜相当于FujiVelvia胶片的效果,使相机达到很高的分辨率、锐化和很细的颗粒.图片保存较繁琐,用独立的方法实现.在该方法中启动副Activity.在副Activity中显示拍摄好的照片,对该照片手动用两个矩形框圈画出姓名和电话号码,触摸矩形框滑动可移动矩形框,而触摸其对顶点可缩放大小.记录矩形框顶点坐标,据此计算两个矩形框的周长面积来区别出矩形框的类别.保存裁剪好后的两个图片.

为支持包含Opencv库的程序运行,手机需安装OpenCV Manager.OpenCV Manager 通过BaseLoaderCallback抽象类与客户端交互,该类提供回调方法对客户服务.本程序在该方法中实现相机的连接,初始化数据,加载OpenCV库.

2.2 图片预处理

2.2.1二值化处理

首先使用CvCameraViewFrame类的gray()方法进行灰度化处理.其次进行二值化处理,采用阈值法.

普通方法:

cvThreshold( CvArr* src,CvArr* dst,

double threshold, double max_value(M),

CV_THRESH_BINARY)

src为源图片,dst为目标图片,threshold(T)为设定的阈值,dst中像素值依据dsti=(srci>T) ?M: 0得出[3].如图2所示.

图2 阈值化过程

自适应阈值法:

cvAdaptiveThreshold( CvArr* src,CvArr*dst,double max_val,int adaptive_method=CV_ADAPTIVE_THRESH_MEAN_C,

threshold_type = CV_THRESH _ BINARY,

int block _ size(b) = 3,double param1 = 5)

每个像素点阈值都不同.阈值通过计算像素点周围的b×b区域的加权平均,并减掉一个常数(paraml)获得.该方法适用于有较强梯度的图像.

本文采用普通方法进行二值化.二值化后图片变为黑白分明,为消除孤立的点进行形态学处理.首先用cvErode进行腐蚀,腐蚀结构元素为1×1;再用cvDilate进行膨胀,膨胀结构元素为2×2[4].

2.2.2字符分割

1)数字字符分割

本文根据Opencv轮廓的相关知识提出一个数字字符分割的算法,算法流程如图3所示.用cvCvtColor( dst,src, CV_BGR2GRAY )得到两个图片副本.

图3 算法流程

CvFindContours ( img,storage,&contours,sizeof(CvContour), CV_RETR_LIST)函数检测图片1的轮廓.storage为轮廓的存储开辟内存空间.contours序列指针指向轮廓存储的首地址,用于获取各个轮廓.CV_RETR_LIST表示提取整个图片的轮廓.同理检测图片2时CV_RETR_LIST改为CV_RETR_CCOMP,只检测图片最外围的边框和内部的孔,图4所示.对于数字0,4,6,8,9可检测出内部的孔.

cvDrawContours( img, contours, cvScalarAll(255),cvScalarAll(255), 1)根据检测出的轮廓绘制图片.图片1绘制出整个图片,图片2绘制出内部的孔和最外围的边界.

cvSub(src1,src2,dst)两个图片相减dst=src1-src2.新得到的图片进行轮廓检测,可排除0,4,6,8内部孔的干扰,如图5所示.

cvBoundingRect(contours, 0)获取所有轮廓的矩形框信息,该函数返回CvRect类型的数据,用循环将所有轮廓的矩形框信息存储到CvRect数组中.检测该数组中所有矩形框的长宽,快递单上的信息为印刷体数字,每个数字的长宽只有细微差异,排除具有巨大差异的矩形框,得到包含每个数字的矩形框.序列中轮廓的排序是随机的,获取的矩形框也是随机的,根据矩形框的左上顶点的坐标进行矩形框排序.

cvSetImageROI(img,rect[i])根据矩形框数组设定图像的感兴趣区域.cvCopy(img,roiimg[i])将所有提取出的感兴趣图片放到图片数组中,该数组中包含了已经按顺序分割好的字符.

图4 内轮廓

图5 外轮廓

本文的数字字符分割方法与以往多方面检测分割方法比速度较快,与低谷投影检测法比较精度较高.

2)汉字字符分割

汉字字符分割,由于汉字本身的复杂性,并不适合上述方法.采用低谷投影法进行汉字字符分割即列扫描.检测到一列的像素都为黑色时,该列为分割点.具体过程为获取图片的行列长度,双循环遍历整个图片的像素,当行不变时统计每列像素为黑的像素数,当其中一列都为黑时,记录下来,即为分割点.用Opencv中的库函数histogramImage绘制图片的直方图,可直观的看出分界线,如图6所示图中的低谷即为分割点.

图6 直方图

2.2.3归一化

字符分割后,需进行归一化处理,得到大小相同的图片.用Opencv中cvResize (src,dst, CV_INTER_LINEAR)实现.src为源图像,dst为目标尺寸大小,CV_INTER_LINEAR表示线性插值法,dst的像素值由原图像附近的4(2×2范围)个临近像素的线性加权计算,权重由这4个像素到精确目标点的距离确定.除此之外还有区域差值,用dst中新的像素点覆盖原来的像素点,求取覆盖区域的平均值.最近邻插值,dst中各点的像素值设为原图像中与其距离最近的点的像素值[5].本文采用线性插值法.图片归一化后方便后续的特征提取与字符识别.

2.3 特征提取

2.3.1数字特征提取

1)统计特征

本文选取的是数字的Hu不变矩.矩是对轮廓上所有点积分运算(即求和运算)得到的一个特征.轮廓的矩可定义如下:

(1)

p为x维度上的矩,q为y维度上的矩.在实际应用中多使用归一化的矩.本程序用归一化的中心矩.中心矩定义如下:

xavg=m1B/mBB,yavg=mB1/mBB

(2)

xavg和yavg表示图片重心.归一化矩是每个矩都除以m00的一个幂.归一化中心矩定义如下:

(3)

Hu矩是从归一化中心矩计算而来,具有平移,旋转,缩放不变性.Hu矩共有七个.用该矩作为特征向量优点是速度快,缺点是识别率低,但对于简单的快递单上的印刷体电话号码的识别效果较好[6].用OpenCV中的库函数cvMatchShapes(object1,object2,method,0)进行Hu矩匹配.method表示矩计算方法,当method为CV_CONTOURS_MATCH_11,公式如下:

(4)

2)结构特征

本文选取的数字结构特征为交叉点,凸缺陷,轮廓树编码.

交叉点特征.首先提取水平交叉点.把数字平分为上中下三部分,如图7所示.水平方向两条直线穿过图片[7].扫描这两条直线所覆盖的图片像素,当像素由1变0时记录一个交点,由此可得到一对数值.同理垂直方向也会得到一组数值.扫描像素的方法应用双循环遍历图片的像素.外层循环获取第j行的首地址,以指针数组的形式存储整行地址.内层循环直接根据指针地址获得像素值.

图7 交点

凸缺陷特征.首先计算一个轮廓的凸包,然后计算其凸缺陷.如图8所示,数字周围黑色的细线画出了凸包,a,b,c标出的格子区域是数字的轮廓相对于凸包的凸缺陷 ,如所看到的这些凸缺陷表现出了数字的不同特征.Opencv提供了三个关于凸包和凸缺陷的重要函数.CvCheckContoirConvexity()检测轮廓是否为凸.cvConvexHull2()计算已知轮廓的凸包,该函数已点的形式返回凸包.CvCOnvexityDefects()根据轮廓,凸包计算出凸缺陷序列.

图8 凸缺陷

轮廓树是描述一个特定形状内各部分的等级关系.从一个轮廓创建轮廓树是从底端到顶端的.轮廓上的每个点都不是完全和它的相邻点共线的,搜索三角形突出的周边形状,每个三角形被一条线段代替,线段通过连接非相邻的两点连接得到,每替换一次轮廓的顶点数减1并且轮廓树多一个节点.如果这样的三角形的两侧为原始边,那么通过这两条边得到的线段为轮廓树的叶子节点.这个过程最终把一个物体的外形减为一个四边形,该四边形被剖开得到的三角形为根节点的两个子节点[8].具体过程见图9.Opencv提供了获取轮廓树和对比两个轮廓树的函数.

2.3.2汉字特征提取

汉字本身比数字的结构复杂的多.本文采用多特征融合的方法[9].包括Harris角点检测,SURF特征检测,ORB特征检测.

Harris角点检测是一种基于灰度图像的角点检测算法.用局部小窗口在图像上移动,当向各方向移动窗口内的图像灰度值均明显变化时,窗口内包含角点.即角点是图像局部曲率突变的点[8].设当窗口平移量为(u,v)时窗口内图像的灰度变化量为E(u,v),可得如下所示:

(1)边三角形A,B,C跟三角形D (2)线段来源图9 轮廓树

M为每点周围小窗口的二阶导数图像的自相关矩阵.对角点的检测改为对M的特征值的分析,如果M的两个特征值为大数值正数,该点为角点.Opencv基于此提供了cornerHarris函数来对图像进行角点检测,输出为已对源图像的角点标记好的目标图像.

SURF特征检测算法是Sift算法的加速版.Sift算法在图像的空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量.Sift算法的关键是建立一幅图像的金字塔,在每一层进行高斯滤波并求取图像差(DOG)进行特征点的提取,而Surf则用Hessian Matrix进行特征点提取.Hessian矩阵是Surf算法的核心.Opencv中有三个函数实现这个算法.

ORB算法是在FAST关键点检测和BRIEF特征上实现.FAST算法是检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为是一个特征点.BRIEF描述子是在特征点附近随机选取若干点对,将这些点对的灰度值的大小组合成一个二进制串,这个特征串即为BRIEF描述子[10].ORB算法解决了BRIEF描述子的旋转不变性且速度较快.Opencv中ORB算法已被实现,可直接使用.

2.4 字符识别

数字识别.本文对数字提取的三个特征,Opencv中有自带的函数进行匹配.首先建立模板库,统一模板库内数字图像的大小.其次对模板库内的所有图像进行以上三个特征的检测,分别确定出数字0~9的三个特征检测的范围.再检测示例数字的三个特征,与模板中的值进行综合比较最接近哪个即为哪个数字.

汉字识别.本文的汉字特征是基于多个特征提取的,识别方法用Opencv构建BP神经网络根据之前提取的三个特征进行样本训练.目前Opencv可以在Visual C++下构建BP神经网络但在Android系统下仅可以通过jni调用封装好的Opencv的C++代码,所以在Android系统下用Opencv构建BP神经网络还有待研究.

3 结 语

本文研究快递单上的姓名和电话识别,区别之前扫描整张图片,只提取图片的两个重要部分进行识别,提高了识别时间和识别精度.针对数字分割本文提出一种基于轮廓检测的数字分割方法,提高了分割速度.字符识别本文采用多特征融合的方法,提高了识别效率.基于Opencv开发软件系统可节省很多时间.相信该研究随着快递产业的蓬勃发展将具有广泛的应用前景.

[1] 晁 越, 李中健, 黄士飞. OpenCV图像处理编程研究[J].电子设计工程, 2013, 21(10): 175-177.

[2] HOWSE J. Android OpenCV 应用程序设计[M]. 北京: 清华大学出版社, 2015. 21-64.

[3] LAGANIERE R. OpenCV2 Computer.Opencv2视觉编程手册 [M]. 北京: 科学出版社, 2013. 30-53.

[4] 张智丰, 张亚荣, 裴志利. OpenCV耦合人机交互的手机表面目标检测定位研究[J]. 组合机床与自动化加工技术, 2015(3): 67-70.

[5] 朱燕敏. 基于OpenCV的视频字幕识别系统研究与实现[D].长春: 吉林大学, 2014. 11-22.

[6] GONZALEZ R C, WOODS R E. 数字图像处理[M]. 北京: 电子工业出版社, 2007.

[7] 樊可霞, 周一军, 涂 煊. 基于OpenCV的社保卡号码识别算法的研究[J]. 信息技术, 2014(3): 175-178.

[8] BRADSKI G, KAEHLER A.学习 OpenCV[M]. 北京: 清华大学出版社, 2009. 246-279.

[9] 张 震, 杨 晓. 基于OpenCV实现多特征融合的移动车牌定位算法[J]. 计算机应用与软件, 2014, 31(4): 289-292.

[10] 毛云星, 冷雪飞. Opencv3编程入门[M]. 北京: 电子工业出版社, 2015.

Study on recognition character in express list by mobile phone camera based on OpenCV

HU Wen, MA Ling-yu

(School of Computer and Information Engineering, Harbin University of Commerce, Harbin 150028, China)

In this paper, a system of recognition character in express list on the Android mobile was designed based on OpenCV. Identification content is mainly divided into telephone numbers recognition and names recognition. Mobile phone was used to take a photo of express list and draw two rectangular boxes on the screen. According to the perimeter area of rectangular box, the phone numbers and the names area were determined, and the two parts of picture were extracted. The two pictures were grayed, binarized, morphology processed and then character segmented, normalization processed. In order to increase the speed of digital divide, a segmentation method was presented based on contour detection. Finally, according to the different characters of the numbers and the Chinese characters, different recognition methods were selected for the character recognition.

character recognition; openCV; Android; express listh recognition

2015-04-07.

胡 文(1957-),男,博士,教授,研究方向:嵌入式设计.

O177

A

1672-0946(2015)05-0564-05

猜你喜欢
轮廓灰度像素
采用改进导重法的拓扑结构灰度单元过滤技术
像素前线之“幻影”2000
Bp-MRI灰度直方图在鉴别移行带前列腺癌与良性前列腺增生中的应用价值
OPENCV轮廓识别研究与实践
基于实时轮廓误差估算的数控系统轮廓控制
“像素”仙人掌
ÉVOLUTIONDIGAE Style de vie tactile
高速公路主动发光轮廓标应用方案设计探讨
基于最大加权投影求解的彩色图像灰度化对比度保留算法
基于灰度线性建模的亚像素图像抖动量计算