comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现
基于FPGA 的MXN維字符識別的實現
1 概述
本文的靈感來源于楊淑英老師的一張PPT(手寫數字識別),在此特別鳴謝楊淑英老師。
一般機器視覺對事物是沒有感知的,比如攝像頭采集到一張蘋果的圖片,它本身是不知道那是什么東西,在計算機里邊就是一個圖像數據矩陣的存在。但是我們人類可以通過各種圖像處理手段,不斷提取事物的特征來讓機器通過特征編碼來識別和區分不同的事物。
2 一種MXN維的手寫字符識別算法
圖1 識別過程
如圖1所示,這是楊淑英老師PPT(手寫數字識別)的一張圖,對于一個字符,首先我們要找到字符的上下左右邊界,然后在把它分為MxN維的矩陣,再提取矩陣的特征,最后通過特征庫匹配來識別字符。此種方法有效的降低了目標的維數,為FPGA的實現提供了可能。
特征形成:根據被識別的對象產生出來的一組基本特征。
特征選擇:對原始數據進行抽取,抽取那些對區別不同類別最為重要的特征,而舍去那些對分類并無多大貢獻的特征,得到能反映分類本質的特征。
特征提取:是模式識別的關鍵,直接影響其識別的分類效果。兩種方法:
1)以框架的左邊框到數字之間的距離變化。
2)將每個數字分成N×N等份,對每一份內的像素個數進行統計,除以每一份的面積總數。
圖2 25維手寫體5
如圖2所示,我們通過每一個小框黑色的占比來從新編碼一個新的5X5矩陣,當模板與之匹配時即可識別數字5,我沒還可以通過人幫助機器不斷學習,讓機器的識別更加準確。
分成N×N等份的好處是:
針對同一形狀、不同大小的樣品得到的特征值相差不大。有能力對同一形狀、不同大小的樣品視為同類,因此這里要求物體至少在寬度和長度上大于N個像素,否則太小無法正確分類。
3 matlab 仿真MXN維字符識別
第一步:首先找到字符上下左右邊界。
I = imread('5.png'); Ib =im2bw(I);[h,w,d] =size(Ib); ROW = w-1; COL = h-1; k=1; for i=1:COLfor j=1:ROWif i>1 && j>1if (Ib(i,j) == 0 &&Ib(i-1,j) == 1) || (Ib(i,j) == 0 &&Ib(i+1,j) == 1) a(k) =i;b(k) =j;k=k+1;endendend endmaxa =max(a); mina =min(a);maxb =max(b); minb =min(b);%boundary for i=1:COLfor j=1:ROWif(i > mina &&i < maxa)&&(j==minb||j==maxb)boundary(i,j,1)= 255;boundary(i,j,2)= 0;boundary(i,j,3)= 0;elseif(i == mina ||i == maxa)&&(j>minb && j<maxb)boundary(i,j,1)= 255;boundary(i,j,2)= 0;boundary(i,j,3)= 0;elseboundary(i,j,1)= I(i,j,1);boundary(i,j,2)= I(i,j,2);boundary(i,j,3)= I(i,j,3);endend end圖3 字符5的上下左右邊界
第二步:分成MXN維。
%MXN DIM for i=1:COLfor j=1:ROWif(i > mina &&i < maxa)&&(j==minb||j==maxb || j==b1||j==b2|| j==b3||j==b4)R(i,j,1)= 255;R(i,j,2)= 0;R(i,j,3)= 0;elseif(i == mina ||i == maxa||i ==a1 || i ==a2 || i ==a3 || i ==a4|| i ==a5 || i ==a6 || i ==a7)&&(j>minb && j<maxb)R(i,j,1)= 255;R(i,j,2)= 0;R(i,j,3)= 0;elseR(i,j,1)= I(i,j,1);R(i,j,2)= I(i,j,2);R(i,j,3)= I(i,j,3);endend end圖4 MXN維字符5
第三步:統計特征信息。
for i=1:COLfor j=1:ROWif(i > mina &&i < a1 && j>minb && j<b1)&& Ib(i,j)==0x11 =x11+1;elseif(i > a1 &&i < a2 && j>minb && j<b1)&& Ib(i,j)==0x12 =x12+1;elseif(i > a2 &&i < a3 && j>minb && j<b1)&& Ib(i,j)==0x13 =x13+1;elseif(i > a3 &&i < a4 && j>minb && j<b1)&& Ib(i,j)==0x14 =x14+1;elseif(i > a4 &&i < a5 && j>minb && j<b1)&& Ib(i,j)==0x15 =x15+1;elseif(i > a5 &&i < a6 && j>minb && j<b1)&& Ib(i,j)==0x16 =x16+1;elseif(i > a6 &&i < a7 && j>minb && j<b1)&& Ib(i,j)==0x17 =x17+1;elseif(i > a7 &&i < maxa && j>minb && j<b1)&& Ib(i,j)==0x18 =x18+1;endend End if(x11/y>0.5)y11 =0; else y11 =1; end result =[y11,y21,y31,y41,y51;y12,y22,y32,y42,y52;y13,y23,y33,y43,y53;y14,y24,y34,y44,y54;y15,y25,y35,y45,y55;y16,y26,y36,y46,y56;y17,y27,y37,y47,y57;y18,y28,y38,y48,y58];圖5 字符5 特征信息
第四步:與模板匹配識別。
match5 =[0,0,0,0,1;0,1,1,1,1;0,1,1,1,1;0,0,0,0,1;1,1,1,1,0;1,1,1,1,0;1,1,1,1,0;0,0,0,0,1];if(result == match0)display(0); elseif(result == match1)display(1); elseif(result == match2)display(2); elseif(result == match3)display(3); elseif(result == match4)display(4); elseif(result == match5)display(5); elseif(result == match6)display(6); elseif(result == match7)display(7); elseif(result == match8)display(8); elseif(result == match9)display(9); elseif(result == matchA)display('A'); elseif(result == matchB)display('B'); elsedisplay('NO MATCH'); End圖6 字符5識別成功
其他字符展示
圖7 字符9識別過程
圖8 字符9識別結果
圖9 字符A識別過程
圖10 字符A識別結果
總結:相比較之前的特征線法,MXN維法識別準確率提高了很多,并且可以去識別字母、漢字、簡單圖形等。這為我們的車牌識別提供了一個理論基礎和一種算法思想。對于更復雜的圖案我們可以增加維數來進行更準確地識別。
4 FPGA實現MXN維字符識別框架介紹
圖11 FPGA實現MXN維字符識別模塊圖
如上圖11所示,FPGA要處理的圖像從HDMI_IN輸入到FPGA內部,最后再由HDMI_OUT輸出到顯示器上,由串口將識別到的字符打印的串口工具上。
5 字符模板以及訓練過程
下圖為用于訓練的部分字符模板。
訓練過程
fpga字符識別https://www.zhihu.com/video/12163120710187130886 FPGA實現板卡
本工程實現采用xilinx Z7芯片,板卡如下圖所示。
本實驗訓練過程采用fpga內部產生字符方式進行訓練。
對于攝像頭采集的也需要進行訓練后方可識別目標字符。
7 FPGA內部ila抓取結果
字符‘C’的識別結果和統計結果
字符‘2’的識別結果和統計結果
字符6的識別結果和統計結果
字符‘A’的識別結果和統計結果
字符‘Z’的識別結果和統計結果
8 應用展望
在對數字0-9和字幕A-Z的識別后我們還做了漢字的識別,依然可以輕松的識別漢字。這意味著利用此方法可以輕松地完成車牌識別和一些交通號牌和簡單圖案的區分和識別。
總結
以上是生活随笔為你收集整理的comcerter无法识别串口_基于FPGA 的MXN维字符识别的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 投影元素直接隔离_摸着夜色上露台开投影,
- 下一篇: python扩展文件_1. 使用 C 或