基于FPGA:多目标运动检测(手把手教学①)

这篇具有很好参考价值的文章主要介绍了基于FPGA:多目标运动检测(手把手教学①)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

日常·唠嗑:

      在3月份发表了基于FPGA:运动目标检测(原理图+源码+硬件选择,可用毕设)后反应很强,很多同学表示,希望我们能在运动目标检测的基础上做多目标运动检测。最近跟其他两个工程师刚好有空,就把就版本的工程做了一次超大升级。
      本次工程,花了很多时间,所以整个设计写的都很详细,想学的同学可以慢慢嚼。

一、视频效果

话不多说,直接看效果

FPGA帧差法多运动目标检测(演示)

二、新旧版本比较

      本算法是针对已经进行了二值化的图像进行目标分割和标记。如帧差法运动目标检测算法,已经进行了帧间差、二值化、腐蚀、膨胀这些算法后得到的二值化图像。分割采样距离判别的方法,标记则采用矩形包围盒。

      本算法模块应用在新版本的“FPGA帧差法运动目标检测中”,可以直接替换老版本中的包围盒算法模块:find_box模块,接口定义兼容,同时新日两版本的区别也是在于本模块,所以在老版本基础上只需要额外理解本算法模块即可理解新版本代码。

三、新版本特色

1、开发环境

硬件环境: DMK301 FPGA开发板(EP4CE10)、AN5640摄像头模组。
软件环境: Quartusii13.1+配套的Modelsim-ase。
基于FPGA:多目标运动检测(手把手教学①)

2、功能

1、OV5640摄像头采集实时视频
2、对视频进行帧差法运动目标检测算法处理
3、使用包围盒框选出目标,并实时显示在VGA显示屏
4、串口输出信息

3、特点

1、全套实物(含资料)
2、上电即出功能效果
3、最多支持16个目标
4、最大支持目标数量参数化可调
5、包围盒颜色参数化可调
6、串口输出目标位置和目标数量
7、提供源代码工程(Verilog)
8、提供Modelsim仿真
9、提供讲解视频&提供售后答疑
基于FPGA:多目标运动检测(手把手教学①)

四、工程设计

1、原理说明

1、包装盒定义

      将目标所有部分都包含的面积最小的矩形。如下图中所示,图1中的矩形框是符合包围盒定义的,图2中的矩形框虽然包含了目标所有部分但面积不是最小的,图3中的矩形框虽然面积小,但是未包含目标的所有部分。
基于FPGA:多目标运动检测(手把手教学①)
                                                                  图1
基于FPGA:多目标运动检测(手把手教学①)
                                                                  图2
基于FPGA:多目标运动检测(手把手教学①)
                                                                  图3

2、包围盒定位

2.1、单个目标定位

     在描述多目标定位原理前,先理解单个目标定位,这将有助于理解多目标的定位原理。

     单个目标定位本质上就是找到目标中所有像素点的横、纵坐标的最大和最小值,计为Xmax、Ymax、Xmin、Ymin,则包围盒就是由(XMin,Ymin)为左上角点坐标、(Xmax,Ymax)为右下角点坐标确定的矩形。

     实现原理是,在当前输入点灰度为1时,如果当前点的横坐标小于等于Xmin,则把Xmin更新为当前点的横坐标;如果当前点的横坐标大于等于Xmax,则把Xmax更新为当前点的横坐标;以此类推,对Ymax和Ymin也一样。核心代码描述如下:

if( per_img_Y == 1 'b1) begin
if(Ymin > y_cnt) Ymin <= y_cnt ;else
Ymin <= Ymin ;
if(Ymax < y_cnt) Ymax<= y_cnt ;else
Ymax<= Ymax ;
if(xmin > x_cnt) xmin<=x_cnt ;else
xmin <= xmin ;
if(Xmax < x_cnt) Xmax<= x_cnt ;else
Xmax<=Xmax ;
end

2.2、多个目标定位(解释的比较详细,认真看)

     定义N组寄存器用于储存N个包围盒的坐标,每个包围盒坐标以(Xmin[i],Ymin[])、(Xmax[],Ymax[1])表示,其中i∈[0,N-1]。图像像素从左上到右下的顺序扫描,依次输入每个像素,根据这一特性,对每一个输入为1的像素进行归属判断,看其属于哪个包围盒的范围,若不属于任何一个已存在的包围盒,则新生成一个包围盒。新生成的包围盒的Xmin和Xmax都赋值为当前点的横坐标,Ymin和Ymax都赋值为当前点的纵坐标。

     归属判断根据距离进行,当灰度为1的输入点距离某个包围盒小于设定的阈值时,则认为该点属于此包围盒,根据该点的坐标更新包围盒坐标。判断顺序按照包围盒的序号从小到大的顺序进行,只要该点属于任意一个包围盒则终止判断,即不再判断是否属于后续的包围盒。如图4所示,在A点输入时,原先的包围盒区域是左图中的区域,A点输入后,由于A点距离该包围盒较近即距离小于阈值,所以根据A点的坐标更新包围盒,可以看到Xmin和Ymax得到了更新,Xmin更新为A的横坐标,Ymax更新为A的纵坐标,而Xmax和Ymin则未更新,这是由于A的横坐标小于Xmax,A的纵坐标大于Ymin。这其实就是根据距离来对不同目标进行分割,不过该方法有个瑕疵,就是距离阈值的选取不能太小也不能太大,阈值太小则可能导致同一个目标的不同部分被分割为不同目标,就比如图4中,如果阈值过小,则会在A点输入时判断出A点不属于已存在的任何一个包围盒,从而以A点的坐标生成一个新的包围盒。反之,若阈值太大,可能导致不是同一个目标,但是由于距离较近而被识别成同一个目标。

图4:
基于FPGA:多目标运动检测(手把手教学①)基于FPGA:多目标运动检测(手把手教学①)

3、包围盒绘制

     包围盒绘制实际上就是绘制已经定位出的包围盒矩形框,用比较醒目的颜色如红色为包围盒的矩形框着色。理论上包围盒的边框宽度是1,即矩形的4条边都是占用1像素宽度的线段,为了使包围盒更加突出明显,便于人眼观察,可以适当加宽矩形框4条边的宽度。根据输入图像的像素点坐标是否是包围盒的边框,决定该像素输出的像素值是原像素值还是包围盒的颜色,如以下代码描述:这里的2’d3即代表包围盒边框宽度为4,Box_COLOR是定义包围盒颜色的参数,x_min、y_min、x_max、y_max则是包围盒的坐标。
代码:

if( (( (x_cnt+2'd3 >= x_min && x_cnt 〈= x_min) ll (x_cnt 〈= x_max+2'd3 && x_cnt>= x_max)) && y_cnt+2 'd3 >= y_min 8& y_cnt <= y_max+2'd3)ll
(( (y_cnt+2'd3 >= y_min && y_cnt 〈= y_min)ll (y_cnt <= y_max+2'd3 &8 y_cnt>= y_max)) && x_cnt+2'd3 >= x_min && x_cnt <= x_max+2 'd3)
o_data <= Box_COLOR;
elseo_data <= i_data;

     上述代码只是针对1个包围盒的绘制,如果需要绘制多个包围盒,则可以例化多个相同的模块,前后串行连接,即先绘制第一个包围盒,再绘制第二个包围盒,类似添加不同的图层,每个模块负责一个图层,经过多个模块叠加绘制后,即可绘制出多个包围盒。
     这实际上是流水线操作的思想,每个包围盒绘制模块就负责一级流水线操作,当然这会导致从图像输入到图像输出会存在N个时钟的延迟,这里的N就代表使用几个包围盒绘制模块(这里默认包围盒绘制模块的延迟是1个clk,实际上我们的verilog程序最终实现的结果就是这样的)。

2、模块框图

     如图5所示是多目标包围盒算法的模块框图,输入两路视频、输出一路视频。
     Video Bin是经过帧间差、二值化、腐蚀、膨胀后得到的二值化图像,其中已包含目标,需要根据Video Bin进行包围盒定位;
     Video Org是原始图像,根据包围盒坐标在原始图像上叠加包围盒的矩形框;
     Video Output则是在原始图像上叠加过包围盒的结果。

     multy_locate模块功能是定位各个目标的包围盒坐标,其包含多个signle_locate模块的串联,每个single_locate模块记录1个包围盒信息,这个信息包括包围盒的坐标位置和包围盒是否生效。

     multy_locate模块还包含一个count_1s的模块,这个模块用来统计生效的包围盒个数,其实就是对多bit的数据进行"数1"运算,计算总计有多少个“1”"。

     bounding_box_draw模块则是根据1个包围盒坐标,在图像上叠加一个特定颜色的矩形框即画1个包围盒,每个模块最多只画1个(也可能不画,要看该包围盒是否生效)包围盒。

     多个bounding_box_draw模块串联,第一个模块画第一个包围盒、第二个模块画第二个包围盒,以此类推,以流水线方式操作直到最后一个模块叠加完成输出Video Output,每个bounding_box_draw模块会导致视频流产生1个时钟的延迟。
图5:
基于FPGA:多目标运动检测(手把手教学①)

3、手把手教模块

1、bounding_box_top模块:

功能说明:
     多目标包围盒算法模块的顶层模块,例化multy_locate模块和bounding_box_draw模块。

参数定义:

基于FPGA:多目标运动检测(手把手教学①)
接口定义:
基于FPGA:多目标运动检测(手把手教学①)
基于FPGA:多目标运动检测(手把手教学①)

—————————————————————————————————

五、未完、待续……

今天就先讲到这里,有兴趣的同学可以关注,后面持续更新~~

需要套件的同学,可以私信我预定,7月20号准时上架,开用竞赛、毕设等。

发货清单:
FPGA开发板(EP4CE10F17C8)
AN5640摄像头模组(OV5640)
USB Blaster下载器
VGA线
USB供电线。资料
工程源码。
设计报告。
开发板原理图。
摄像头模块资料售后服务
本产品提供售后技术支持和答疑服务,但只针对产品本身的相关内容或问题进行答疑,不提供二次开发的技术支持或答疑服务。

后面会继续讲解模块:
模块仿真
multy_locate模块
single_locate模块count_1s模块
bounding_box_draw模块

待续……文章来源地址https://www.toymoban.com/news/detail-400902.html

到了这里,关于基于FPGA:多目标运动检测(手把手教学①)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 手把手教学基于Windows11的wsl2使用ubuntu子系统

    手把手教学基于Windows11的wsl2使用ubuntu子系统

    打开“控制面板“-“程序“-“程序和功能“-“启用或关闭windows功能“(侧边栏)-勾选“hyper-v“、“适用于Linux的Windows子系统“、“虚拟机平台“ 控制面板:开始菜单中搜索打开即可 选择“程序”,进入后选择“程序和功能” 选择“启用或关闭windows功能” 勾选“Hyper-V“

    2024年01月20日
    浏览(8)
  • 手把手教你搭建属于自己的PyQt5-YOLOv5目标检测平台(保姆级教程)
  • YOLOv5入门实践(5)——从零开始,手把手教你训练自己的目标检测模型(包含pyqt5界面)

    YOLOv5入门实践(5)——从零开始,手把手教你训练自己的目标检测模型(包含pyqt5界面)

      通过前几篇文章,相信大家已经学会训练自己的数据集了。本篇是YOLOv5入门实践系列的最后一篇,也是一篇总结,我们再来一起按着 配置环境--标注数据集--划分数据集--训练模型--测试模型--推理模型 的步骤,从零开始,一起实现自己的目标检测模型吧! 前期回顾: YOLO

    2023年04月26日
    浏览(11)
  • 手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)

    手把手教学RRT*(RRTSTAR)三维算法MATLAB仿真(代码可直接运行,视频手把手教学)

            在我以前的作品里有关于RRT算法的视频和代码,今天主要讲解一下RRT*算法的原理。RRT*算法主要是在RRT算法的基础上加上了重写父节点和随机重连的两个步骤。具体的实现方式我想以视频的方式向大家讲解,个人感觉讲解的十分详细。视频连接在这里,希望大家看

    2024年04月17日
    浏览(41)
  • tps5430手把手教学

    tps5430手把手教学

    TPS5430手把手教学 目录 一、buck电路原理 二、tps5430芯片介绍 1.1芯片引脚图 1.2芯片引脚说明 三、tps5430参考电路讲解以及PCB布局 1.正压降压(15V转12V) 1.1原理图 1.2器件选择 1.3PCB布局 2.正压降负压 2.1原理图 2.2PCB布局 2.3注意事项 BUCK电路原理: BUCK电路,又称降压式变换电路,

    2023年04月20日
    浏览(6)
  • ChatGPT推广指南,手把手教学

    ChatGPT推广指南,手把手教学

    网站登录流程我就不给大家赘述了,直接进入主题,全程干货仔细看 1.个人中心。点击右上角——“头像”——点击“个人中心” 2.推广链接。点击左侧菜单栏——“推广链接”,三条默认推广链接就是您的推广链接,将您的专属推广链接分享给需要的人即可。 3.好友列表。

    2023年04月12日
    浏览(7)
  • 手把手教你实现—基于OpenCV的车流量统计和车速检测代码

    手把手教你实现—基于OpenCV的车流量统计和车速检测代码

             本章将实现了一个简单的车辆速度估计和车流量统计的GUI应用,它使用了Haar级联检测器和相关跟踪器来检测和跟踪视频中的车辆,并通过图像处理和数学计算来估计车辆的速度。         1.首先,该代码需要cv2:用于图像处理和计算机视觉任务;dlib:用于对象

    2024年02月04日
    浏览(6)
  • [时间序列预测]基于BP、RNN、LSTM、CNN-LSTM算法多特征(多影响因素)用电负荷预测[保姆级手把手教学]

    [时间序列预测]基于BP、RNN、LSTM、CNN-LSTM算法多特征(多影响因素)用电负荷预测[保姆级手把手教学]

    深度学习原理-----线性回归+梯度下降法 深度学习原理-----逻辑回归算法 深度学习原理-----全连接神经网络 深度学习原理-----卷积神经网络 深度学习原理-----循环神经网络(RNN、LSTM) 时间序列预测-----基于BP、LSTM、CNN-LSTM神经网络算法的单特征用电负荷预测 时间序列预测(多特

    2024年01月20日
    浏览(15)
  • Git入门指南(手把手教学)

    Git入门指南(手把手教学)

    Git是一种分布式版本控制系统,它是由Linus Torvalds为了管理Linux内核开发而开发的。与中心化的版本控制系统(如SVN)不同,Git是一种分布式系统,它将代码库(repository)复制到多个开发者的本地计算机上,每个开发者都有自己的代码库,可以在本地提交代码、管理分支、合

    2023年04月14日
    浏览(7)
  • 【Kafka】手把手SASL,SSL教学

    Kafka支持以下SASL机制:GSSAPI 、PLAIN、 SCRAM-SHA-256、 SCRAM-SHA-512、 OAUTHBEARER。 本指南主要以SCRAM机制配置为主。 当使用SCRAM机制时,Kafka使用Zookeeper存储用户加密后的凭证,所以需要先使用Kafka提供的脚本进行用户的创建。 比如创建用户名为kafkaAdmin,密码为admin用户的操作命令如

    2024年01月17日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包