运动目标检测 FPGA 设计 Verilog Quartus
名称运动目标检测 FPGA 设计 Verilog Quartus软件Quartus语言Verilog开发板/平台Cyclone IV FPGA开发板功能介绍本项目实现了一个基于 FPGA 的运动目标检测系统采用 Verilog 编写在 Quartus 环境下完成工程设计。系统面向摄像头实时图像采集与显示应用能够对连续视频画面中的运动区域进行检测并将检测出的目标区域以包围盒形式叠加显示到 VGA/LCD 输出画面中。 设计以摄像头输入、SDRAM 帧缓存、图像处理算法和 VGA 显示输出为主线。前端完成摄像头时钟、复位、电源控制和 I2C 配置采集到的图像经过 RGB 到 YCbCr 的转换并提取灰度信息中间通过 SDRAM 保存相邻两帧灰度图像后端使用帧间差分、滤波、二值化和形态学处理得到运动区域再进行边界定位和显示叠加。 该工程适合用于 FPGA 图像处理课程设计、毕业设计和实时视频处理实验。它不仅包含摄像头采集和 VGA 显示这类基础外设驱动还包含 SDRAM 双帧缓存、灰度处理、帧间差分、腐蚀膨胀、目标框定位等较完整的视频算法链路对学习硬件实时图像处理流程具有较强参考价值。运行环境开发语言Verilog 开发软件Quartus 适用方向FPGA 图像处理、摄像头视频采集、SDRAM 帧缓存、VGA/LCD 显示、运动目标检测 工程包含 Quartus 项目文件、Verilog 源码、IP 核文件和管脚约束文件适合在 Cyclone IV FPGA 开发板环境中编译、分配引脚并进行硬件验证。设计思路系统设计将硬件驱动控制与图像处理算法结合起来完成运动目标检测。摄像头采集到的图像首先进入 FPGA经过摄像头配置、像素采集和格式处理后将 RGB565 图像转换为 YCbCr 格式并提取亮度分量作为灰度图像。这样可以把原本 16bit 的彩色数据压缩为 8bit 灰度数据为后续在 SDRAM 中保存相邻两帧图像提供条件。 运动检测采用基于灰度的帧间差分思路。系统将相邻两帧灰度图像按像素对齐后进行差分并取绝对值再与预设阈值比较超过阈值的区域被判定为运动目标区域。为了减小噪声和孤立点对检测结果的影响设计中加入灰度均值滤波、二值图像腐蚀/膨胀等处理模块使运动区域轮廓更加稳定便于后续边界定位。 SDRAM 缓存方案是本设计的关键。由于 SDRAM 数据位宽为 16bit而灰度图像为 8bit系统利用 SDRAM 的高低字节空间保存相邻两帧灰度图像。通过帧同步信号产生帧标志并结合 SDRAM 的 DQM 数据掩码控制高低字节写入可以避免两帧数据互相覆盖同时保证读取时两帧图像具有一致的行场同步关系方便后续差分处理。 检测到二值化运动区域后系统通过最小包围盒相关逻辑确定目标边界并将方框叠加到原始图像上输出。最终显示端可以同时看到摄像头画面和运动目标标记结果适合学习 FPGA 视频采集、SDRAM 帧缓存、实时图像处理流水线以及 VGA 显示控制的完整实现方法。模块结构顶层模块为 sdram_vga负责连接系统时钟复位、摄像头接口、I2C 配置接口、VGA/LCD 显示接口和 SDRAM 存储接口并调度各个功能模块完成完整的视频处理流程。 主要模块包括pll 用于产生系统所需的多路工作时钟CMOS_Capture_RGB565 负责摄像头像素采集reg_config、i2c_com、i2c_timing_ctrl、power_on_delay 用于摄像头初始化配置VIP_RGB888_YCbCr444 完成颜色空间转换sdram_top、sdram_init、sdram_aref、sdram_write、sdram_read、auto_read_write 构成 SDRAM 初始化、刷新、读写与缓存控制逻辑VIP_Gray_Mean_Filter、VIP_Bit_Erosion_Detector、VIP_Bit_Dilation_Detector、VIP_Matrix_Generate_3X3_1Bit、VIP_Matrix_Generate_5X5_1Bit、VIP_Matrix_Generate_7X7_1Bit、VIP_Matrix_Generate_9X9_1Bit 用于图像滤波、窗口生成和形态学处理position 用于目标位置/边界相关处理vga_driver 负责显示时序和图像输出。开发板验证本设计支持在 Cyclone IV FPGA 开发板上进行验证工程中包含对应的 Quartus 管脚约束与分配文件可用于连接摄像头、SDRAM、VGA/LCD 显示接口以及 I2C 配置接口等外设信号。实际验证重点包括摄像头图像采集、SDRAM 双帧缓存读写、VGA 图像输出以及运动目标包围盒叠加显示。 开发板运行时系统通过摄像头输入连续视频图像经过 FPGA 内部灰度转换、帧间差分、滤波、形态学处理和目标定位后将检测结果叠加到原始图像并输出到显示端。该验证方式能够直观看到运动区域检测与方框标记效果适合作为图像处理、视频采集显示和 SDRAM 控制类 FPGA 项目的实物参考。演示视频配套演示视频为“运动目标检测代码讲解.MP4”内容围绕运动目标检测工程代码进行讲解便于理解顶层接口、摄像头输入、SDRAM 缓存、图像处理流水线和 VGA 显示输出之间的关系。演示视频请关注公众号后获取对应资料查看。仿真图/仿真说明/设计文档图片设计文档包含运动目标检测系统整体框架、图像处理算法及硬件驱动说明、SDRAM 双帧存储方案、DQM 掩码控制关系、基于灰度的帧间差分法原理以及 Matlab 仿真示意图等内容。文档图片可辅助理解相邻帧存储方式、灰度差分流程和运动区域提取过程。部分代码以下展示顶层模块sdram_vga的部分代码完整代码可关注下方公众号卡片获取。module sdram_vga( // system signals input s_clk , // input clk , input rst_n , //input [7:0] GRAY_THRESHOLD , //ov7725 interfaces input cmos_pclk , output cmos_xclk , input cmos_vsync , input cmos_href , output camera_reset , output camera_pwnd , input [7:0] cmos_data , //uart_Byte_Rx //input rs232_rx , //iic interfaces output i2c_sclk , inout i2c_sdat , // VGA Interface output hsync , output vsync , output lcd_blank , output lcd_dclk , output lcd_sync , output [15:0] vga_data , // SDRAM Interfaces output wire sdram_clk , output wire sdram_cke , output wire sdram_cs_n , output wire sdram_cas_n , output wire sdram_ras_n , output wire sdram_we_n , output wire [ 1:0] sdram_bank , output wire [12:0] sdram_addr , output wire [ 1:0] sdram_dqm , inout [15:0] sdram_dq ); parameter GRAY_THRESHOLD 150 ; //pll wire clk_24m ; wire clk_25m ; wire clk_50m ; wire clk_100m ; //ov5640 config data wire [7:0] LUT_INDEX ; wire [15:0] LUT_DATA ; wire [7:0] LUT_SIZE ; //IIC wire i2c_config_done; //ov7725 wire cmos_frame_vsync; wire cmos_frame_href ; wire cmos_frame_clken; wire [15:0] cmos_frame_data ; wire [15:0] cmos_mask_data ; wire [15:0] cmos_data_Ycbcr; //sdram wire wfifo_wr_clk ; wire wfifo_wr_en ; wire [15:0] wfifo_wr_data ; wire wfifo_rd_clk ; wire rfifo_rd_en ; wire [15:0] rfifo_rd_data ; wire flag_rd_ready ; wire img_data_req ; wire flag_init_end ; //VIP wire [15:0] vga_cmos_data ; wire per_frame_vsync ; wire per_frame_href ; wire per_frame_clken ; //rx wire rx_done ; wire [7:0] data_byte; wire post_frame_clken_Ycbcr; wire initial_en; wire cmos_frame_vsync_Ycbcr; wire cmos_frame_href_Ycbcr; wire cmos_frame_clken_Ycbcr; wire per_frame_vsync_Erosion; wire per_frame_href_Erosion; wire per_frame_clken_Erosion; wire post_frame_vsync_Erosion; wire post_frame_href_Erosion; wire post_frame_clken_Erosion; wire vga_bit; wire vidon; //for sdram test //reg [15:0] cmos_frame_data_test ; //reg [10:0] change ; //always(posedge clk_25m or negedge rst_n) //begin // if(!rst_n) // cmos_frame_data_test d0 ; // // else if(change 300) // cmos_frame_data_test 16B11111_000000_00000 ; // else if(change 550) // cmos_frame_data_test 16B00000_111111_00000 ; // else if(change 800) // cmos_frame_data_test 16B00000_000000_11111 ; // else // cmos_frame_data_test 16B11111_11111_11111 ; //end // ... 以下代码略完整源码请下载压缩包查看代码获取下方公众号“FPGA代码设计学习资料”