王咸鋒 黃妙燕
摘要:由于高拍儀設(shè)備自身拍攝的特點(diǎn),以及被拍攝物體擺放不當(dāng)?shù)仍颍臄z的圖像邊緣經(jīng)常會出現(xiàn)偏斜。該文提供的方法是先從視頻流中實(shí)時(shí)取到圖像;然后對圖像進(jìn)行去噪點(diǎn);再把圖像進(jìn)行二值化;利用Hough變換找到直線,計(jì)算直線的角度,直線的角度就是圖需要旋轉(zhuǎn)的角度;對四條直線方程進(jìn)行規(guī)整,輸出四條直線圍成的矩形;最后將矩形實(shí)時(shí)的顯示在視頻上,并在視頻上通過畫方框的方式將結(jié)果顯示出來,矩形顯示成功表示糾偏成功,有效保證用戶一次拍圖就能夠獲取自己想要的圖像。
關(guān)鍵詞:攝像頭;可視化;糾偏;二值化;OpenCV
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)24-0087-03
1 背景
目前常見的電腦周邊辦公設(shè)備如高拍儀,是一種視頻輸入設(shè)備,被廣泛地運(yùn)用于辦公掃描,教育、展示等方面。通過高拍儀獲取的文檔影像進(jìn)行處理日益成為人們研究的熱點(diǎn)。在銀行、電信、公安、公積金、財(cái)稅、證券等行業(yè), 票據(jù)及證件的電子影像系統(tǒng)已經(jīng)出現(xiàn),這些系統(tǒng)通常以票據(jù)及證件的拍攝圖像作為輸入。在拍攝輸入的過程中, 由于擺放不當(dāng)、紙張折疊及其他各種因素, 拍攝得到的圖像總是偏斜,在具體應(yīng)用中,將文檔糾正,然后用去黑邊算法去掉周圍的黑邊。高拍儀作為一種新型掃描設(shè)備,已經(jīng)躋身掃描市場,但是通過高拍儀掃描的圖像噪點(diǎn)較多、亮度不均勻,使得基于傳統(tǒng)掃描儀的糾偏算法失效;同時(shí),由于高拍儀是開放環(huán)境、光線變化很大,文檔放置很隨意,所以不能百分百保證糾偏成功,給用戶帶來很大困惑。
為了解決以上問題,本文提供一種在高拍儀的可視化下基于OpenCV糾偏的方法,有效保證用戶一次拍圖就能夠獲取自己想要的圖像,同時(shí)給用戶一種新的用戶體驗(yàn)。
2 概述
在一個(gè)高拍儀處理系統(tǒng)中,獲得實(shí)時(shí)圖像后,一般要進(jìn)行預(yù)處理。在公安、電信、公積金等行業(yè)的票據(jù)及證件電子影像系統(tǒng)、汽車牌照的抓拍識別系統(tǒng)以及OCR識別等系統(tǒng)中,通過高拍儀輸入設(shè)備獲得的圖像由于擺放等原因,物體會產(chǎn)生一定的斜角,斜角會給圖像處理與分析時(shí)帶來更大的難度,使處理變慢,用戶體驗(yàn)差,因此,糾正斜角是圖像預(yù)處理的重要工作。
糾偏校正的核心在于如何檢測出圖像的偏角。目前,糾偏角度的檢測方法有許多種,主要可分為5 類:Hough變換法,交叉相關(guān)性方法,投影法,F(xiàn)ourier變換法和最近鄰簇法。
Hough變換法是最簡單常用的檢測偏角方法,但是Hough算法計(jì)算量大,因此一些專門用于糾偏角檢測的Hough變換改進(jìn)算法被提出來,雖然這些算法的核心思想是減少Hough變換的計(jì)算量,但算法的速度仍較慢;交叉相關(guān)性法矩陣的計(jì)算量較大,體驗(yàn)差,不適合用于辦公等日常應(yīng)用,但準(zhǔn)確率高;投影法利用投影的某些特征進(jìn)行判斷,需要對整個(gè)圖像統(tǒng)計(jì)特征值,因此計(jì)算量和復(fù)雜度都較高;Fourier法是將文檔圖像的所有像素點(diǎn)進(jìn)行Fourier變換,計(jì)算量更大,目前已被棄用;最近鄰簇(KNN) 法算法太過復(fù)雜,且運(yùn)行速度慢,計(jì)算量大。本文使用的是基于OpenCV庫的Hough算法。
3 OpenCV簡介
OpenCV是Intel開源的計(jì)算機(jī)視覺庫(open source computer vision library)的簡稱,目前已經(jīng)發(fā)展成為圖像預(yù)處理的標(biāo)準(zhǔn),適用于不同的操作系統(tǒng)和平臺,包括移動平臺等,如安卓等等。OpenCV庫由C函數(shù)和C++函數(shù)構(gòu)成,實(shí)現(xiàn)了在圖像處理以及計(jì)算機(jī)視覺方面的許多通用算法,主要對圖像進(jìn)行如運(yùn)動檢測、跟蹤、分割、識別以及3D重建等高級處理。OpenCV庫有300多個(gè)跨平臺的中、高層API(C函數(shù)),C函數(shù)不依賴外部庫,但可以使用外部庫。由于OpenCV庫是開放源碼且代碼簡潔高效,其中大多數(shù)函數(shù)都經(jīng)過匯編最優(yōu)化,所以能充分利用英特爾系列的芯片的設(shè)計(jì)體系,因而對于英特爾系列芯片,OpenCV庫的代碼執(zhí)行效率是非常高的。OpenCV庫具有快速的圖像運(yùn)算能力和強(qiáng)大的矩陣運(yùn)算能力,并且具有詳細(xì)、簡潔的圖像和矩陣用戶接口。OpenCV已發(fā)布了多個(gè)版本,最新的版本支持主流的操作系統(tǒng),包括PC端和移動端的操作系統(tǒng),為開發(fā)者提供了開發(fā)便利,大大提升了開發(fā)效率,并且圖像算法穩(wěn)定可靠。本文程序運(yùn)行環(huán)境為:Windows+VS2012+OpenCV 2.0+DirectShow9.0。
4 核心算法流程
本方法可以實(shí)時(shí)運(yùn)行糾偏算法,并在高拍儀視頻上通過畫方框的方式將結(jié)果顯示出來。具體地,先從視頻流中實(shí)時(shí)取到圖像;然后對圖像進(jìn)行去噪點(diǎn);再把圖像進(jìn)行二值化;利用Hough變換找到直線,計(jì)算直線的角度,直線的角度就是圖需要旋轉(zhuǎn)的角度;對四條直線方程進(jìn)行規(guī)整,輸出四條直線圍成的矩形;最后將矩形實(shí)時(shí)的顯示在視頻上。
4.1 從攝像頭中實(shí)時(shí)獲取圖像
實(shí)時(shí)顯示是本方法的一個(gè)重要特色,為了做到實(shí)時(shí)顯示,我們對高拍儀所傳輸?shù)拿恳粠瑘D像都進(jìn)行處理,同時(shí)保證處理時(shí)間在20ms以內(nèi),這樣就可以保證實(shí)時(shí)計(jì)算,實(shí)時(shí)框選,當(dāng)用戶移動紙張,或者掃描文檔有變化的時(shí)候,會及時(shí)跟蹤并框選當(dāng)前文檔,讓視頻跟畫框同步。實(shí)時(shí)顯示讓用戶掃描起來更便利,更快捷。
把圖像讀進(jìn)內(nèi)存,由于處理的是文本、表格等文檔,彩色信息在處理過程中并沒有作用,所以把內(nèi)存中的圖像進(jìn)行二值化處理,以灰度形式顯示。讀取的圖像如下:
為了能更好地模擬旋轉(zhuǎn)效果,在放置拍照文檔時(shí)隨意傾斜一定的角度,以便給后面處理。
4.2 去噪點(diǎn)——對圖像進(jìn)行平滑處理
在對圖像進(jìn)行平滑處理時(shí),需要注意的是在用窗口掃描圖像過程中,對于圖像四個(gè)邊緣的像素點(diǎn)可以不處理,也可以使用灰度值為0的像素點(diǎn)擴(kuò)展圖像的邊緣。為了使編程工作簡單,可以預(yù)先定義一個(gè)的模板數(shù)組。對于小的卷積核(從3x3到7x7),使用上述計(jì)算標(biāo)準(zhǔn)sigma的公式速度會更快。本文使用OpenCV的cvSmooth函數(shù)來平滑圖像,為圖像的二值化做好準(zhǔn)備。
4.3 圖像二值化
二值化之前,為了提高處理速度,首先對圖像進(jìn)行縮放,這樣就能保證圖像處理的實(shí)時(shí)顯示。
設(shè)定一個(gè)閾值T是圖像二值化最常用的方法,用閾值T將圖像的數(shù)據(jù)分成兩部分:簡單地說就是將整個(gè)圖像呈現(xiàn)出只有黑和白的視覺效果,大于T的像素群是黑的,小于T的像素群是白的,將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255。 但是此方法確定的閥值得到的二值化在光線變化和亮度不均勻的時(shí)候效果很差,不能商用。本文使用迭代法求閾值:預(yù)先設(shè)置一個(gè)經(jīng)過學(xué)習(xí)的閾值T,對圖像中灰度值>T的像素點(diǎn)求出灰度平均值T1,圖像中灰度值 本文中的二值化使用OpenCV的cvThreshold函數(shù),該函數(shù)的典型應(yīng)用是對灰度圖像進(jìn)行閾值操作得到二值圖像,函數(shù)中的閥值使用上面迭代法求得。 4.4 利用Hough變換找到直線 為了準(zhǔn)確找到直線,我們首先采用Canny算法尋找輸入圖像的邊緣,并在輸出圖像中標(biāo)志這些邊緣,Canny算法的核心包括以下幾個(gè)步驟: 1)用高斯濾波器平滑圖像。 2)用一階偏導(dǎo)的有限差分計(jì)算梯度的幅值和方向。 3)對梯度幅值進(jìn)行非極大值抑制。 4)用雙閥值算法檢測和連接邊緣。 5)采用高斯平滑函數(shù)。 本文中的找邊和找直線使用OpenCV庫的cvCanny函數(shù)和cvHoughLines2函數(shù)。依次遍歷找到的直線,計(jì)算找到直線的角度,判斷是否已找完所有直線,如已找完,計(jì)算需要旋轉(zhuǎn)的角度,如圖4所示,操作流程如下: 當(dāng)所拍攝物體傾角大于 45°時(shí),進(jìn)行糾偏旋轉(zhuǎn)有兩種情況選擇,逆時(shí)針旋轉(zhuǎn)使物體豎起來,或順時(shí)針旋轉(zhuǎn)使物體橫向放置。為簡化操作和提升效率,算法中增加偏角限制為 45°,即在Hough變換中找到的直線角度大于 45°時(shí),不進(jìn)行直線的統(tǒng)計(jì)與運(yùn)算,只運(yùn)算 1/4 的角度,可提升4倍的運(yùn)算效率。 通過Canny算法找邊和對邊進(jìn)行Hough變換,會得到四條直線,通過四條直線構(gòu)建一個(gè)四邊形,在界面上顯示出來構(gòu)建的矩形,如果能在界面上顯示出來構(gòu)建的矩形,則認(rèn)為糾偏成功,如果不能在界面上顯示出來構(gòu)建的矩形,就認(rèn)為糾偏失敗。 5 結(jié)束語 采用本文所述的方案能夠?qū)崿F(xiàn)高拍儀可視化下穩(wěn)定的糾偏,這使得高拍儀相對于普通拍攝儀的一個(gè)優(yōu)點(diǎn)在于可視化,可實(shí)時(shí)顯示拍攝的內(nèi)容,糾偏結(jié)果可視化,帶來了非常友好的用戶體驗(yàn),讓用戶知道將要掃描的文檔是否可以正常完成糾偏操作,告知用戶將要糾偏哪些內(nèi)容,真正做到所見即所得,保證用戶一次拍圖就能夠獲取自己想要的圖像,將高拍儀可視化的優(yōu)點(diǎn)提到一個(gè)新的高度,同時(shí)給用戶一種新的用戶體驗(yàn)。糾偏的效果如下圖所示: 參考文獻(xiàn): [1] 劉瑞禎, 于仕琪. OpenCV 教程[M]. 北京: 北京航空航天大學(xué)出版社, 2009. [2] 左飛, 萬晉森, 劉航. Visual C++ 數(shù)字圖像處理開發(fā)入門與編程實(shí)踐[M]. 北京: 電子工業(yè)出版社, 2008. [3] 江超, 艾矯燕. 基于OpenCV的攝像頭動態(tài)手勢軌跡識別及其應(yīng)用[J]. 計(jì)算機(jī)應(yīng)用, 2012(1): 129-133. [4] 賈小軍, 喻擎蒼. 基于開源計(jì)算機(jī)視覺庫OpenCV的圖像處理[J]. 計(jì)算機(jī)應(yīng)用與軟件, 2008(4): 276-278.