王咸鋒
(廣東建設職業(yè)技術學院建筑信息系,廣東 廣州 510440)
利用OpenCV實現在Android系統(tǒng)下的文檔去黑邊
王咸鋒
(廣東建設職業(yè)技術學院建筑信息系,廣東 廣州 510440)
本文提出一種基于開源計算機視覺庫OpenCV實現Android系統(tǒng)下文檔去黑邊的方法。介紹了如何在Android中使用OpenCV,詳細闡述了利用JNI調用OpenCV相關函數的具體步驟,即在調用攝像頭時,所要考慮的內容,以及采用Android NDK生成共享庫的關鍵過程。實驗結果表明,此Android應用程序對不同場景下不同種類的文檔進行實時去黑邊的功能性能良好。
可視化;去黑邊;OpenCV;系統(tǒng)設計
對于商務人士來說,尤其是在出差途中,如果遇到急需用掃描儀掃描合同、文件、發(fā)票、稅單、機票或需要發(fā)傳真、郵件共享掃描文件時,這時只需拿出帶有攝像頭的智能移動設備拍攝即可。但是在拍攝的過程中,由于擺放不當、紙張折疊或其他各種因素,拍攝得到的圖像總是有多余的邊框或黑邊,給后期圖像分割、字符識別等帶來了極大的不便,嚴重影響工作效率,所以需要一款能有效解決以上問題的Android應用程序。Android應用程序是通過Android SDK(Software Development Kit)利用Java編程語言進行開發(fā),每一個Android應用程序都運行在自己獨立的Dalvik虛擬機上,而此虛擬機支持JNI,同時伴隨著Android NDK的發(fā)布,使開發(fā)者利用第三方C/C++庫協(xié)助編寫Android程序成為可能,為在Android系統(tǒng)下利用OpenCV編寫計算機視覺相關應用程序的軟件開發(fā)人員提供了便利。
近年來OpenCV發(fā)展迅猛,隨著Android智能終端的發(fā)展,越來越多的傳統(tǒng)科研平臺都轉向Android移動終端。2010年6月發(fā)布的OpenCV 2.3、2.3.1版本,除提供C++接口向下兼容C接口外,還新增了Java接口,且是對準Android平臺。更重要的是以前官方不支持ndk-build,這次終于一統(tǒng)JNI接口調用方式,方便在Android上開發(fā)使用。2012年4月2日發(fā)布了2.4版本,支持windows/Linux、Mac/Android/IOS四大系統(tǒng)。自2.4版本發(fā)布之后,為了和Android的系統(tǒng)架構保持同步,準確來說是吸收Android框架層的優(yōu)點,引入了OpenCV Manager的概念,其本質就是一個Service,用來管理OpenCV動態(tài)鏈接庫。它工作在APP和OpenCV的動態(tài)鏈接庫之間。OpenCV Manager的結構就是模仿Android的Binder機制。其架構圖如下:
圖1 OpenCV Manager架構圖
APP在運行時會首先檢查OpenCV Manager是否存在,如果不存在則會提示安裝。如果存在,就會連接這個服務,進一步初始化加載OpenCV庫。
本文的開發(fā)環(huán)境為:windows+ADT Bundle+CDT+ OpenCV-2.4.4-android-sdk。將OpenCV-2.4.4-android-sdk解壓后,會看到如下文件夾:
圖2 OpenCV-2.4.4-android-sdk解壓后的文件夾
其中sdk就是開發(fā)時要用到的數據包,samples是自帶的示例,doc是說明文檔,apk則是OpenCV Manager。手機想要運行基于OpenCV的Java接口的程序,就必須先安裝OpenCV Manager。
2.1 AndroidAPP通過Java接口調用OpenCV
2.1.1 配置
配置比較簡單,但為了保持同步,使以后在開發(fā)中可以隨意調用Java接口和JNI接口,我們仍將壓縮包解壓到跟工作空間平級的目錄。再將解壓后的sdk文件夾命名為OpenCV4Android-sdk,拷貝到新建的工作空間中。
圖3 配置時放置文件夾位置
讓這兩個文件夾平級是為了以后JNI調用時無需修改mk文件。注意解壓后會嵌套一個目錄,把它拷貝到最外層。而sdk文件夾命名和拷貝到新的工作空間則不是必須的。
打開Eclipse切換到剛創(chuàng)建的工作空間,右鍵import→General→Existing Projects into workspaces。選擇OpenCV解壓后的sdk數據包,導入后看是否有錯誤,如果提示找不到java.util.List數據包,那是因為沒有加載Android的SDK進來。選中項目,按快捷鍵Alter+Enter,單擊Android,選中一個SDK(要求3.0以上),單擊clean,看bin文件夾下的opencv library-2.4.4.jar是否生成,如果生成了就表示已經導入成功。
2.1.2 新建項目并引入上面的jar包
任意新建一個Android Application Project,然后選中該項目快捷鍵Alter+Enter,在下面的加庫區(qū)域點Add,將導入工作空間的opencv sdk選中:
圖4 新建項目并引入jar包
可以看到在Android Dependencies中將剛導到bin目錄下生成的jar文件導進去了,之后就可以使用opencv的API了。
3.1 傳統(tǒng)去黑邊方法比較研究
目前針對Android的去黑邊應用較少,并且大都未能達到實時可視化,較常用的掃描儀去黑邊方法有兩種,一是將黑邊從掃描圖像中裁減掉,圖像的大小將會縮小到與原文檔相同的實際大??;二是用白色填充黑色邊緣,圖像的尺寸將保持不變。由于圖像黑邊一般比圖像內容灰度大,所以要先對灰度圖像使用開運算得到只有黑邊的圖像,再利用圖像的減法運算將黑邊去除,最終達到去除黑邊的目的,缺點是對
環(huán)境要求高,特別是光線,當高拍儀拍攝的圖像噪點較多、亮度不均勻,使得基于傳統(tǒng)掃描儀的去黑邊算法失效;同時,由于高拍儀是開放環(huán)境、光線變化很大,文檔放置很隨意,所以不能百分百保證去黑邊成功。
筆者在對幾種常用去黑邊方案可行性和有效性論證的基礎上,經過大量實驗得出了一種在Android系統(tǒng)基于OpenCV去黑邊算法,不但可以實時精準地對任意傾斜角度的文檔物體進行捕捉并去除黑邊,還可以解決傳統(tǒng)去黑邊方法對環(huán)境要求高、對移動的物體捕捉失效的情況。
3.2 總體設計思路
本文采用的去黑邊算法是先從視頻流中實時獲取圖像;然后對圖像進行去噪點;再進行二值化;按照預設步長和可忍耐邊界值獲取圖像的邊界點;再對四條直線方程進行規(guī)整,輸出四條直線圍成的矩形;最后將矩形實時的顯示在視頻上。流程示意圖如圖5所示。
圖5 算法流程示意圖
3.3 核心算法流程
首先,圖像平滑處理,即去噪點。圖像平滑包括空域法和頻域法兩大類。在基于空域法的圖像平滑中,常用的方法是均值濾波或中值濾波。在編程過程中,定義一個n×n的模板數組;在窗口掃描圖像過程中,可直接使用灰度值為0的像素點擴展圖像的四個邊緣。對于小的卷積核(從3×3到7×7),使用上述計算標準sigma的公式速度會更快。本文采用OpenCV的cvSmooth函數來平滑圖像。
其次,圖像二值化。為了提高處理速度,首先對圖像進行縮放的預處理,以保證圖像處理實時顯示。圖像的二值化最常用的方法就是設定閾值T,傳統(tǒng)方法得到的二值化在光線變化和亮度不均勻的時候效果很差,不能商用。本文使用迭代法求閾值:預先設置一個閾值T,對圖像中灰度值>T的像素點求出灰度平均值T1,圖像中灰度值<T的像素點求出灰度平均值T2,若丨T1-T2丨<△則當前T即為最佳閾值,否則取T=(T1+T2)/2循環(huán)上述比較操作。二值化算法設計如下:
圖6 二值化算法設計
本文中的二值化使用OpenCV的cvThreshold函數,該函數的典型應用是對灰度圖像進行閾值操作得到二值圖像,函數中的閾值使用上面迭代法求得,核心算法如下所示:
最后,按照預設步長和可忍耐邊界值獲取圖像的邊界點。定義某行或某列中白點占的百分比閾值為0.05,某行或
列中連續(xù)白點占的百分比閾值為0.02,連續(xù)的白點的百分比應該小于等于所有的白點的百分比,其中邊緣遍歷算法如下:
定位邊緣點算法如下:
通過這種連續(xù)定位的方式,可以快速尋找圖像邊界,并消除由于曝光亮斑帶來的困擾。并且從四個方向遍歷圖像找到四組邊界點,左邊需要從左到右遍歷,右邊需要從右往左遍歷,上邊需要從上往下遍歷,下邊需要從下往上遍歷。在具體遍歷過程中,為減少運算量和避免噪聲帶來的干擾,當白點總數>0.05和連續(xù)白點總數>0.02,才會定義為邊界。
當四個方向都遍歷結束,會在四個方向上分別得到四個點的x和y坐標。根據四個點的坐標輸出四條直線圍成的矩形,通過畫方框的方式將去黑邊的結果實時顯示在視頻窗口上。
4.1 關于如何傳遞攝像頭預覽的圖像數據給Native代碼
① 傳遞圖片路徑:這是最差的方式,速度很慢,主要用于前期開發(fā)的時候進行測試,測試Java層和Native層的互調是否正常。
② 傳遞預覽圖像的字節(jié)數組到Native層,然后將字節(jié)數組處理成RGB或者RGBA的格式,具體哪種格式要看圖像處理函數能否處理RGBA格式的,如果可以的話推薦轉換成RGBA格式,因為返回的也是RGBA格式的。轉換方式有兩種:一種方式是使用一個自定義的函數進行編碼轉換,另一種方式是使用OpenCV中的Mat和cvtColor函數進行轉換,接著調用圖像處理函數,處理完成之后,將處理的結果保存在一個整形數組中(實際上就是RGB或者RGBA格式的圖像數據),最后調用Bitmap的方法將其轉換成bitmap返回。這種方法速度也比較慢,但是比第一種方案要快很多。
③ 使用OpenCV的攝像頭:JavaCamera或者NativeCamera都行,好處是它進行了很多的封裝,可以直接將預覽圖像的Mat結構傳遞給Native層,這種傳遞是使用Mat的內存地址(long型),Native層只要根據這個地址將其封裝成Mat就可以進行處理了,另外,它的回調函數的返回值也是Mat,非常方便。這種方式速度較快。
4.2 在Android中使用OpenCV調用攝像頭
首先,是否是在原有的C/C++代碼上進行移植,如果是的話,那么盡量考慮使用ndk開發(fā),否則使用OpenCV for Android編寫Java代碼進行開發(fā),效率不會比native代碼低多少。
其次,如果是需要OpenCV library,是否能夠容忍運行應用還需要安裝OpenCV Manager,如果不能的話,則在開發(fā)時要考慮將OpenCV binaries添加到應用中進行static initialization,但其實使用OpenCV Manager是有很多好處的。
接著,是使用原生Android的Camera還是使用OpenCV的Camera,如果是OpenCV Camera的話,是使用Java調用攝像頭還是Native調用攝像頭。
最后,圖片如何進行傳遞,如果是單張靜態(tài)圖片進行處理的話,只需要路徑就行了,但是如果是在視頻狀態(tài)下對圖片進行處理的話,那么就只能傳遞圖像數據了,這里涉及到了Android中如何獲取預覽的圖像數據以及如何將其傳遞到底層,又如何進行轉換(一般是YUV轉成RGB)使得OpenCV可以進行處理,處理完之后,又如何將處理得到的圖片傳遞給Java層。采用圖像數據傳遞方式,可以優(yōu)化的地方,包括:
① 盡量使用Mat而不要使用IplImage;
② 盡量保證你的圖像處理函數能夠處理RGBA格式的圖像;
③ 先壓縮圖像大小再對圖像進行處理;
④ 使用noise filter降低圖像中的噪聲。
目前,高拍儀可視化下去黑邊系統(tǒng)已經實現商用,并支持多種語言版本,圖7為最初一個系統(tǒng)版本在PC上的模擬,根據不同需求的用戶反饋,經過后期多次修改不斷升級,實現了跨平臺的應用(Android和Windows平臺),圖8為在PC上的最新版本的系統(tǒng)界面,在實時跟蹤、文檔糾偏以及去黑邊方面,用戶評價良好,商用至今,實現零投訴。圖9為系統(tǒng)輸出對象,對比市場上現有的去黑邊應用,不但去黑邊效果顯著,并且對環(huán)境變量要求低,適用范圍廣。
圖7 可視化去黑邊系統(tǒng)最初版本
圖8 可視化去黑邊系統(tǒng)最新版本
圖9 系統(tǒng)實時輸出對象
采用本文設計的系統(tǒng)不但能夠實現高拍儀下穩(wěn)定的去黑邊,而且能夠實時顯示拍攝的內容,達到去黑邊結果可視化,使得用戶知道將要掃描的文檔是否可以正常完成去黑邊操作,保證用戶一次拍圖就能夠獲取自己想要的圖像,將高拍儀可視化的優(yōu)點提到一個新的高度,同時給用戶一種革新性的體驗。
[1]Shervin Emami.Mastering Opencv with Practical Computer Vision[M].Packt PublishingLimited.2012
[2]Dr Paul Richard,JoseBraz. Computer Vision,Imaging and ComputerGraphics[M]. Springer-Verlag Berlin andHeidelberg GmbH&Co.K.2012
[3]Gary R.Bradski,AdrianKaehler.Learning OpenCV[M].O'Reilly Media,Inc,USA.2008.
[4]左飛,萬晉森,劉航.Visual C++數字圖像處理開發(fā)入門與編程實踐[M].2008.
[5]江超,艾矯燕.基于OpenCV的攝像頭動態(tài)手勢軌跡識別及其應用[J].計算機應用,2012,32(s1):128-133.
[6]許才敬.Ubuntu下基于OpenCV的Canny邊緣檢測[J].數字技術與應用,2011(1):53-54.
[7]張丘,馬利莊,高巖,等.票據圖像預處理方法的研究[J].計算機仿真,2005,22(10):208-211.
[8]王海杰.文檔影像圖像處理中的糾偏與降噪研究[D].浙江大學,2008.
Method to Remove the Black Edge of Documents inAndroid System Based on OpenCV
Wang Xianfeng
(Guangdong Construction Vocational Technology Institute,Guangzhou 510440,Guangdong)
This paper presents a method to remove the black edge of documents inAndroid system based on open source computer vision library OpenCV.It introduces how to use OpenCV in Android,describes the specific steps of using JNI to call OpenCV function,which should be considered in using the camera.It describes the key process of using Android NDK to generate sharing library.The experimental results show that this Android application has good performance in removing black edge of documents in different types under different scenarios.
visualization;remove black edge;OpenCV;system design
TP391
A
1008-6609(2016)08-0001-05
王咸鋒,男,海南澄邁人,本科,副教授,研究方向:圖形圖像處理。
廣東省科技計劃資助項目,項目編號:2009A040103002。