1 布景常识
现如今跟着机器辨认技能的日益老练,在咱们的日常日子中机器辨认也随处可见。咱们常见的有二维码辨认,指纹辨认,车牌辨认等,这些技能现已适当老练。还有现如今比较火的无人驾驶体系。无人驾驶体系中存在许多机器辨认技能,包含对人或移动物体的辨认,路标辨认,以及间隔预算等。而各种辨认体系中,对数字的辨认是必不可少的。数字在咱们人类国际无处不在。
现在完结数字辨认的办法大致分为以下4种:
1)运用软件编程在传统个人PC 上进行完结;
2)运用通用的 MCU 微型处理器(例如 51 单片机、 ARM 等)上进行完结;
3)运用通用 DSP 作为体系处理器进行完结;
4)运用专用 DSP 作为运算中心;
除以上四种办法以外, FPGA 以其独有的硬件可并行运转的优势,打破了传统处理器次序履行的形式,可在一个时钟周期内并行完结多个运算,比较于 DSP 在处理速度与处理才能上有了大幅的进步, 在具有成本低、集成化程度高、便于后期保护、 晋级等优势的一起使体系的运转速度能够满意图画实时处理的需求,所以本规划决议选用 FPGA 作为硬件渠道,规划与完结一种依据FPGA 的数字辨认体系。
2 依据FPGA的数字辨认的办法
一般,针对印刷体数字辨认运用的算法有:依据模版匹配的辨认办法、依据BP 神经网络的辨认办法、依据数字特征的辨认办法等。下文将对这几种算法进行评论以及比较。
1》模版匹配法
模版匹配法是一种被较早运用的数字辨认算法,该算法的关键是对所要辨认的一切数字进行模版构建,之后将图画中的数字与一切的数字模版逐个进行比较,核算出图画中数字与每个模版的类似度,依据所核算出的类似度成果进行辨认。其间类似度最高的模版即为咱们所要辨认的成果。模版匹配法的对数字的巨细、结构形状的规范化程度要求很高,数字的规范化程度对辨认的准确率有着直接的影响。该算法原理较为简略,但核算杂乱度过大,一起不利于 FPGA 的完结。
2》神经网络辨认算法
神经网络辨认的办法是仿照动物神经网络的特征,对信息进行分布式并行处理的一种算法。神经网络辨认算法具有必定的抗干扰才能,但为了确保辨认的准确率,该算法需求担任而且许多的核算,来对神经网络进行练习,而过于杂乱的核算不利于 FPGA 对该算法的完结。
3》数字特征辨认算法
依据数字特征的辨认算法其间心是经过对数字的形状以及结构等几许特征进行剖析与核算,经过对数字特征的辨认然后抵达对图画中数字的辨认。
3 依据数字特征算法完结数字辨认
咱们选用依据数字特征的算法进行数字的辨认,经过图画收集模块收集到图画,进行灰度化,二值化,然后进行数字特征的提取和核算来完结对数字的辨认,终究显现到数码管上,完结图画信息到数字信息的转化。
图2 7-8 数字特征标线
图3 5数字特征
数字特征信息的提取依据打印体,如上图1,图2,图3所示,以图3数字5举例,红框是数字5的水平缓竖直的上下左右鸿沟。X1在竖直方向的2/5处的水平线,x2在竖直方向的2/3处的水平线,y在水平方的1/2处的水直线。咱们以此特征来核算x1,x2,y与数字5的穿插点。
以穿插核算法来区别0-9数字的特征如下表1:
表1 0-9数字特征核算表
因为2,3,5的数字特征核算表相同,无法区别所以咱们持续添加数字特征以区别2,3,5。如表2:
表2 2,3,5 数字特征核算
这样经过数字核算彻底区别开数字0-9。然后运用FPGA体系建立实时数字辨认体系。
4 依据FPGA的数字辨认的完结
图4 依据ov5640的FPGA实时数字辨认体系
如图4所示,咱们图画收集运用 ov5640 500W像素摄像头,收集到的五颜六色RGB图画首要存入SDRAM中,然后由TFT显现操控端读出图画数据,读出RGB图画数据后,咱们首要进行RGB转Ycbcr算法操作,然后对灰度图画进行阈值切割,构成二值图画。对二值数字图画进行数字辨认,终究显现在数码管上。
FPGA部分源码:
//————————————————————————
// VGA display
//————————————————————————–
always @(posedge TFT_VCLK or negedge rst_n) begin
if(!rst_n)
TFT_RGB 《= 16‘b0;
else if(hcount == 400 || vcount == 192 || vcount == 320)
TFT_RGB 《= 16’hff00;
else
TFT_RGB 《={o_y_8b[7:3],o_y_8b[7:2],o_y_8b[7:3]};
end
//————————————————————-
//digital tube display
//————————————————————-
always @(posedge TFT_VCLK or negedge rst_n) begin
if(!rst_n)
disp_data 《= 32‘h0;
else if((!TFT_VS_r0) && TFT_VS_r1)
case({x1_l,x1_r,x2_l,x2_r,y,x1,x2})
16’b1111_0010_0010_0010: disp_data 《= {28‘b0,4’h0}; //0
16‘b1010_0001_0001_0001: disp_data 《= {28’b0,4‘h1}; //1
16’b0110_0011_0001_0001: disp_data 《= {28‘b0,4’h2}; //2
16‘b0101_0011_0001_0001: disp_data 《= {28’b0,4‘h3}; //3
16’b1110_0010_0010_0001: disp_data 《= {28‘b0,4’h4}; //4
16‘b1001_0011_0001_0001: disp_data 《= {28’b0,4‘h5}; //5
16’b1011_0011_0001_0010: disp_data 《= {28‘b0,4’h6}; //6
16‘b0110_0010_0001_0001: disp_data 《= {28’b0,4‘h7}; //7
16’b1111_0011_0010_0010: disp_data 《= {28‘b0,4’h8}; //8
16‘b1101_0011_0010_0001: disp_data 《= {28’b0,4‘h9}; //9
default: disp_data 《= 32’b0;
endcase
else
disp_data 《= disp_data;
End
成果展现:
图5 试验原图
图6 数字5辨认
图7 数字7 辨认
成果剖析:
本试验完结了对0-9数字的单个数字辨认,关于多个数字的辨认,咱们要进行模块切割,然后在每个模块里面再辨认数字。咱们能够加上语音体系来播报咱们辨认出来的数字,已抵达愈加人性化的愈加有用的开发。