首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

FPGA高端项目:FPGA帧差算法图像识别+目标跟踪,提供7套工程源码和技术支持

  • 25-03-04 14:41
  • 3586
  • 8249
blog.csdn.net

目录

  • 1、前言
    • 免责声明
  • 2、详细设计方案
    • 设计原理框图
    • 运动目标检测原理
    • 输入视频
    • 图像缓存
    • RGB转灰度
    • 帧差算法
    • 中值滤波
    • 图像腐蚀和膨胀
    • 运动目标图像画框
    • HDMI输出
    • 工程源码架构
  • 3、工程代码1详解-->A7的OV5640输入
  • 4、工程代码2详解-->A7的HDMI输入
  • 5、工程代码3详解-->K7的OV5640输入
  • 6、工程代码4详解-->K7的OV7725输入
  • 7、工程代码5详解-->K7的HDMI输入
  • 8、工程代码6详解-->Zynq7020的OV5640输入
  • 9、工程代码7详解-->Zynq7020的OV7725输入
  • 10、上板调试验证并演示
    • 准备工作
    • OV5640输入版本工程演示
    • OV7725输入版本工程演示
    • HDMI输入版本工程演示
  • 11、福利:工程源码获取

FPGA高端项目:FPGA帧差算法图像识别+目标跟踪,提供7套工程源码和技术支持

1、前言

本设计使用Xilinx系列FPGA实现帧差算法图像识别+目标跟踪,提供vivado2019.1版本的工程源码共计7套,详情见下表:
在这里插入图片描述
视频输入源由多种方案可供选择,既有廉价的OV5640、OV7725摄像头,也有高分辨率的HDMI输入,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板;FPGA采集到输入视频后,首先使用本博常用的FDMA图像缓存架构将视频缓存到DDR3,作为“第一帧视频”的存放点;然后读出第一帧做RGB转灰度处理,得到的灰度图像再调用一路FDMA图像缓存架构进行缓存,作为“第二帧视频”的存放点;注意,前面说的“第一帧视频”和“第二帧视频”都是打了引号的,他指的是帧差算法的第一和第二帧;然后将两帧视频做帧差处理,得到帧差的视频,即得到了运动的目标视频;然后经过中值滤波、图像腐蚀、图像膨胀、图像画框等一系列操作,即得到了被框出来的运动的目标图像;然后经过HDMI发送模块,将视频输出显示器显示即可;

本文详细描述了Xilinx的FPGA帧差算法图像识别+目标跟踪,工程代码编译通过后上板调试验证,可直接项目移植,适用于在校学生做毕业设计、研究生项目开发,也适用于在职工程师做项目开发,可应用于医疗、军工等行业的数字成像和图像传输领域;
提供完整的、跑通的工程源码和技术支持;
工程源码和技术支持的获取方式放在了文章末尾,请耐心看到最后;

免责声明

本工程及其源码即有自己写的一部分,也有网络公开渠道获取的一部分(包括CSDN、Xilinx官网、Altera官网等等),若大佬们觉得有所冒犯,请私信批评教育;基于此,本工程及其源码仅限于读者或粉丝个人学习和研究,禁止用于商业用途,若由于读者或粉丝自身原因用于商业用途所导致的法律问题,与本博客及博主无关,请谨慎使用。。。

2、详细设计方案

设计原理框图

工程源码设计原理框图如下:
在这里插入图片描述

运动目标检测原理

运动目标检测原理:先将RGB图像转为灰度图只取亮度分量y,如果一个物体是运动的,那么前后两张或几张灰度图的同一位置的像素值应该是变化的,试想,如果是静止物体,比如一幅画,那么任意时刻,同一位置像素点的值不变才对,如果运动了,像素点的值自然也就改变了,很好理解,这个叫做帧差算法,这里的像素点差值有个范围,叫做阈值,cdn上有大佬说70~100是理想值。

输入视频

视频输入源由多种方案可供选择,既有廉价的OV5640、OV7725摄像头,也有高分辨率的HDMI输入,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板;
工程源码1、3、6使用OV5640摄像头,ov5640需要i2c配置才能使用,需要i2c配置分辨率,然后将DVP接口的两个时钟一个像素的GRB565视频数据采集为一个时钟一个像素的RGB565或者RGB888视频数据;ov5640i2c配置及采集代码如下:
在这里插入图片描述
工程源码4、7使用OV7725摄像头,OV7725需要i2c配置才能使用,需要i2c配置分辨率,然后将DVP接口的两个时钟一个像素的GRB565视频数据采集为一个时钟一个像素的RGB565或者RGB888视频数据;OV7725 i2c配置及采集代码如下:
在这里插入图片描述
工程源码2使用HDMI输入源,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板,HDMI解码采用silcom9011芯片解码方案,silcom9011需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代码如下:
在这里插入图片描述
工程源码5使用HDMI输入源,我使用了笔记本电脑充当HDMI输入源接入FPGA开发板,HDMI解码采用IT6802芯片解码方案,IT6802需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代码如下:
在这里插入图片描述

图像缓存

使用本博常用的FDMA图像缓存架构将视频缓存到DDR3,需要调用两路FDMA才能实现帧差算法,关于FDMA,请参考我之前的博客,博客地址:点击直接前往
FDMA图像缓存架构在Block Design中如下:
在这里插入图片描述

RGB转灰度

图像RGB转灰度的目的是做帧差算法,因为灰度图像只有8位,可以减少帧差的计算量,RGB转灰度代码如下:
在这里插入图片描述

帧差算法

利用图像缓存模块得到间隔的两帧图像,根据两帧图输入进来的Y分量,在图像有效信号de期间,用后一帧图像的Y分量减去前一帧图像的Y分量得到差值,用差值与帧差阈值进行比较得到帧差标志,判定为是运动迹象,根据帧差标志将认定为是有变化的像素点赋白色像素值,其余赋黑色像素点,如此一来,得到的图像就是只有黑白像素的图像,其中由运动迹象的点是白色,其余是黑色,这就为后面的画框做好了铺垫;帧差算法代码如下:
在这里插入图片描述
1、帧差间隔,也就是2帧图像之间的时间间隔怎么选取?经验告诉我们选择5帧,代码部分如下:
在这里插入图片描述
2、帧差阈值,也就是两帧图像的Y分量之差是多少才能判定为是运动迹象呢?经验告诉我们选择20到100,但70为最佳,设计中采用了一个VIO来动态配置阈值,默认为70,如下:
在这里插入图片描述

中值滤波

中值滤波采用2个fifo取3x3的算子模块,然后进行中值滤波,也就是以你某个像素点为中心,与其周边3个点的值取平均值,目的是为了使我们前面得到的黑白图像中的白色噪点减少;中值滤波法代码如下:
在这里插入图片描述

图像腐蚀和膨胀

与中值滤波类似,同样采用2个fifo取3x3的算子模块,目的是为了使我们前面得到的黑白图像中的白色噪点进一步减少;图像腐蚀和膨胀代码如下:
在这里插入图片描述

运动目标图像画框

这个模块是整个工程的精髓和难点所在,目的是把运动的二物体框出来;现解析如下:
输入:处理后的黑白图像和原始的RGB图像,原始的RGB图像是图像缓存模块从ddr3中读出的图像,之所以要采用2个图像输入的方案,是为了输出的选择,如果判断当前像素点是运动迹象的边沿,则将该像素点赋为红色,否则赋原始的RGB图像的值;
算法:算法部分只用黑白图像,判断黑白图像中白点的x轴坐标的最小位置和最大位置,以及y轴坐标的最小位置和最大位置,根据这四个点的坐标,就能框出一个矩形框,具体算法还得看代码,运动目标图像画框代码如下:
在这里插入图片描述

HDMI输出

工程1、2的HDMI输出采用silcom9134芯片编码方案,将RGB视频编码为HDMI视频,silcom9134需要i2c配置才能使用,需要i2c配置分辨率,i2c配置及采集代码如下:
在这里插入图片描述
工程3、4、5、6、7的HDMI输出采用纯verilog代码编码方案,将RGB视频编码为HDMI视频,视频从FDMA读出后,经过VGA时序模块和HDMI发送模块后输出显示器,代码位置如下:
在这里插入图片描述

工程源码架构

源码由两部分组成,一是Block Design搭建的基于FDMA实现的图像缓存架构,二是包含了Block Design的工程源码,以工程源码2为例,Block Design如下,其他几套与之类似:
在这里插入图片描述
以工程源码2为例,工程源码如下,其他几套与之类似:
在这里插入图片描述
工程源码6、7使用了自定义的FDMA方案,虽然不需要SDK配置,但FDMA的AXI4接口时钟由Zynq提供,所以需要运行SDK程序才能启动Zynq,从而为PL端逻辑提供时钟;由于不需要SDK配置,所以SDK软件代码就变得极度简单,只需运行一个“Hello World”即可,如下:
在这里插入图片描述

3、工程代码1详解–>A7的OV5640输入

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720;
输出:HDMI,silcom9134编码,分辨率1280x720;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

4、工程代码2详解–>A7的HDMI输入

开发板FPGA型号:Xilinx–Artix7–xc7a35tfgg484-2;
开发环境:Vivado2019.1;
输入:HDMI–笔记本电脑模拟,silcom9011编码,分辨率1920x1080;
输出:HDMI,silcom9134编码,分辨率1920x1080;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

5、工程代码3详解–>K7的OV5640输入

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720;
输出:HDMI,纯verilog代码编码,分辨率1280x720;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

6、工程代码4详解–>K7的OV7725输入

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:OV7725,分辨率640x480;
输出:HDMI,纯verilog代码编码,分辨率640x480;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

7、工程代码5详解–>K7的HDMI输入

开发板FPGA型号:Xilinx–Kintex7–xc7k325tffg676-2;
开发环境:Vivado2019.1;
输入:HDMI–笔记本电脑模拟,IT6802编码,分辨率1920x1080;
输出:HDMI,纯verilog代码编码,分辨率1920x1080;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

8、工程代码6详解–>Zynq7020的OV5640输入

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV5640摄像头,分辨率1280x720;
输出:HDMI,纯verilog代码编码,分辨率1280x720;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

9、工程代码7详解–>Zynq7020的OV7725输入

开发板FPGA型号:Xilinx–Zynq7020–xc7z020clg400-2;
开发环境:Vivado2019.1;
输入:OV7725,分辨率640x480;
输出:HDMI,纯verilog代码编码,分辨率640x480;
工程作用:掌握FPGA帧差算法图像识别+目标跟踪的设计方法;
工程Block Design和工程代码架构请参考第2章节“工程源码架构”小节内容;
工程的资源消耗和功耗如下:
在这里插入图片描述

10、上板调试验证并演示

准备工作

需要如下器材设备:
1、FPGA开发板;
2、OV5640、OV7725摄像头或HDMI输入设备,比如笔记本电脑;
2、HDMI连接线和显示器;

OV5640输入版本工程演示

工程1、3、6使用OV5640输入,分辨率为1280x720,帧差算法图像识别+目标跟踪输出效果如下:

OV5640输入FPGA帧差算法图像识别+目标跟踪

OV7725输入版本工程演示

工程4、7使用OV7725输入,分辨率为640x480,帧差算法图像识别+目标跟踪输出效果如下:

OV7725输入FPGA帧差算法图像识别+目标跟踪

HDMI输入版本工程演示

工程2、5使用HDMI输入,分辨率为1920x1080,帧差算法图像识别+目标跟踪输出效果如下:

HDMI输入FPGA帧差算法图像识别+目标跟踪

11、福利:工程源码获取

福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
在这里插入图片描述

源码技术支持加我微信哦
微信名片
注:本文转载自blog.csdn.net的9527华安的文章"https://blog.csdn.net/qq_41667729/article/details/127686678"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top