羅亮 王盼盼
浙教版高中信息技術(shù)教材《數(shù)據(jù)與計(jì)算》,有一個(gè)答題卡填圖識(shí)別算法解析示例,因?yàn)橘N近生活,學(xué)生們都很感興趣。這個(gè)案例可以進(jìn)一步拓展,如通過文檔高拍儀對(duì)答題卡數(shù)據(jù)進(jìn)行采集,那就能實(shí)現(xiàn)一個(gè)真實(shí)的答題卡識(shí)別工具。當(dāng)然,最好的拓展莫過于自己搭建一個(gè)功能更加強(qiáng)大的智能文檔高拍儀原型,那樣不僅可以識(shí)別答題卡,還可以識(shí)別文字、二維碼之類。
文檔高拍儀原型的功能分析
文檔高拍儀的基本功能是圖像采集,增強(qiáng)功能是光學(xué)字符識(shí)別、條碼識(shí)別等。圖像采集分辨率是決定高拍儀型號(hào)的重要依據(jù),像素太高,對(duì)圖片的處理速度和傳輸會(huì)提出新的要求,一般來說,500W像素比較合適??梢?,文檔高拍儀的原型在硬件方面要求很低,選擇任何一款迷你電腦再結(jié)合攝像頭即可。
在學(xué)校眾多的開源硬件中,學(xué)生選擇虛谷號(hào)作為核心硬件。虛谷號(hào)是一個(gè)面向人工智能教學(xué)和Python編程學(xué)習(xí)的開源硬件平臺(tái),板內(nèi)集成高性能處理器和通用單片機(jī)、兼容Arduino,可掛載攝像頭等各種通用外設(shè),可以外接鍵盤顯示器成為獨(dú)立主機(jī),也可以自帶電源獨(dú)立運(yùn)行Arduino、Python程序進(jìn)行相應(yīng)信息處理。想象一下,虛谷、充電寶、攝像頭組合在一個(gè)外殼之中,形成手持設(shè)備,隨走隨拍,是多么方便的事情啊。
圖像采集完成以后,可以嘗試使用開源的光學(xué)字符識(shí)別軟件進(jìn)行字符識(shí)別或者使用百度大腦AI開放平臺(tái)的圖片文本識(shí)別功能。可供選擇的基于Python的開源光學(xué)字符識(shí)別軟件有darknet-ocr、Pyocr、pytesser、Tesseract OCR、CNOCR。這些開源軟件各有擅長(zhǎng)之處,CNOCR適合識(shí)別圖片中的中文,但該開源軟件需要在Windows平臺(tái)下進(jìn)行識(shí)別,所以筆者最終還是采用調(diào)用百度AI功能實(shí)現(xiàn)文檔高拍儀的增強(qiáng)功能。
使用高拍儀肯定需要了解當(dāng)前工作狀態(tài),虛谷號(hào)自帶的LED燈則派上了用場(chǎng)。當(dāng)然,也可以加一塊小型的OLED顯示屏。經(jīng)過以上分析,可以得到文檔高拍儀原型所需軟硬件,如圖1所示,對(duì)應(yīng)處理流程如圖2所示。
文檔高拍儀原型功能實(shí)現(xiàn)
筆者采用模塊化思想將高拍儀功能分解細(xì)化,逐一實(shí)現(xiàn),然后合并功能,大致分成圖片采集、啟動(dòng)處理、狀態(tài)表示、OCR識(shí)別、結(jié)果呈現(xiàn)五大方面。
1.圖片采集
圖片采集是視覺處理Opencv模塊的一個(gè)基本功能。筆者將USB攝像頭通過USB連接上虛谷號(hào)之后,就完成了硬件準(zhǔn)備。frame代表攝像頭采集的像素內(nèi)容,后期需要對(duì)frame進(jìn)行集中處理。在“測(cè)試場(chǎng)景”窗口為當(dāng)前活動(dòng)窗口的情況下,按'q'鍵退出圖片采集,按's'鍵將采集的圖像以文件形式保存。在后期功能合成時(shí),如cv.imshow、cv. destroyAllWindows這些與目標(biāo)功能達(dá)成不一致且耗費(fèi)資源的代碼可以略過不予使用。相關(guān)關(guān)鍵性程序代碼如圖3所示。
2.啟動(dòng)圖片采集識(shí)別
一般情況下,高拍儀通過按鍵方式實(shí)現(xiàn)拍照。虛谷號(hào)自身沒有按鍵,只是預(yù)留有相關(guān)接口。若要啟動(dòng)圖片采集功能,可以采取使用虛谷號(hào)擴(kuò)展板或通過攝像頭采集識(shí)別圖片或聲音中的特殊標(biāo)志來實(shí)現(xiàn)。由于已經(jīng)采用攝像頭來采集圖片而且OpenCV視覺處理可以涉及輪廓檢測(cè),因此可以劃過與被采集場(chǎng)景背景對(duì)比強(qiáng)烈的純色物品,只要虛谷號(hào)識(shí)別出該物品輪廓面積在一定范圍內(nèi),就表示開始啟動(dòng)拍照采集。相關(guān)關(guān)鍵性程序代碼如圖4所示。
3.工作狀態(tài)顯示
虛谷號(hào)兼容Arduino,自帶一個(gè)可程序控制的LED。從虛谷號(hào)開機(jī)到準(zhǔn)備進(jìn)入圖片采集狀態(tài)再到圖片采集進(jìn)行中都可以借助該LED的不同頻率的亮和滅來表示對(duì)應(yīng)的狀態(tài)。實(shí)現(xiàn)狀態(tài)顯示的程序代碼與借助pinpong庫(kù)來實(shí)現(xiàn)基本一致,亮燈滅燈的次數(shù)、亮燈持續(xù)時(shí)間、滅燈持續(xù)時(shí)間,可以通過一個(gè)自定義函數(shù)實(shí)現(xiàn)。例如,ledstatus(led,5,0.2,0.2)表示等待啟動(dòng);ledstatus(led,3,1,1)表示已采集1張圖片;ledstatus(led,2,2,0.5)表示圖片識(shí)別完成,可通過客戶端查看識(shí)別結(jié)果。狀態(tài)顯示相關(guān)模塊代碼使用簡(jiǎn)單通用適應(yīng)各類開源硬件的pinpong庫(kù)完成,如上頁圖5所示。
4.OCR識(shí)別
圖片采集后,可以考慮文檔高拍儀增強(qiáng)功能實(shí)現(xiàn)。從實(shí)現(xiàn)途徑便捷性與OCR識(shí)別效果角度考慮,最終決定還是使用調(diào)用百度API的方式來實(shí)現(xiàn)OCR識(shí)別。訪問百度AI開放平臺(tái),注冊(cè)成為百度開發(fā)者并創(chuàng)建應(yīng)用后就能得到相應(yīng)的AppID、API Key、Secret Key信息。根據(jù)圖6所示的調(diào)用百度AI文本識(shí)別示例代碼可以完成單張圖片中的文字識(shí)別。
經(jīng)過測(cè)試,在同等條件下,采用百度API調(diào)用方式識(shí)別效率比使用開源OCR軟件識(shí)別效率更高。
5.識(shí)別結(jié)果呈現(xiàn)
每次文字識(shí)別結(jié)果可以直接累加存儲(chǔ)在單個(gè)文本文件中,也可以格式化為網(wǎng)頁文件。針對(duì)該存儲(chǔ)識(shí)別結(jié)果的文件可以通過建立Http服務(wù),讓任何一臺(tái)與虛谷迷你電腦聯(lián)網(wǎng)的客戶端查閱。
虛谷自帶WIFI而且安裝了Python,建立Http服務(wù)的代碼很簡(jiǎn)單而且實(shí)用,格式如下:
python3 -m http.server 8000
該代碼含義為指定虛谷迷你電腦當(dāng)前文件夾為Http服務(wù)根目錄,指定訪問端口為8000。
與虛谷迷你電腦聯(lián)網(wǎng)的任何一臺(tái)客戶端都可以打開瀏覽器,輸入訪問網(wǎng)址(http://虛谷迷你電腦IP:8000/)查閱識(shí)別結(jié)果。
文檔高拍儀原型功能改進(jìn)
經(jīng)過測(cè)試,以虛谷號(hào)為核心完成的文檔高拍儀原型能夠基本完成預(yù)設(shè)的功能,但在調(diào)試過程中還發(fā)現(xiàn)存在一些問題,還需要不斷迭代完善,如:
①攝像頭的分辨率不高而且變焦過慢,導(dǎo)致抓拍圖像并不清晰;
②缺少補(bǔ)光功能導(dǎo)致被拍攝對(duì)象本身呈現(xiàn)的亮度不一致,影響后期的文字識(shí)別;
③適當(dāng)增加虛谷號(hào)的傳感控制與狀態(tài)表示,更有利于操作者理解操作進(jìn)程;
④運(yùn)用OPENCV視覺處理能力有待進(jìn)一步加強(qiáng),如調(diào)整對(duì)比度、銳化、降噪等。
運(yùn)用虛谷號(hào)結(jié)合攝像頭實(shí)現(xiàn)文檔高拍儀功能,是一個(gè)典型的開源硬件項(xiàng)目,雖然解決的過程有些坎坷,但收獲很多。教師在學(xué)生的技術(shù)基礎(chǔ)上,給予學(xué)生觸手可及的創(chuàng)意方案庫(kù),充分調(diào)動(dòng)學(xué)生的創(chuàng)意,結(jié)合實(shí)際場(chǎng)景,讓他們不斷提出新的需求,不斷挑戰(zhàn)新的難題,做出實(shí)踐性很強(qiáng)的解決方案。類似虛谷號(hào)的迷你電腦能玩的項(xiàng)目其實(shí)非常多,如視覺處理眼睛控制鼠標(biāo)實(shí)現(xiàn)媒體互動(dòng)、視覺處理無人機(jī)禁飛區(qū)域判斷等,希望有更多的老師帶著學(xué)生一起探究。