胡 文,馬玲玉
(哈爾濱商業(yè)大學 計算機與信息工程學院,哈爾濱 150028)
基于OpenCV手機拍照快遞單文字識別的研究
胡 文,馬玲玉
(哈爾濱商業(yè)大學 計算機與信息工程學院,哈爾濱 150028)
基于OpenCV在Android手機上設計了快遞單文字識別機制,識別內(nèi)容主要分為電話和姓名識別.手機拍攝快遞單后,在屏幕上畫出兩個矩形框,根據(jù)矩形框的周長面積特征,判定電話和姓名區(qū)域并提取這兩部分圖片;對這兩個圖片進行灰度化、二值化、形態(tài)學處理,再進行字符分割、歸一化處理.為了提高數(shù)字分割速度提出一種基于輪廓檢測的分割方法.根據(jù)數(shù)字和漢字的不同特征選取不同的識別方法進行字符識別.
文字識別;openCV;Android;快遞單識別
隨著電子商務的飛速發(fā)展,物流行業(yè)呈現(xiàn)出前所未有的盛況.物流站點收發(fā)包裹需聯(lián)系大量收件人,若用手機拍照快遞單后,將其信息提取到手機上,會節(jié)省很多時間和人力.當前字符識別系統(tǒng)很多,大多是掃描整個圖片進行識別.本文只提取圖片的重要部分進行識別,提高識別精度,降低識別時間.
OpenCV 是一款內(nèi)嵌圖像處理、模式識別、機器
學習等各種算法的跨平臺開源計算機視覺庫,基于此開發(fā)的程序可提高系統(tǒng)的速度、精度和可靠性[1].
Android是一款基于Linux 平臺的開源手機操作系統(tǒng),界面友好,操作簡易.其應用程序通過Android SDK(Software Development Kit)利用Java 編程語言進行開發(fā),也可利用第三方C/C++ 庫協(xié)助開發(fā)[2].
本實驗為windows32位系統(tǒng),首先下載集成環(huán)境adt-bundle-windows-x86,運行Eclipse程序.然后添加AndroidSDK,安裝android-ndk-r10.最后導入OpenCV-2.4.6-android-sdk,先加載Opencv-sdk包中的庫,再加載示例程序.
快遞單上包含很多信息,本文只研究姓名和電話號碼識別,設計流程如圖1所示.手機拍照后手動用矩形框畫出電話號碼和姓名部分,根據(jù)兩個矩形框的的周長面積特征判定所畫出的圖片類別,依次對其進行灰度化、二值化、形態(tài)學處理和字符分割.數(shù)字分割用輪廓檢測方法,漢字分割用低谷投影檢測法.最后進行歸一化.預處理后根據(jù)數(shù)字和漢字的不同進行特征提取,依據(jù)這些特征進行字符識別.
圖1 設計流程
2.1 圖片定位提取
本程序有兩個Activity,主Activity用于照片的獲取.CameraBridgeViewBase抽象類擴展了Android的SurfaceView,其實例實現(xiàn)了為相機提供了回調操作的兩個接口.本文實現(xiàn)的是可在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膠片的效果,使相機達到很高的分辨率、銳化和很細的顆粒.圖片保存較繁瑣,用獨立的方法實現(xiàn).在該方法中啟動副Activity.在副Activity中顯示拍攝好的照片,對該照片手動用兩個矩形框圈畫出姓名和電話號碼,觸摸矩形框滑動可移動矩形框,而觸摸其對頂點可縮放大小.記錄矩形框頂點坐標,據(jù)此計算兩個矩形框的周長面積來區(qū)別出矩形框的類別.保存裁剪好后的兩個圖片.
為支持包含Opencv庫的程序運行,手機需安裝OpenCV Manager.OpenCV Manager 通過BaseLoaderCallback抽象類與客戶端交互,該類提供回調方法對客戶服務.本程序在該方法中實現(xiàn)相機的連接,初始化數(shù)據(jù),加載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中像素值依據(jù)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區(qū)域的加權平均,并減掉一個常數(shù)(paraml)獲得.該方法適用于有較強梯度的圖像.
本文采用普通方法進行二值化.二值化后圖片變?yōu)楹诎追置?,為消除孤立的點進行形態(tài)學處理.首先用cvErode進行腐蝕,腐蝕結構元素為1×1;再用cvDilate進行膨脹,膨脹結構元素為2×2[4].
2.2.2字符分割
1)數(shù)字字符分割
本文根據(jù)Opencv輪廓的相關知識提出一個數(shù)字字符分割的算法,算法流程如圖3所示.用cvCvtColor( dst,src, CV_BGR2GRAY )得到兩個圖片副本.
圖3 算法流程
CvFindContours ( img,storage,&contours,sizeof(CvContour), CV_RETR_LIST)函數(shù)檢測圖片1的輪廓.storage為輪廓的存儲開辟內(nèi)存空間.contours序列指針指向輪廓存儲的首地址,用于獲取各個輪廓.CV_RETR_LIST表示提取整個圖片的輪廓.同理檢測圖片2時CV_RETR_LIST改為CV_RETR_CCOMP,只檢測圖片最外圍的邊框和內(nèi)部的孔,圖4所示.對于數(shù)字0,4,6,8,9可檢測出內(nèi)部的孔.
cvDrawContours( img, contours, cvScalarAll(255),cvScalarAll(255), 1)根據(jù)檢測出的輪廓繪制圖片.圖片1繪制出整個圖片,圖片2繪制出內(nèi)部的孔和最外圍的邊界.
cvSub(src1,src2,dst)兩個圖片相減dst=src1-src2.新得到的圖片進行輪廓檢測,可排除0,4,6,8內(nèi)部孔的干擾,如圖5所示.
cvBoundingRect(contours, 0)獲取所有輪廓的矩形框信息,該函數(shù)返回CvRect類型的數(shù)據(jù),用循環(huán)將所有輪廓的矩形框信息存儲到CvRect數(shù)組中.檢測該數(shù)組中所有矩形框的長寬,快遞單上的信息為印刷體數(shù)字,每個數(shù)字的長寬只有細微差異,排除具有巨大差異的矩形框,得到包含每個數(shù)字的矩形框.序列中輪廓的排序是隨機的,獲取的矩形框也是隨機的,根據(jù)矩形框的左上頂點的坐標進行矩形框排序.
cvSetImageROI(img,rect[i])根據(jù)矩形框數(shù)組設定圖像的感興趣區(qū)域.cvCopy(img,roiimg[i])將所有提取出的感興趣圖片放到圖片數(shù)組中,該數(shù)組中包含了已經(jīng)按順序分割好的字符.
圖4 內(nèi)輪廓
圖5 外輪廓
本文的數(shù)字字符分割方法與以往多方面檢測分割方法比速度較快,與低谷投影檢測法比較精度較高.
2)漢字字符分割
漢字字符分割,由于漢字本身的復雜性,并不適合上述方法.采用低谷投影法進行漢字字符分割即列掃描.檢測到一列的像素都為黑色時,該列為分割點.具體過程為獲取圖片的行列長度,雙循環(huán)遍歷整個圖片的像素,當行不變時統(tǒng)計每列像素為黑的像素數(shù),當其中一列都為黑時,記錄下來,即為分割點.用Opencv中的庫函數(shù)histogramImage繪制圖片的直方圖,可直觀的看出分界線,如圖6所示圖中的低谷即為分割點.
圖6 直方圖
2.2.3歸一化
字符分割后,需進行歸一化處理,得到大小相同的圖片.用Opencv中cvResize (src,dst, CV_INTER_LINEAR)實現(xiàn).src為源圖像,dst為目標尺寸大小,CV_INTER_LINEAR表示線性插值法,dst的像素值由原圖像附近的4(2×2范圍)個臨近像素的線性加權計算,權重由這4個像素到精確目標點的距離確定.除此之外還有區(qū)域差值,用dst中新的像素點覆蓋原來的像素點,求取覆蓋區(qū)域的平均值.最近鄰插值,dst中各點的像素值設為原圖像中與其距離最近的點的像素值[5].本文采用線性插值法.圖片歸一化后方便后續(xù)的特征提取與字符識別.
2.3 特征提取
2.3.1數(shù)字特征提取
1)統(tǒng)計特征
本文選取的是數(shù)字的Hu不變矩.矩是對輪廓上所有點積分運算(即求和運算)得到的一個特征.輪廓的矩可定義如下:
(1)
p為x維度上的矩,q為y維度上的矩.在實際應用中多使用歸一化的矩.本程序用歸一化的中心矩.中心矩定義如下:
xavg=m1B/mBB,yavg=mB1/mBB
(2)
xavg和yavg表示圖片重心.歸一化矩是每個矩都除以m00的一個冪.歸一化中心矩定義如下:
(3)
Hu矩是從歸一化中心矩計算而來,具有平移,旋轉,縮放不變性.Hu矩共有七個.用該矩作為特征向量優(yōu)點是速度快,缺點是識別率低,但對于簡單的快遞單上的印刷體電話號碼的識別效果較好[6].用OpenCV中的庫函數(shù)cvMatchShapes(object1,object2,method,0)進行Hu矩匹配.method表示矩計算方法,當method為CV_CONTOURS_MATCH_11,公式如下:
(4)
2)結構特征
本文選取的數(shù)字結構特征為交叉點,凸缺陷,輪廓樹編碼.
交叉點特征.首先提取水平交叉點.把數(shù)字平分為上中下三部分,如圖7所示.水平方向兩條直線穿過圖片[7].掃描這兩條直線所覆蓋的圖片像素,當像素由1變0時記錄一個交點,由此可得到一對數(shù)值.同理垂直方向也會得到一組數(shù)值.掃描像素的方法應用雙循環(huán)遍歷圖片的像素.外層循環(huán)獲取第j行的首地址,以指針數(shù)組的形式存儲整行地址.內(nèi)層循環(huán)直接根據(jù)指針地址獲得像素值.
圖7 交點
凸缺陷特征.首先計算一個輪廓的凸包,然后計算其凸缺陷.如圖8所示,數(shù)字周圍黑色的細線畫出了凸包,a,b,c標出的格子區(qū)域是數(shù)字的輪廓相對于凸包的凸缺陷 ,如所看到的這些凸缺陷表現(xiàn)出了數(shù)字的不同特征.Opencv提供了三個關于凸包和凸缺陷的重要函數(shù).CvCheckContoirConvexity()檢測輪廓是否為凸.cvConvexHull2()計算已知輪廓的凸包,該函數(shù)已點的形式返回凸包.CvCOnvexityDefects()根據(jù)輪廓,凸包計算出凸缺陷序列.
圖8 凸缺陷
輪廓樹是描述一個特定形狀內(nèi)各部分的等級關系.從一個輪廓創(chuàng)建輪廓樹是從底端到頂端的.輪廓上的每個點都不是完全和它的相鄰點共線的,搜索三角形突出的周邊形狀,每個三角形被一條線段代替,線段通過連接非相鄰的兩點連接得到,每替換一次輪廓的頂點數(shù)減1并且輪廓樹多一個節(jié)點.如果這樣的三角形的兩側為原始邊,那么通過這兩條邊得到的線段為輪廓樹的葉子節(jié)點.這個過程最終把一個物體的外形減為一個四邊形,該四邊形被剖開得到的三角形為根節(jié)點的兩個子節(jié)點[8].具體過程見圖9.Opencv提供了獲取輪廓樹和對比兩個輪廓樹的函數(shù).
2.3.2漢字特征提取
漢字本身比數(shù)字的結構復雜的多.本文采用多特征融合的方法[9].包括Harris角點檢測,SURF特征檢測,ORB特征檢測.
Harris角點檢測是一種基于灰度圖像的角點檢測算法.用局部小窗口在圖像上移動,當向各方向移動窗口內(nèi)的圖像灰度值均明顯變化時,窗口內(nèi)包含角點.即角點是圖像局部曲率突變的點[8].設當窗口平移量為(u,v)時窗口內(nèi)圖像的灰度變化量為E(u,v),可得如下所示:
(1)邊三角形A,B,C跟三角形D (2)線段來源圖9 輪廓樹
M為每點周圍小窗口的二階導數(shù)圖像的自相關矩陣.對角點的檢測改為對M的特征值的分析,如果M的兩個特征值為大數(shù)值正數(shù),該點為角點.Opencv基于此提供了cornerHarris函數(shù)來對圖像進行角點檢測,輸出為已對源圖像的角點標記好的目標圖像.
SURF特征檢測算法是Sift算法的加速版.Sift算法在圖像的空間尺度中尋找極值點,并提取出其位置、尺度、旋轉不變量.Sift算法的關鍵是建立一幅圖像的金字塔,在每一層進行高斯濾波并求取圖像差(DOG)進行特征點的提取,而Surf則用Hessian Matrix進行特征點提取.Hessian矩陣是Surf算法的核心.Opencv中有三個函數(shù)實現(xiàn)這個算法.
ORB算法是在FAST關鍵點檢測和BRIEF特征上實現(xiàn).FAST算法是檢測候選特征點周圍一圈的像素值,如果候選點周圍領域內(nèi)有足夠多的像素點與該候選點的灰度值差別夠大,則認為是一個特征點.BRIEF描述子是在特征點附近隨機選取若干點對,將這些點對的灰度值的大小組合成一個二進制串,這個特征串即為BRIEF描述子[10].ORB算法解決了BRIEF描述子的旋轉不變性且速度較快.Opencv中ORB算法已被實現(xiàn),可直接使用.
2.4 字符識別
數(shù)字識別.本文對數(shù)字提取的三個特征,Opencv中有自帶的函數(shù)進行匹配.首先建立模板庫,統(tǒng)一模板庫內(nèi)數(shù)字圖像的大小.其次對模板庫內(nèi)的所有圖像進行以上三個特征的檢測,分別確定出數(shù)字0~9的三個特征檢測的范圍.再檢測示例數(shù)字的三個特征,與模板中的值進行綜合比較最接近哪個即為哪個數(shù)字.
漢字識別.本文的漢字特征是基于多個特征提取的,識別方法用Opencv構建BP神經(jīng)網(wǎng)絡根據(jù)之前提取的三個特征進行樣本訓練.目前Opencv可以在Visual C++下構建BP神經(jīng)網(wǎng)絡但在Android系統(tǒng)下僅可以通過jni調用封裝好的Opencv的C++代碼,所以在Android系統(tǒng)下用Opencv構建BP神經(jīng)網(wǎng)絡還有待研究.
本文研究快遞單上的姓名和電話識別,區(qū)別之前掃描整張圖片,只提取圖片的兩個重要部分進行識別,提高了識別時間和識別精度.針對數(shù)字分割本文提出一種基于輪廓檢測的數(shù)字分割方法,提高了分割速度.字符識別本文采用多特征融合的方法,提高了識別效率.基于Opencv開發(fā)軟件系統(tǒng)可節(jié)省很多時間.相信該研究隨著快遞產(chǎn)業(yè)的蓬勃發(fā)展將具有廣泛的應用前景.
[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的視頻字幕識別系統(tǒng)研究與實現(xiàn)[D].長春: 吉林大學, 2014. 11-22.
[6] GONZALEZ R C, WOODS R E. 數(shù)字圖像處理[M]. 北京: 電子工業(yè)出版社, 2007.
[7] 樊可霞, 周一軍, 涂 煊. 基于OpenCV的社保卡號碼識別算法的研究[J]. 信息技術, 2014(3): 175-178.
[8] BRADSKI G, KAEHLER A.學習 OpenCV[M]. 北京: 清華大學出版社, 2009. 246-279.
[9] 張 震, 楊 曉. 基于OpenCV實現(xiàn)多特征融合的移動車牌定位算法[J]. 計算機應用與軟件, 2014, 31(4): 289-292.
[10] 毛云星, 冷雪飛. Opencv3編程入門[M]. 北京: 電子工業(yè)出版社, 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