張敬業(yè) 郭亮 張?jiān)品?/p>
摘 要 目前各類文字識(shí)別軟件并不匱乏,但普遍需要以圖片文件形式作為輸入,或者僅支持軟件內(nèi)部視圖中的內(nèi)容獲取與識(shí)別,難以在系統(tǒng)層面對(duì)屏幕顯示的任意內(nèi)容進(jìn)行截取和文字識(shí)別?;赥esseract識(shí)別引擎,設(shè)計(jì)實(shí)現(xiàn)了一種輕量化的屏幕文字識(shí)別軟件,能夠?qū)崿F(xiàn)利用鼠標(biāo)對(duì)屏幕任意矩形區(qū)域劃定內(nèi)容的文字識(shí)別,從屏幕截取、文字識(shí)別,到識(shí)別結(jié)果展示實(shí)現(xiàn)了無縫的自動(dòng)化銜接?;赥esseract優(yōu)秀的文字識(shí)別率和快捷的屏幕內(nèi)容點(diǎn)劃截取功能,有效提升了文字識(shí)別軟件使用的效率和便利程度。
關(guān)鍵詞 Tesseract;屏幕文字識(shí)別軟件;軟件設(shè)計(jì)
目前各類文字識(shí)別軟件并不匱乏,但大部分需要以圖片文件或文檔文件的方式向軟件提供輸入,經(jīng)由軟件識(shí)別后給出識(shí)別結(jié)果。這種方式比較適合于已有大量待識(shí)別文件的情況下進(jìn)行批量識(shí)別。但另一種常見的文字識(shí)別使用場(chǎng)景是待識(shí)別的內(nèi)容是隨著使用者的某些動(dòng)作逐步呈現(xiàn)的,例如使用者在網(wǎng)絡(luò)搜索和資料閱讀的過程中不斷發(fā)現(xiàn)需要進(jìn)行文字識(shí)別的內(nèi)容[1]。在這種情況下,使用者更希望以靈活高效的方式對(duì)所需識(shí)別的內(nèi)容進(jìn)行截取和自動(dòng)化識(shí)別。利用鼠標(biāo)點(diǎn)劃的方式截取屏幕任意矩形區(qū)域進(jìn)行自動(dòng)化識(shí)別是一種便捷的方式,但目前能夠?qū)崿F(xiàn)這一功能的輕量級(jí)文字識(shí)別軟件還不多,部分軟件能夠在其軟件內(nèi)部視圖中進(jìn)行內(nèi)容獲取與識(shí)別,但無法在系統(tǒng)層面實(shí)現(xiàn)對(duì)屏幕顯示的任意內(nèi)容進(jìn)行截取和文字識(shí)別。本文基于Tesseract識(shí)別引擎設(shè)計(jì)實(shí)現(xiàn)了一種輕量化的屏幕文字識(shí)別軟件,能夠?qū)崿F(xiàn)利用鼠標(biāo)對(duì)屏幕任意矩形區(qū)域劃定內(nèi)容的文字識(shí)別,從屏幕截取、文字識(shí)別,到識(shí)別結(jié)果展示實(shí)現(xiàn)了無縫的自動(dòng)化銜接。該軟件將Tesseract引擎優(yōu)秀的文字識(shí)別率和快捷的屏幕內(nèi)容點(diǎn)劃截取識(shí)別功能相結(jié)合,有效提升了文字識(shí)別軟件使用的效率和便利程度。
1基于Tesseract的屏幕文字識(shí)別軟件的設(shè)計(jì)
本文中屏幕文字識(shí)別軟件主要基于Tesseract識(shí)別引擎和Java Swing GUI技術(shù)進(jìn)行設(shè)計(jì)構(gòu)建,以下首先對(duì)Tesseract識(shí)別引擎和Java Swing進(jìn)行簡(jiǎn)要介紹,然后對(duì)軟件具體設(shè)計(jì)進(jìn)行描述。
1.1 Tesseract引擎
Tesseract引擎最初在1985年由惠普實(shí)驗(yàn)室作為專有軟件開發(fā),之后于2005年作為開源軟件發(fā)布。其可以運(yùn)行于Linux,Windows和Mac OSX系統(tǒng)上。就字符識(shí)別精度而言,Tesseract在20世紀(jì)90年代即被認(rèn)為位居光學(xué)字符識(shí)別(Optical Character Recognition,OCR)引擎的前三名。目前Tesseract引擎的最新版本V4中增加了基于長(zhǎng)短期記憶(Long Short-Term Memory,LSTM)時(shí)間循環(huán)神經(jīng)網(wǎng)絡(luò)的識(shí)別模型,進(jìn)一步提高了文字識(shí)別率,并且其所支持識(shí)別的語(yǔ)言也達(dá)到了116種。
1.2 Java Swing
Java是目前應(yīng)用最為廣泛的計(jì)算機(jī)編程語(yǔ)言之一,Swing是Java的圖形用戶界面(Graphical User Interface,GUI)工具包,其提供了豐富的GUI開發(fā)功能。選擇Java Swing與Tesseract引擎相結(jié)合進(jìn)行屏幕文字識(shí)別軟件的開發(fā)具有較為明顯的優(yōu)勢(shì),一方面Java Swing歷經(jīng)長(zhǎng)時(shí)間的實(shí)踐應(yīng)用,具有成熟穩(wěn)定,功能完善的特點(diǎn)[2];另一方面,由于Swing使用純Java實(shí)現(xiàn),所以同Java本身一樣具備跨平臺(tái)能力,其與Tesseract相配合,能夠充分發(fā)揮Tesseract引擎自身已具備的多平臺(tái)運(yùn)行能力。
1.3 軟件設(shè)計(jì)
基于Tesseract引擎和Java Swing工具包,本文設(shè)計(jì)的屏幕文字識(shí)別軟件模塊構(gòu)成與基本工作流程如圖1所示。
軟件主要包含屏幕截取模塊、文字識(shí)別模塊和結(jié)果顯示模塊。首先由屏幕截取模塊對(duì)當(dāng)前屏幕顯示內(nèi)容進(jìn)行完整截圖,得到的圖片被靜態(tài)置于系統(tǒng)頂層顯示,避免被其他應(yīng)用遮擋。然后屏幕截取模塊會(huì)記錄使用者在屏幕完整圖片上進(jìn)行點(diǎn)劃框選的起止點(diǎn)坐標(biāo),并利用該坐標(biāo)對(duì)完整圖片進(jìn)行裁剪獲得子圖。子圖被送入文字識(shí)別模塊經(jīng)Tesseract引擎分析后得到識(shí)別結(jié)果字符串。然后該字符串被送至結(jié)果顯示模塊,將被自動(dòng)展示給使用者。
2軟件的功能實(shí)現(xiàn)
2.1 屏幕任意矩形范圍內(nèi)容截取的實(shí)現(xiàn)
屏幕任意矩形范圍內(nèi)容的截取主要通過兩個(gè)步驟來具體實(shí)現(xiàn),一是將當(dāng)前時(shí)刻的完整屏幕顯示內(nèi)容進(jìn)行獲取和緩存;二是將緩存的完整屏幕圖片進(jìn)行置頂顯示,然后記錄使用者鼠標(biāo)點(diǎn)劃動(dòng)作框定范圍的坐標(biāo),再按坐標(biāo)值提取完整圖片的子圖片。
當(dāng)前時(shí)刻的完整屏幕顯示內(nèi)容主要利用java.awt.Robot中的createScreenCapture(Rectangle screenRect)方法來實(shí)現(xiàn),其中screenRect參數(shù)可以指定為new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()),即獲取整個(gè)屏幕內(nèi)容。獲取完整屏幕圖片后,將其靜態(tài)顯示于屏幕最頂層,以防被其他應(yīng)用遮擋。
然后通過記錄使用者鼠標(biāo)點(diǎn)劃動(dòng)作的起止點(diǎn)來確定其選取的圖片具體范圍。通過addMouseMotionListener(MouseMotionListener l)方法來添加一個(gè)鼠標(biāo)監(jiān)聽器,并需要重寫監(jiān)聽器中的mouseDragged(MouseEvent evn)方法利用evn.getX()和evn.getY()來提取鼠標(biāo)拖動(dòng)前后的坐標(biāo)點(diǎn)位置。獲得具體坐標(biāo)位置后用BufferedImage類的getSubimage(int x, int y, int w, int h)即可得到使用者選定區(qū)域的子圖片。
2.2 基于Tesseract的文字識(shí)別功能實(shí)現(xiàn)
Java應(yīng)用程序調(diào)用Tesseract引擎實(shí)現(xiàn)文字識(shí)別功能比較便利的方式是通過Tesseract的Java Native Access包裝器Tess4j來實(shí)現(xiàn),需要先將Tess4j的jar文件添加到項(xiàng)目中。
在需要進(jìn)行文字識(shí)別時(shí),首先創(chuàng)建ITesseract類的對(duì)象instance,然后利用其setDatapath?(String datapath)方法設(shè)定識(shí)別訓(xùn)練文件所在的目錄位置,利用其setLanguage?(String language)設(shè)置要進(jìn)行識(shí)別的語(yǔ)言語(yǔ)種。在Tesseract項(xiàng)目主頁(yè)可以下載其支持的116種語(yǔ)言的訓(xùn)練文件。最后,執(zhí)行instance.doOCR(BufferedImage bi)即可得到識(shí)別結(jié)果字符串。
2.3 識(shí)別結(jié)果輸出的實(shí)現(xiàn)
識(shí)別結(jié)果輸出最簡(jiǎn)單的方式是將其寫入一個(gè)文本文件,然后使用者自行打開該文本文件根據(jù)需要進(jìn)行進(jìn)一步處理,但這種方式的自動(dòng)化程度不高,使用者找到并打開識(shí)別結(jié)果文件較為費(fèi)時(shí)。在本文軟件中識(shí)別結(jié)果輸出的實(shí)現(xiàn)方式是將其放入javax.swing.JTextPane中,當(dāng)識(shí)別完成后自動(dòng)彈出一個(gè)包含該JTextPane的對(duì)話框,將識(shí)別結(jié)果直接呈現(xiàn)給使用者[3]。
需要注意的是,由于Tesseract支持多達(dá)116種語(yǔ)言的識(shí)別,對(duì)于一些復(fù)雜文字識(shí)別結(jié)果在JTextPane上的正常顯示,可能需要利用Java的字體載入功能對(duì)相關(guān)的外部字體進(jìn)行預(yù)先加載。
3結(jié)束語(yǔ)
本文設(shè)計(jì)的屏幕文字識(shí)別軟件將Tesseract引擎優(yōu)秀的文字識(shí)別率和便捷的系統(tǒng)級(jí)屏幕內(nèi)容點(diǎn)劃截取功能相結(jié)合,實(shí)現(xiàn)了從屏幕任意內(nèi)容截取、文字識(shí)別,到識(shí)別結(jié)果展示的無縫自動(dòng)化銜接,有效提升了文字識(shí)別軟件的使用效率和便利程度,也為今后開發(fā)設(shè)計(jì)相關(guān)文字識(shí)別軟件提供了參考。
參考文獻(xiàn)
[1] 趙滿來.Java語(yǔ)言GUI程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2018: 167-175.
[2] Tesseract Open Source OCR Engine[EB/OL].https://github.com/tesseract-ocr/tesseract,2020-08-25.
[3] Tess4J Project[EB/OL].http://tess4j.sourceforge.net/,2020-08-25.