馬金輝,周 斌,趙明冬
(鄭州科技學(xué)院,河南 鄭州 450064)
電表是檢測用電安全和統(tǒng)計用電量的重要手段和工具,但由于使用成本和某些特殊場景需求的限制,大多數(shù)電表并未更換為新一代智能電表。 目前多維人工定時讀取電表數(shù)據(jù),記錄用電量,這種方法存在主觀性大、工作效率和識別率低等缺陷,因此,電表數(shù)字的自動識別成了當(dāng)前研究的熱點問題。 如通過同態(tài)濾波和改進的Bersen 算法對電表數(shù)字區(qū)域的自動定位[1];通過優(yōu)化Faster R-CNN 網(wǎng)絡(luò)識別電表讀數(shù)[2];基于BP 神經(jīng)網(wǎng)絡(luò)的機械式電表數(shù)字自動識別方法[3]。 目前,數(shù)字電表識別的解決方案大多依賴較為復(fù)雜的算法,這導(dǎo)致硬件系統(tǒng)的處理速度受到限制,難以形成輕量化系統(tǒng)。 為此,本文提出基于STM32 單片機的電表自動識別方法,以達到輕量化數(shù)字識別的需求。
本系統(tǒng)以STM32F103ZET6TR 單片機作為控制核心,完成電表數(shù)字識別系統(tǒng)的設(shè)計與制作,系統(tǒng)框如圖1 所示,包括了主控模塊、數(shù)字檢測與識別模塊、電源模塊、按鍵模塊,能夠完成自動識別電表讀數(shù)的功能。
圖1 電表數(shù)字識別系統(tǒng)
主控模塊以STM32F103ZET6TR 單片機作為系統(tǒng)主控系統(tǒng),其內(nèi)核為性能強、高性價比、低功耗的嵌入式應(yīng)用專門設(shè)計的cortex-M 內(nèi)核,該單片機上集成了32~512 KB 閃存,數(shù)據(jù)處理非常迅速,功能極其強大,時鐘頻率可達到72 MHz,是同類產(chǎn)品中性能最好的產(chǎn)品,完全能夠滿足系統(tǒng)的圖像處理需求,并且能達到系統(tǒng)輕量化的目標。
系統(tǒng)選用OpenMV 攝像頭作為數(shù)字檢測與識別模塊,OpenMV 為一個開源,高性價比,是具有功能強大的機器視覺系統(tǒng),不僅搭載了OV7725 攝像芯片,而且相較于其他圖像識別模塊,OpenMV 可以在有限的硬件條件下實現(xiàn)核心機器視覺算法,并具有數(shù)據(jù)存儲的卡槽,可以通過SD 卡存儲大量的字模圖片。 用戶能夠把控圖像品質(zhì)、數(shù)據(jù)格式和傳輸模式。 而其自身獨有的OV 圖像傳感器技術(shù),還可以得到清晰穩(wěn)定的圖像,達到本實驗所需的圖像效果。
與此同時,其內(nèi)置了一些圖像處理算法,使用時可以直接調(diào)用庫實現(xiàn)數(shù)字識別功能。 此模塊負責(zé)對電表圖像進行采集和預(yù)處理,并在此基礎(chǔ)上構(gòu)建出字模庫[4];再由字模庫與采集的圖像進行字符匹配。
系統(tǒng)采用TFT 液晶顯示屏作為讀數(shù)圖像顯示模塊,采用ILI9341 作為2.8 英寸的TFT-LCD 的液晶控制驅(qū)動。 TFT 液晶顯示屏不僅可以直接顯示出識別出的結(jié)果,便于判斷系統(tǒng)識別數(shù)字的準確性和調(diào)試系統(tǒng)時結(jié)果的實時性,還可以顯示系統(tǒng)當(dāng)前狀態(tài),以便進行復(fù)位或切換模式等操作;其本身所具有的價格便宜、操作簡單、抗干擾能力強等優(yōu)點非常適合本系統(tǒng)。
電源模塊由兩節(jié)18650 鋰電池串聯(lián)經(jīng)過MP1584和AMS1117 的變壓處理,為整個系統(tǒng)提供5V 或者3.3V 電壓,再經(jīng)過濾波部分、穩(wěn)壓部分,確保電路的正常穩(wěn)定工作。
按鍵模塊由1×3 的按鍵矩陣構(gòu)成,其功能分別為:復(fù)位、向上切換模式、向下切換模式;由于外界因素和硬件本身的不確定性,會導(dǎo)致系統(tǒng)在使用過程中產(chǎn)生較大的誤差,因此需要進行復(fù)位以保證系統(tǒng)可以正常運行;而通過觸發(fā)上下切換模式的按鍵,則會切換系統(tǒng)內(nèi)儲存的各類電表的字符庫,減少了在PC 端配置的步驟,令整個系統(tǒng)更加便捷化、輕量化。
該系統(tǒng)軟件使用C 語言進行軟件編寫,采用Keil 5 進行編程,搭配Proteus 進行仿真測試,最后用Stcisp 燒錄軟件下載至STM32F103ZET6TR 單片機中。主程序流程如圖2 所示。 系統(tǒng)進行初始化程序,根據(jù)要識別電表的實際情況設(shè)置識別參數(shù),通過OpenMV采集圖片;進入灰度化處理、二值化處理、識別讀數(shù)區(qū)域、字符裁剪的圖像預(yù)處理子程序;進入數(shù)字識別子程序,使用字符匹配對電表讀數(shù)進行識別;將識別結(jié)果輸出至TFT 液晶顯示屏上。
圖2 主程序流程
因為OpenMV 采集的圖像為彩色圖像,不利于本系統(tǒng)對讀數(shù)的識別,所以為了便于后續(xù)的處理工作,在接收到圖像后,首先要對其進行灰度化和二值化處理。 通過像素點之間的灰度值差異程度來確定要識別讀數(shù)的區(qū)域;對識別區(qū)域的圖像再次進行二值化處理,獲得相鄰字符間的邊界,并按照其左右邊界將連續(xù)的字符串分割為單個字符;對字符圖片進行歸一化。
3.2.1 灰度化處理
一幅彩色圖像的任一像素上的顏色均由R、G、B這3 種單色構(gòu)成,每個像素的顏色值又稱為灰度,指黑白圖像中點的顏色深度,范圍一般從0 到255,白色為255,黑色為0。 對圖像進行灰度化測試處理,其原圖像與灰度化圖像如圖3 所示,通過灰度化處理令圖像的內(nèi)存占有更小,運算速度更快[5]。 可以排除不必要的信息,增強對比,更加突出目標區(qū)域,為下一步的二值化處理做基礎(chǔ)。
圖3 原圖像與灰度化圖像
3.2.2 二值化處理
圖像二值化就是將圖像上的像素點的灰度值設(shè)置為0 或255,也就是將整個圖像呈現(xiàn)出明顯的黑白效果的過程。 經(jīng)過灰度化處理后雖然排除了一些不必要的信息,但圖像還是包含了要識別的目標區(qū)域、背景和其他干擾因素。 為了之后對圖像進行分割操作,還要對灰度化處理后的圖像進行二值化處理,使圖像中數(shù)據(jù)量大為減少,從而凸顯出更清晰的特征信息。
本系統(tǒng)使用大津法(OTSU 算法)對圖像進行二值化處理[6]。 設(shè)灰度圖像灰度級是1~m 級,則將灰度范圍在K 處截為C0={1~K}與C1={K+1~m}兩部分,通過計算得出兩部分出現(xiàn)的概率ω0和ω1,平均值μ0和μ1與整體灰度平均值μ,最后求出兩部分之間的方差σ2(K),如下式(1)所示:
σ2(K)= ω0(μ0-μ)2+ω1(μ1-μ)2= ω0ω1(μ1-μ0)2= [μ × ω(K) - μ(K)]2/ω(K)[1 - ω(K)] (1)
計算當(dāng)σ2(K)最大時K 的值K?,那么這時K?即為大津法二值化的最佳閾值。
對圖像進行測試處理,其灰度化圖像和二值化圖像的結(jié)果如圖4 所示。
圖4 灰度化與二值化圖像
3.2.3 識別讀數(shù)區(qū)域
通過二值化分析出各行的跳變點,因為讀數(shù)區(qū)域為字符,與其他范圍差10 個,通過跳變點的分析和判斷,即可判斷出需要識別的讀數(shù)區(qū)域。 本系統(tǒng)程序中設(shè)定跳變點大于10 個,在連續(xù)行存在多個跳變點大于10 的位置處即為識別區(qū)域的上邊邊界Y-start,結(jié)束位置設(shè)定為識別區(qū)域的下邊邊界Y-end。 再通過同樣的方法識別出車牌區(qū)域的左邊邊界X-start 和右邊邊界X-end。 這樣既可獲取讀數(shù)區(qū)域的準確邊界,從而確定目標讀數(shù)區(qū)域,如圖5 示。
圖5 目標讀數(shù)區(qū)域
3.2.4 字符裁剪
由于系統(tǒng)使用的是匹配法識別數(shù)字,所以需要將數(shù)字串切割為單個數(shù)字,以便于下一步的數(shù)字識別操作,在目標讀數(shù)區(qū)域確定后,再次通過二值化進行字符的分割處理。 在處理過程中,首先獲取各個字符的左邊邊界B-left 和右邊邊界B-right,接著按照邊界切割數(shù)字,對于一般電表,若分割出6 個字符,則認為分割結(jié)果比較準確,數(shù)字切割后圖像如圖6 所示。
圖6 切割處理后的圖像
系統(tǒng)使用基于NCC(Normalized Cross Correlation)算法,歸一化互相關(guān)匹配法,來實現(xiàn)數(shù)字識別功能[7]。
NCC 算法是OpenMV 中一種常用的成熟的圖像匹配算法,其優(yōu)點為抗干擾能力強,當(dāng)灰度變化不大時精度很高,符合本系統(tǒng)的要求。 NCC 算法結(jié)果只會在-1 到1 之間,所以非常容易量化比較結(jié)果,只要給出一個閾值就可以判別結(jié)果的好與壞。
在原始圖像中任取一個點( px,py) 作為一個n ×n 匹配范圍的基準點。 接著對于目標相對位置(px+d,py) 同樣構(gòu)建一個n ×n 大小的匹配范圍,對兩個范圍進行相似度對比。 NCC 算法公式如下:
其中, NCC(p,d) 的區(qū)間為[- 1,1],Wp為匹配區(qū)間,I1(x,y) 為初始圖像的像素值為初始區(qū)間內(nèi)的像素均值,I2(x + d,y) 為對應(yīng)點在x 方向上偏移d 后的像素值,為平移后目標范圍內(nèi)的像素均值。
當(dāng)NCC=-1 時,則表示兩個匹配區(qū)間完全不相關(guān),反之,當(dāng)NCC=1 時,則表示兩個匹配區(qū)間強相關(guān)。此時,系統(tǒng)就會輸出與模板強相關(guān)所代表的數(shù)字作為這一位的讀數(shù)結(jié)果。
使用系統(tǒng)對目標進行識別,研究表明:在上午8點光照條件良好的情況下,系統(tǒng)識別的正確率可達到90%;在晚上八點時光照條件不理想的情況下,系統(tǒng)不能識別出電表讀數(shù)。
為滿足生活中數(shù)字電表讀數(shù)的輕量化需求,本文利用STM32 單片機結(jié)合自構(gòu)字符實現(xiàn)了電表數(shù)字的識別功能。 在光照條件良好的情況下,該方法能夠?qū)崿F(xiàn)90%以上的正確率,達到了設(shè)計效果。 但是在設(shè)計中仍存在一些需要改進的方面,例如光線過暗時需要輔助照明、數(shù)據(jù)通過無線網(wǎng)絡(luò)上傳系統(tǒng)終端等。