FPGA车牌识别与Modelsim仿真:基于正点原子达芬奇Artix - 7的探索

FPGA车牌识别与Modelsim仿真:基于正点原子达芬奇Artix - 7的探索

FPGA车牌识别demo+Modelsim仿真demo 软件用的Vivado2019.2,板子用的正点原子达芬奇Artix-7,FPGA芯片是XC7A35T,芯片下载到板子插好摄像头LCD显示屏即可用 功能包括:图像采集,RGB转Ycbcr,sobel边缘检测,腐蚀膨胀,特征值提取与卷积模板匹配,将识别到的结果显示在LCD显示屏(ALIENTEK正点原子 3寸RGB 800×480)上 车牌识别工程demo+Modelsim仿真demo 摄像头型号为OV5640

最近在研究FPGA车牌识别相关项目,今天就来和大家分享一下基于正点原子达芬奇Artix - 7开发板的车牌识别demo以及配套的Modelsim仿真demo,所使用的软件是Vivado2019.2 。

一、硬件基础

本次选用的正点原子达芬奇Artix - 7开发板,其FPGA芯片为XC7A35T 。这颗芯片性能稳定,足以满足车牌识别这类复杂图像处理任务的需求。只需要将下载好程序的芯片插在板子上,连接好摄像头(OV5640)和LCD显示屏(ALIENTEK正点原子4.3寸RGB 800×480),就能开始车牌识别的奇妙之旅。

二、功能实现解析

1. 图像采集

图像采集部分主要负责从OV5640摄像头获取图像数据。在Vivado环境下,可以通过编写Verilog代码来实现与摄像头的通信协议,如配置摄像头的分辨率、帧率等参数。

module ov5640_interface ( input wire clk, input wire rst, // 摄像头相关信号 input wire vsync, input wire href, input wire pixel_clk, input wire [7:0] data, // 输出采集到的图像数据 output reg [23:0] img_data, output reg img_valid ); always @(posedge pixel_clk or posedge rst) begin if (rst) begin img_data <= 24'd0; img_valid <= 1'b0; end else if (vsync && href) begin img_data <= {data, data, data}; // 简单示例,实际可能需调整 img_valid <= 1'b1; end else begin img_valid <= 1'b0; end end endmodule

在这段代码中,通过pixelclk时钟信号来采样摄像头输出的像素数据data,当vsync(垂直同步信号)和href(水平同步信号)有效时,将像素数据转换为24位的RGB格式并输出imgdata,同时拉高img_valid表示数据有效。

2. RGB转Ycbcr

为了后续更好地进行图像处理,常常需要将采集到的RGB图像数据转换为Ycbcr格式。下面是一个简单的转换代码示例。

module rgb_to_ycbcr ( input wire [23:0] rgb, output reg [7:0] y, output reg [7:0] cb, output reg [7:0] cr ); always @(*) begin y = (8'd65 * rgb[23:16] + 8'd129 * rgb[15:8] + 8'd25 * rgb[7:0] + 8'd128) >> 8; cb = (8'd - 38 * rgb[23:16] - 8'd74 * rgb[15:8] + 8'd112 * rgb[7:0] + 8'd128) >> 8; cr = (8'd112 * rgb[23:16] - 8'd94 * rgb[15:8] - 8'd18 * rgb[7:0] + 8'd128) >> 8; end endmodule

这里依据RGB到Ycbcr的转换公式,通过简单的乘法、加法和移位操作实现了格式转换。这种转换在FPGA上实现效率较高,为后续的图像处理提供了合适的数据格式。

3. sobel边缘检测

sobel边缘检测是车牌识别中提取车牌轮廓的重要步骤。它通过与特定的卷积模板进行运算,增强图像中的边缘信息。

module sobel_edge_detection ( input wire [7:0] img_in, input wire clk, input wire rst, output reg [7:0] edge_out ); reg [7:0] gx[0:2][0:2]; reg [7:0] gy[0:2][0:2]; // sobel卷积模板 integer i, j; always @(posedge clk or posedge rst) begin if (rst) begin for (i = 0; i < 3; i = i + 1) begin for (j = 0; j < 3; j = j + 1) begin gx[i][j] <= 8'd0; gy[i][j] <= 8'd0; end end edge_out <= 8'd0; end else begin // 填充gx和gy模板数据(实际实现需结合图像存储方式调整) // 简单计算边缘强度 edge_out = (gx[0][0] + 2 * gx[0][1] + gx[0][2] + gx[1][0] + 2 * gx[1][1] + gx[1][2] + gx[2][0] + 2 * gx[2][1] + gx[2][2]) + (gy[0][0] + 2 * gy[0][1] + gy[0][2] + gy[1][0] + 2 * gy[1][1] + gy[1][2] + gy[2][0] + 2 * gy[2][1] + gy[2][2]); end end endmodule

在这个模块中,定义了两个3x3的数组gxgy来存储sobel卷积模板与图像像素的乘积结果。通过时钟上升沿不断更新模板数据并计算边缘强度,最终输出经过边缘检测后的图像数据edge_out

4. 腐蚀膨胀

腐蚀和膨胀操作能够进一步优化边缘检测后的图像,去除噪声、填补空洞等。以膨胀操作为例,下面是一段简单的代码。

module dilation ( input wire [7:0] img_in, input wire clk, input wire rst, output reg [7:0] img_out ); reg [7:0] max_value; always @(posedge clk or posedge rst) begin if (rst) begin max_value <= 8'd0; img_out <= 8'd0; end else begin // 假设3x3邻域,简单寻找最大值实现膨胀 max_value = img_in; // 实际需遍历3x3邻域更新max_value img_out = max_value; end end endmodule

在膨胀模块中,通过在时钟上升沿寻找3x3邻域内的像素最大值来实现膨胀操作。将找到的最大值输出作为膨胀后的图像数据img_out,这有助于突出车牌的轮廓信息。

5. 特征值提取与卷积模板匹配

这一步是识别车牌字符的关键。通过对经过处理的图像数据进行特征值提取,并与预先设定的字符卷积模板进行匹配,从而确定车牌上的字符。

module feature_matching ( input wire [7:0] processed_img, input wire clk, input wire rst, output reg [3:0] recognized_char ); // 这里假设简单的4位字符识别 // 实际需复杂的模板匹配算法和大量模板数据 always @(posedge clk or posedge rst) begin if (rst) begin recognized_char <= 4'd0; end else begin // 简单示例,比较图像特征与模板特征 if (processed_img == 8'd100) begin // 假设100为某个字符模板特征值 recognized_char <= 4'd5; // 假设匹配到字符5 end else begin recognized_char <= 4'd0; end end end endmodule

在这段代码中,通过时钟上升沿不断将经过处理的图像数据processedimg与预设的字符模板特征值进行比较,若匹配成功则输出对应的字符编码recognizedchar。当然,实际应用中需要更复杂的算法和大量的模板数据来提高识别准确率。

6. 结果显示

最后,将识别到的车牌字符结果显示在LCD显示屏上。这需要编写相应的驱动程序,将字符数据转换为LCD能够识别的信号格式。

module lcd_driver ( input wire clk, input wire rst, input wire [3:0] recognized_char, // LCD相关信号 output reg lcd_clk, output reg lcd_data ); // 这里省略复杂的LCD协议转换细节 always @(posedge clk or posedge rst) begin if (rst) begin lcd_clk <= 1'b0; lcd_data <= 1'b0; end else begin // 根据recognized_char编码发送相应的字符显示数据到LCD // 例如通过SPI或其他协议发送数据 end end endmodule

该模块根据识别到的字符编码recognizedchar,通过lcdclklcd_data信号将字符数据发送到LCD显示屏进行显示。具体的协议转换和数据发送过程会根据LCD的接口类型和协议有所不同。

三、Modelsim仿真demo

Modelsim仿真是验证上述设计功能正确性的重要手段。通过编写测试平台(Testbench),可以模拟实际的输入信号,观察模块的输出是否符合预期。以rgbtoycbcr模块为例,下面是一个简单的测试平台代码。

module tb_rgb_to_ycbcr; reg [23:0] rgb; wire [7:0] y; wire [7:0] cb; wire [7:0] cr; rgb_to_ycbcr uut ( .rgb(rgb), .y(y), .cb(cb), .cr(cr) ); initial begin // 初始化输入 rgb = 24'hFF0000; // 红色 #10; // 检查输出 $display("Y: %0d, Cb: %0d, Cr: %0d", y, cb, cr); rgb = 24'h00FF00; // 绿色 #10; $display("Y: %0d, Cb: %0d, Cr: %0d", y, cb, cr); rgb = 24'h0000FF; // 蓝色 #10; $display("Y: %0d, Cb: %0d, Cr: %0d", y, cb, cr); $stop; end endmodule

在这个测试平台中,首先定义了输入信号rgb和输出信号ycbcr,并将其连接到待测试的rgbtoycbcr模块。通过initial块,依次给rgb信号赋不同的值(红、绿、蓝),并通过$display函数打印出转换后的ycbcr值,以此来验证模块的功能是否正确。

FPGA车牌识别demo+Modelsim仿真demo 软件用的Vivado2019.2,板子用的正点原子达芬奇Artix-7,FPGA芯片是XC7A35T,芯片下载到板子插好摄像头LCD显示屏即可用 功能包括:图像采集,RGB转Ycbcr,sobel边缘检测,腐蚀膨胀,特征值提取与卷积模板匹配,将识别到的结果显示在LCD显示屏(ALIENTEK正点原子 3寸RGB 800×480)上 车牌识别工程demo+Modelsim仿真demo 摄像头型号为OV5640

通过以上从硬件平台搭建到各功能模块实现以及Modelsim仿真验证,一个完整的FPGA车牌识别系统就初步构建完成啦。当然,实际应用中还需要不断优化算法、提高识别准确率等,但这已经为我们深入研究车牌识别技术奠定了坚实的基础。希望这篇分享对大家有所帮助,欢迎一起交流探讨。

Read more

OpenClaw 为什么突然爆火?从上门安装到排队体验,我看到的 AI Agent 破圈真相

OpenClaw 为什么突然爆火?从上门安装到排队体验,我看到的 AI Agent 破圈真相

🔥 个人主页:杨利杰YJlio❄️ 个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》《Python》《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更简单,让重复的工作自动化 OpenClaw 为什么突然爆火?从上门安装到排队体验,我看到的 AI Agent 破圈真相 * 1、OpenClaw 这次为什么让我有点震撼? * 2、OpenClaw 到底是什么?它和普通聊天 AI 有什么不同? * 2.1 普通大模型解决的是“回答问题” * 2.2 OpenClaw 这类 Agent 试图解决的是“帮我完成任务” * 3、从控制台截图看,它已经不是“纯概念”了 * 4、

OpenClaw 实战:5 分钟用 AI Agent 自动生成规范测试用例并写入 Excel

OpenClaw 实战:5 分钟用 AI Agent 自动生成规范测试用例并写入 Excel

OpenClaw 实战:5 分钟用 AI Agent 自动生成规范测试用例并写入 Excel 一、核心前提 OpenClaw 是轻量级 Agent 框架,核心聚焦: Skill 注册 → 工具选择 → 任务执行 * 没有 Dify 的可视化界面 * 没有知识库、没有复杂工作流 * 代码极简洁、上手极快 * 适合:测试开发 / 有编程能力的测试工程师 一句话定位: OpenClaw = 极简、轻量、只专注做工具调用的小 Agent 引擎 二、环境准备 1. 安装 OpenClaw 及依赖 # 安装 OpenClaw 核心框架 pip install openclaw # Excel 操作

ToDesk 全新 ToClaw,正在把电脑交给AI去操作

ToDesk 全新 ToClaw,正在把电脑交给AI去操作

这两年,AI 工具层出不穷,但大多数产品还停留在“能回答、会生成”的阶段:帮你写一段话、搜一份资料、整理一个思路,真正到了执行层,还是得你自己坐回电脑前,一个软件一个软件地点、一项任务一项任务地做。 这也是很多人对 AI 的真实感受——它会说,但不一定真能干活。而 ToDesk 新上线的 ToClaw,想解决的正是这个问题。 一、ToClaw 是什么? ToClaw 是一款基于 OpenClaw 深度定制、并与远程控制运行时深度结合的 AI 助手。它最大的不同,不只是“懂你说什么”,而是能直接在你的电脑上执行操作。 你只需要一句话,它就可以在电脑端完成对应动作:打开软件、点击按钮、填写表单、拖拽文件、整理资料、生成表格、汇总信息……很多原本需要人守在电脑前操作的工作,现在都可以交给 ToClaw