馬金輝,周 斌,趙明冬
(鄭州科技學院,河南 鄭州 450064)
電表是檢測用電安全和統計用電量的重要手段和工具,但由于使用成本和某些特殊場景需求的限制,大多數電表并未更換為新一代智能電表。 目前多維人工定時讀取電表數據,記錄用電量,這種方法存在主觀性大、工作效率和識別率低等缺陷,因此,電表數字的自動識別成了當前研究的熱點問題。 如通過同態濾波和改進的Bersen 算法對電表數字區域的自動定位[1];通過優化Faster R-CNN 網絡識別電表讀數[2];基于BP 神經網絡的機械式電表數字自動識別方法[3]。 目前,數字電表識別的解決方案大多依賴較為復雜的算法,這導致硬件系統的處理速度受到限制,難以形成輕量化系統。 為此,本文提出基于STM32 單片機的電表自動識別方法,以達到輕量化數字識別的需求。
本系統以STM32F103ZET6TR 單片機作為控制核心,完成電表數字識別系統的設計與制作,系統框如圖1 所示,包括了主控模塊、數字檢測與識別模塊、電源模塊、按鍵模塊,能夠完成自動識別電表讀數的功能。

圖1 電表數字識別系統
主控模塊以STM32F103ZET6TR 單片機作為系統主控系統,其內核為性能強、高性價比、低功耗的嵌入式應用專門設計的cortex-M 內核,該單片機上集成了32~512 KB 閃存,數據處理非常迅速,功能極其強大,時鐘頻率可達到72 MHz,是同類產品中性能最好的產品,完全能夠滿足系統的圖像處理需求,并且能達到系統輕量化的目標。
系統選用OpenMV 攝像頭作為數字檢測與識別模塊,OpenMV 為一個開源,高性價比,是具有功能強大的機器視覺系統,不僅搭載了OV7725 攝像芯片,而且相較于其他圖像識別模塊,OpenMV 可以在有限的硬件條件下實現核心機器視覺算法,并具有數據存儲的卡槽,可以通過SD 卡存儲大量的字模圖片。 用戶能夠把控圖像品質、數據格式和傳輸模式。 而其自身獨有的OV 圖像傳感器技術,還可以得到清晰穩定的圖像,達到本實驗所需的圖像效果。
與此同時,其內置了一些圖像處理算法,使用時可以直接調用庫實現數字識別功能。 此模塊負責對電表圖像進行采集和預處理,并在此基礎上構建出字模庫[4];再由字模庫與采集的圖像進行字符匹配。
系統采用TFT 液晶顯示屏作為讀數圖像顯示模塊,采用ILI9341 作為2.8 英寸的TFT-LCD 的液晶控制驅動。 TFT 液晶顯示屏不僅可以直接顯示出識別出的結果,便于判斷系統識別數字的準確性和調試系統時結果的實時性,還可以顯示系統當前狀態,以便進行復位或切換模式等操作;其本身所具有的價格便宜、操作簡單、抗干擾能力強等優點非常適合本系統。
電源模塊由兩節18650 鋰電池串聯經過MP1584和AMS1117 的變壓處理,為整個系統提供5V 或者3.3V 電壓,再經過濾波部分、穩壓部分,確保電路的正常穩定工作。
按鍵模塊由1×3 的按鍵矩陣構成,其功能分別為:復位、向上切換模式、向下切換模式;由于外界因素和硬件本身的不確定性,會導致系統在使用過程中產生較大的誤差,因此需要進行復位以保證系統可以正常運行;而通過觸發上下切換模式的按鍵,則會切換系統內儲存的各類電表的字符庫,減少了在PC 端配置的步驟,令整個系統更加便捷化、輕量化。
該系統軟件使用C 語言進行軟件編寫,采用Keil 5 進行編程,搭配Proteus 進行仿真測試,最后用Stcisp 燒錄軟件下載至STM32F103ZET6TR 單片機中。主程序流程如圖2 所示。 系統進行初始化程序,根據要識別電表的實際情況設置識別參數,通過OpenMV采集圖片;進入灰度化處理、二值化處理、識別讀數區域、字符裁剪的圖像預處理子程序;進入數字識別子程序,使用字符匹配對電表讀數進行識別;將識別結果輸出至TFT 液晶顯示屏上。

圖2 主程序流程
因為OpenMV 采集的圖像為彩色圖像,不利于本系統對讀數的識別,所以為了便于后續的處理工作,在接收到圖像后,首先要對其進行灰度化和二值化處理。 通過像素點之間的灰度值差異程度來確定要識別讀數的區域;對識別區域的圖像再次進行二值化處理,獲得相鄰字符間的邊界,并按照其左右邊界將連續的字符串分割為單個字符;對字符圖片進行歸一化。
3.2.1 灰度化處理
一幅彩色圖像的任一像素上的顏色均由R、G、B這3 種單色構成,每個像素的顏色值又稱為灰度,指黑白圖像中點的顏色深度,范圍一般從0 到255,白色為255,黑色為0。 對圖像進行灰度化測試處理,其原圖像與灰度化圖像如圖3 所示,通過灰度化處理令圖像的內存占有更小,運算速度更快[5]。 可以排除不必要的信息,增強對比,更加突出目標區域,為下一步的二值化處理做基礎。

圖3 原圖像與灰度化圖像
3.2.2 二值化處理
圖像二值化就是將圖像上的像素點的灰度值設置為0 或255,也就是將整個圖像呈現出明顯的黑白效果的過程。 經過灰度化處理后雖然排除了一些不必要的信息,但圖像還是包含了要識別的目標區域、背景和其他干擾因素。 為了之后對圖像進行分割操作,還要對灰度化處理后的圖像進行二值化處理,使圖像中數據量大為減少,從而凸顯出更清晰的特征信息。
本系統使用大津法(OTSU 算法)對圖像進行二值化處理[6]。 設灰度圖像灰度級是1~m 級,則將灰度范圍在K 處截為C0={1~K}與C1={K+1~m}兩部分,通過計算得出兩部分出現的概率ω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)
計算當σ2(K)最大時K 的值K?,那么這時K?即為大津法二值化的最佳閾值。
對圖像進行測試處理,其灰度化圖像和二值化圖像的結果如圖4 所示。

圖4 灰度化與二值化圖像
3.2.3 識別讀數區域
通過二值化分析出各行的跳變點,因為讀數區域為字符,與其他范圍差10 個,通過跳變點的分析和判斷,即可判斷出需要識別的讀數區域。 本系統程序中設定跳變點大于10 個,在連續行存在多個跳變點大于10 的位置處即為識別區域的上邊邊界Y-start,結束位置設定為識別區域的下邊邊界Y-end。 再通過同樣的方法識別出車牌區域的左邊邊界X-start 和右邊邊界X-end。 這樣既可獲取讀數區域的準確邊界,從而確定目標讀數區域,如圖5 示。

圖5 目標讀數區域
3.2.4 字符裁剪
由于系統使用的是匹配法識別數字,所以需要將數字串切割為單個數字,以便于下一步的數字識別操作,在目標讀數區域確定后,再次通過二值化進行字符的分割處理。 在處理過程中,首先獲取各個字符的左邊邊界B-left 和右邊邊界B-right,接著按照邊界切割數字,對于一般電表,若分割出6 個字符,則認為分割結果比較準確,數字切割后圖像如圖6 所示。

圖6 切割處理后的圖像
系統使用基于NCC(Normalized Cross Correlation)算法,歸一化互相關匹配法,來實現數字識別功能[7]。
NCC 算法是OpenMV 中一種常用的成熟的圖像匹配算法,其優點為抗干擾能力強,當灰度變化不大時精度很高,符合本系統的要求。 NCC 算法結果只會在-1 到1 之間,所以非常容易量化比較結果,只要給出一個閾值就可以判別結果的好與壞。
在原始圖像中任取一個點( px,py) 作為一個n ×n 匹配范圍的基準點。 接著對于目標相對位置(px+d,py) 同樣構建一個n ×n 大小的匹配范圍,對兩個范圍進行相似度對比。 NCC 算法公式如下:
其中, NCC(p,d) 的區間為[- 1,1],Wp為匹配區間,I1(x,y) 為初始圖像的像素值為初始區間內的像素均值,I2(x + d,y) 為對應點在x 方向上偏移d 后的像素值,為平移后目標范圍內的像素均值。
當NCC=-1 時,則表示兩個匹配區間完全不相關,反之,當NCC=1 時,則表示兩個匹配區間強相關。此時,系統就會輸出與模板強相關所代表的數字作為這一位的讀數結果。
使用系統對目標進行識別,研究表明:在上午8點光照條件良好的情況下,系統識別的正確率可達到90%;在晚上八點時光照條件不理想的情況下,系統不能識別出電表讀數。
為滿足生活中數字電表讀數的輕量化需求,本文利用STM32 單片機結合自構字符實現了電表數字的識別功能。 在光照條件良好的情況下,該方法能夠實現90%以上的正確率,達到了設計效果。 但是在設計中仍存在一些需要改進的方面,例如光線過暗時需要輔助照明、數據通過無線網絡上傳系統終端等。