本篇文章由 VeriMake 旧版论坛中备份出的原帖的 Markdown 源码生成
原帖标题为:基于 FPGA 的颜色 / 字符识别——全国大学生 FPGA 竞赛紫光同创杯案例
原帖网址为:https://verimake.com/topics/297 (旧版论坛网址,已失效)
原帖作者为:KZD(旧版论坛 id = 193,注册于 2021-11-20 16:58:10)
原帖由作者初次发表于 2021-11-20 21:27:38,最后编辑于 2021-11-20 21:27:38(编辑时间可能不准确)
截至 2021-12-18 14:27:30 备份数据库时,原帖已获得 185 次浏览、1 个点赞、0 条回复
前言
本文档是为2021年FPGA创新设计竞赛紫光同创杯编写的参考案例。意在辅助同学们了解整个开发平台,在此基础上设计出更棒的参赛作品!
开发硬件工具:
- PGL22G开发板 ×1
- ov5640 ×1 (根据设计需求自拟)
- 其他传感器模块 (根据设计需求自拟)
开发软件工具:
- Pango Design Suite
- modelsim
原始工程样例代码(文件夹名称):
- 基于RISC-v的软核移植嵌入式开发
- 基于颜色/字符识别的机械臂控制系统
- 神经网络加速器
参考案例颜色识别系统架构
图1.系统总体架构图
摄像头采集图像数据,通过写fifo写入ddr3再又读fifo读出数据给图像处理模块,进行图像处理识别定位设定的颜色,最后通过hdmi显示。
颜色识别模块
图2.颜色识别模块
把图像数据转为ycbcr,通过阈值比较把图像数据二值化,最后定位颜色区域。
阈值比较
图3.通过ycbcr模块把rgb转化为3个色域分量Y,CB,CR 看这3个分量属于红色阈值,蓝色阈值,绿色阈值
还是其他。如果rgb的3个分量属于红色阈值那把rgb重新定义为24'h333333其他不属于红色阈值的rgb重
新定义为24'hffffff,这样就相当于二值化。
图4.经过二值化后的图像象素如图所示,只存在两种象素。
水平垂直投影
图5.先例化两个h_ram和v_ram,用来存储行列信息。然后两个ram里数据初始化为0.
图6.通过行扫描找到有效象素点,扫描到有效象素点时把写ram使能信号打开,并找到该有效象素点的
行坐标h_count.用这行坐标作为h_ram的写地址,写入数据1.
图7.列ram写数据方式和行ram写数据方式类似,如图所示
图8.读两个ram里的数据,把上升沿下降沿的地址寄存起来,这四个点就是我们定位颜色方框的关键。
always @(posedge pixelclk or negedge reset_n) begin
if(!reset_n)
rgb_r <= 24'h00000;
else if(red_en)begin
if (vcount>vcount_l && vcount<vcount_r && ( hcount==hcount_l || hcount==hcount_r ))
rgb_r <= 24'h00ff00;
else if (hcount > hcount_l && hcount < hcount_r && (vcount== vcount_l || vcount== vcount_r ))
rgb_r <= 24'h00ff00;
else
rgb_r <= i_rgb;
end
图9.通过找到的4个点用上面那段代码可以显示出定位好的方框
字符识别模块
字符识别模块和颜色识别类似,不同的是在定位并分割好字符后要把字符和模板匹配,最终通过串口发送识别结
果并用hdmi实时显示定位获取结果。
如图把分割后的子符矩阵分成8×5的格子,按照字符所占格子的情况和模板比较,最终就能达到识别的效果。
因为板子上资源不够所以只识别了后3位。通过串口发送给pc端显示识别结果.
参考资料
待补充