野火征途Pro FPGA开发板 实现基于帧差法的运动目标检测与跟踪 摄像头:OV5640 显示屏:TFT LCD,VGA,HDMI

这板子有点意思,野火征途Pro FPGA配OV5640摄像头,三屏输出直接玩转实时图像处理。今天咱们搞个硬核玩法——用帧差法逮住运动物体,顺带让目标在LCD、HDMI上同步追踪。

先拆解技术路线:OV5640输出RGB565数据流,FPGA里做灰度转换。核心操作是连续三帧相减,数学表达就三行代码的事:

currentframe - previousframe > threshold ? 1 : 0

previousframe = currentframe

currentframe = nextframe

但Verilog实现时得注意时序对齐。看看这个差分模块的关键代码:

always @(posedge clk) begin
    if(de) begin
        gray_1 <= gray_2;  // 前前帧
        gray_2 <= gray_3;  // 前帧
        gray_3 <= new_gray;// 当前帧
        
        diff1 <= (gray_3 > gray_2) ? (gray_3 - gray_2) : (gray_2 - gray_3);
        diff2 <= (gray_2 > gray_1) ? (gray_2 - gray_1) : (gray_1 - gray_2);
        
        motion <= (diff1 > THRESHOLD) && (diff2 > THRESHOLD);
    end
end

这里用了三级流水缓存,同时计算相邻两帧的绝对差分。当连续两帧的差值都超过阈值时,判定为运动区域。注意阈值THRESHOLD需要根据环境动态调整,实战中可以通过板载按键实时修改。

野火征途Pro FPGA开发板 实现基于帧差法的运动目标检测与跟踪 摄像头:OV5640 显示屏:TFT LCD,VGA,HDMI

OV5640配置是个技术坑,分享个初始化关键参数:

i2c_write(0x3103, 0x11); // 时钟分频
i2c_write(0x3002, 0x00); // 复位寄存器
i2c_write(0x3017, 0xff); // GPIO控制
i2c_write(0x3018, 0xff); // GPIO控制
// ...省略20+寄存器配置

实测时发现直接照搬官方驱动会有色彩偏差,后来在0x5001寄存器里把RGB格式强制设为565才正常。建议用示波器抓I2C波形确认配置生效。

形态学处理部分用行缓存实现膨胀操作,3x3窗口判断:

reg [7:0] line0 [0:1279];
reg [7:0] line1 [0:1279];
reg [7:0] line2 [0:1279];

always @(posedge clk) begin
    if(href) begin
        line0[col] <= line1[col];
        line1[col] <= line2[col];
        line2[col] <= motion; // 当前像素运动标记
        
        // 3x3窗口或操作
        dilate_out = |{line0[col-1], line0[col], line0[col+1],
                       line1[col-1], line1[col], line1[col+1],
                       line2[col-1], line2[col], line2[col+1]};
    end
end

这里用三个行缓存实现滑动窗口,通过或操作实现膨胀效果。注意col需要做边界处理,防止访问越界。

最终效果通过AXI4-Stream同时输出到三个显示接口。HDMI部分需要特别注意时钟域切换:

hdmi_transmitter u_hdmi(
    .video_clk(vga_clk),   // 25MHz
    .tmds_clk(tmds_clk),   // 125MHz
    .rgb_in({red, green, blue}),
    // ...时序信号连接
);

实测时发现直接跨时钟域传输会导致画面撕裂,后来在中间加了双时钟FIFO做缓冲,深度设到2048刚好满足720P传输。

调参阶段建议在VGA接口上叠加OSD显示调试信息,比如用红色边框标记运动区域,同时显示当前帧率和阈值参数。通过按键动态调整阈值时,能看到检测灵敏度实时变化——这点在追踪快速移动物体时特别有用。

最后说说资源占用:帧差法核心模块大概消耗1200个LUT,形态学处理占800LUT,整个图像处理流水线控制在30%的逻辑资源内。DDR3主要用作帧缓存,实测720P@30fps下带宽占用约500MB/s。

这种方案比纯软件方案延迟低得多——从光信号进入摄像头到HDMI输出显示,整个链路延迟控制在3帧以内,用来做无人机避障或者智能门铃之类的场景完全够用。下次打算试试结合光流法做运动轨迹预测,应该更有挑战性。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐