这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA图像处理系列之乒乓球追踪设计实例

共2条 1/1 1 跳转至

FPGA图像处理系列之乒乓球追踪设计实例

菜鸟
2017-06-27 15:44:55     打赏

注意:本文不提供工程,作为思路供读者解读。

       当前,实用的图像处理系统都要求高速处理。目前广泛采用软件进行处理,但软件处理存在速度、成本的问题。近年来,随着现成可编程门阵列FPGA的发展,为提高图像处理系统的性能提供了新的思路和方法。FPGA的并行特性所带来的高速性,以及低成本低功耗等特性,都是计算机无法比拟的。


小球追踪平台的FPGA以及PCB部分由本人开发。采用digilent公司Basys3 FPGA开发板作为控制核心,此款开发板采用xilinx 7系列芯片,板卡设计小巧,同时片上资源也足以满足大多教学应用场合。此平台拥有如下功能:

·        采集摄像头图像,将图像显示在VGA上

·        控制舵机-摄像头云台,高速追踪单一颜色物体(比如乒乓球)


系统框架

小球追踪平台的系统框图如下:




从系统框图可知,片上主要分为5个模块,简要介绍如下表格:


名称
功能简介
Camera control
摄像头控制,包含驱动、IIC配置
Frame buffer
帧缓存
Image process
图像处理
Vga driver
VGA驱动
Servo control
舵机控制

IP详解

1.      摄像头模块

小球追踪平台的摄像头采用OV系列的OV7725摄像头。这款摄像头时序、寄存器配置都比较简单,性能也足以满足追踪的需要。

关于OV7725具体的参数和时序,用户可以参考OV7725的官方手册。本平台在工程中构建了两个关于摄像头的IP核——一个是摄像头时序控制模块;另一个是寄存器配置模块。

摄像头的采集模块IP封装如下图所示:



引脚说明如下表格:

端口名称
位宽
方向
端口说明
pclk
1
输入
像素时钟,来自于外部摄像头。依据此时钟来采样摄像头数据
vsync
1
输入
帧同步信号,来自外部摄像头,采集完一帧会有一个vsync脉冲产生
href
1
输入
行数据有效信号,来自外部摄像头,当此信号为高电平时,说明摄像头有数据输入到此模块
d
8
输入
摄像头数据输入
addr
17
输出
帧缓存写地址信号
dout
16
输出
RGB565像素输出
we
1
输出
帧缓存写使能信号

此IP的功能为:根据摄像头的时序,对输入的pclk、vsync、href信号进行时序分析,将输入的摄像头初始数据d[7:0]转换为用户需要的RGB565像素,并对应每一个RGB像素产生一个地址、一个写使能,以便将像素正确存到帧缓存之中。注意到,摄像头的工作时钟xclk并不由此模块提供。在工程中,我们直接添加一个clock模块来提供所有时钟,其中产生一路25MHz给摄像头,充当xclk。


OV7725内部有一些寄存器,这些寄存器的内容决定摄像头的工作参数、工作模式等,主机可以通过IIC协议读写这些寄存器。本系统我们构建了一个IIC的IP。

寄存器配置IP封装如下图:



引脚说明如下表格:

端口名称
位宽
方向
端口说明
iCLK
1
输入
模块工作时钟,25MHz
rst
1
输入
复位(高电平复位)
I2C_SCLK
1
输出
IIC的时钟
I2C_SDAT
1
输出
IIC的数据信号
Config_Done
1
输出
IIC配置结束信号

此IP的功能为:产生IIC时序,并通过IIC向摄像头寄存器写入数据,使得摄像头能正常工作。如果想再次配置,只需rst引脚复位一次即可。

在本系统中,我们通过IIC模块将摄像头配置成QVGA的分辨率(320*240)、RGB565的像素格式。关于配置指令的详细内容,用户可以参考OV7725的官方手册。


2.      帧缓存

一个完整的图像采集系统一定要有帧缓存。因为图像的采集端和输出端往往并非同步,它们中间需要有一个存储器来缓存整张图像,将图像的采集、输出部分分开,互不干扰。在硬件上,通常选用双口ram来实现帧缓存。双口ram可以读、可以写,并且读写可以同时进行,互不影响。本系统采用的帧缓存ip采用了vivado自带的简单双口bram,封装如下:


端口名称
位宽
方向
端口说明
dina
16
输入
写数据信号,为16bit的RGB565像素
addra
17
输入
写地址,图像大小为320*240,因此地址范围为0-76799
clka
1
输入
写时钟,采用pclk
wea
1
输入
写使能
clkb
1
输入
读时钟,采用25MHz的时钟,与VGA像素时钟同步
addrb
17
输入
读地址,来自于VGA驱动模块
doutb
16
输出
读数据


3.图像处理部分功能框图:

[/table]


·        色彩空间转换模块RGB2HSV

摄像头模块得到的是RGB数据。在实际环境中,光照经常会给图像中同一物体的RGB分量带来影响。不过,光照对于HSV(Hue、Saturation、Value)色彩空间中H、S分量的影响却相对小很多。本平台由于摄像头位置随时在变化,图像明暗程度经常会变化,为了追踪色彩单一的乒乓球,采用HSV色彩空间是一个比较合适的策略。本系统即构建了一个RGB像素到HSV像素的转换ip,IP的封装如下:


引脚说明如下:


[table]
端口名称
位宽
方向
端口说明

pclk
1
输入
像素时钟,与VGA像素时钟同步

RGB24
24
输入
输入的24bit RGB像素,R、G、B各8位

HSV24
24
输出
转换后的24bit HSV像素,H、S、V各8位

IP功能说明:将输入的RGB像素,转换成HSV像素。RGB色空间和HSV空间之间的转换为非线性的,硬件实现需要考虑时钟同步、算法优化、实时性等问题。此ip内部调用了低延迟的除法器实现Hue分量与Saturation分量的高速计算,从而实现了RGB转换成HSV。

·        色彩提取与坐标计算模块ColorDetect IP

本系统追踪乒乓球的原理是应用了色彩方面的理论,寻找类似乒乓球色彩的区域,然后计算这个区域的中心。首先需要人为提取乒乓球的HSV分量(只提取一次);之后的每一帧都进行如下操作:遍历图像每个像素,对HSV分量和乒乓球相近的像素进行标注,然后对标注后的区域去噪,去噪后,对此区域进行中心点的计算。每一帧结束都会将计算所得的中心坐标发送给舵机控制模块。

本系统提供的ColorDetect IP能实现以下功能:

·检测颜色

·标注并上色

·计算标注区域的中心坐标

在标注过程中,假如背景有橘黄色的物体,就会产生噪声。本系统去噪、降噪的策略有两个方面:1.形态学处理,直接去除面积较小的噪点;2.设置权值的概念,降低较大噪点影响。

对于形态学处理,在colorDetact ip内部并没有包含,而是将待处理信号引出到其他IP——erode ip和dilate ip。后续内容中,会介绍erode ip和dilate ip这两个在本系统中专门用来形态学处理的IP。对于权值降噪,在ColorDetectip中,有一个权值计算模块,中心点的计算会和权值相关。对于每一个标注像素,都计算此像素和上一帧得到的中心点的距离,根据距离远近设定不同大小的权值,越接近中心的标注像素,权值越大,否则越小。这样就会降低和乒乓球实际球体距离较远,但面积较大的噪点的影响


ColorDetect IP的封装如下:



引脚说明如下表所示:

端口名称
位宽
方向
端口说明
PClk
1
输入
像素时钟,与VGA像素时钟同步
btn_ColorExtract
1
输入
颜色提取按键,按下一次就保存一组参考色彩的值
sw_ColorClear
1
输入
颜色清除开关。为1时,清除之前保存的参考色彩值
VtcHCnt
12
输入
当前像素的列计数值,来自于VGA驱动模块
VtcVCnt
11
输入
当前像素的行计数值,来自于VGA驱动模块
HSV24
24
输入
输入的HSV像素
RGB24
24
输入
输入的RGB像素
Binary_PostProcess
1
输入
输入的去噪后的标注像素(1bit),来自于dilate IP
Binary_PreProcess
1
输出
输出的去噪前的标注像素(1bit),提供给erode IP
center_h
12
输出
计算得到的小球区域中心点横坐标
center_v
11
输出
计算得到的小球区域中心点纵坐标
RGB24_dis
24
输出


·        膨胀与腐蚀模块——erode IP & dilate IP

在图像中,利用形态学处理算法,可以去除较小的噪点。在FPGA上实现腐蚀和膨胀两种操作的算法,关键是滤波窗口的实现。

设计的思路是:因为窗口在遍历图像过程中,每一个像素都会被窗口多次使用,因此需要通过缓存来存储像素,使得它们能在后续的窗口位置被重复利用。本平台需要的窗口大小为3*3,在FPGA中,可以设计3个单口行缓存,借助状态机和列计数值实现这种窗口,采用流水处理的方法,实现加速计算。

得到窗口之后,就可以对其中的单元并行操作。对于腐蚀算法,假设输入的图像为单像素1bit的二值化图像,只有当窗口所有元素都为1时,窗口最后输出才为1,否则输出为0。而对于膨胀算法,只有当窗口所有元素都为0时,窗口最后输出才为0,否则输出为1。

本系统构建了erode ip和dilate ip,先通过erode ip对图像进行腐蚀,去掉小的噪点,但同时对非噪声区域也削去了一部分边缘;然后再经过dilate ip对图像进行膨胀,恢复被削去的非噪声区域的边缘。


Erode IP的封装如下:



引脚说明如下:

端口名称
位宽
方向
端口说明
PCLK
1
输入
像素时钟,与VGA像素时钟同步
VtcHCnt
12
输入
当前像素的列计数值,来自于VGA驱动模块
VtcVCnt
11
输入
当前像素的行计数值,来自于VGA驱动模块
pix_i
1
输入
单bit的像素,如果是标注区域,为1,否则为0
pix_o
1
输出
单bit的像素,如果是标注区域,为1,否则为0

dilate IP的封装如下:



引脚说明:

端口名称
位宽
方向
端口说明
PCLK
1
输入
像素时钟,与VGA像素时钟同步
VtcHCnt
12
输入
当前像素的列计数值,来自于VGA驱动模块
VtcVCnt
11
输入
当前像素的行计数值,来自于VGA驱动模块
pix_i
1
输入
单bit的像素,如果是标注区域,为1,否则为0
pix_o
1
输出
单bit的像素,如果是标注区域,为1,否则为0


VGA IP

模块功能:产生VGA时序信号、数据信号,产生图像的行列计数值,以及帧缓存的读地址

IP的封装如图所示:



引脚说明:

端口名称
位宽
方向
端口说明
Clk25
1
输入
VGA工作时钟,25MHz
frame_pixel
16
输入
16bit RGB像素输入
vga_red
4
输出
VGA 输出数据(R通道)
vga_green
4
输出
VGA 输出数据(G通道)
vga_blue
4
输出
VGA 输出数据(B通道)
vga_hsync
1
输出
VGA 行同步信号
vga_vsync
1
输出
VGA 场同步信号
Hcnt_signal
12
输出
当前像素的列计数值
Vcnt_signal
11
输出
当前像素的行计数值
frame_addr
17
输出
帧缓存的读地址信号,由vga时序产生

舵机控制IP

本系统为了实现追踪,需要水平方向、竖直方向各一个舵机,以组成二自由度平台。平台采用的舵机是四线舵机,除了电源、地以及pwm信号线以外,还有一根反馈信号线,能够以电压的形式返回舵机当前的位置(角度)。反馈信号使得控制算法设计变得简单而有效,本系统的控制算法框图如下:


本系统的舵机控制IP,封装如下:



引脚说明:

端口名称
位宽
方向
端口说明
Clk_50M
1
输入
工作时钟,50MHz
reset
1
输入
模块复位
Move_EN
1
输入
舵机运动使能
vsync_in
1
输入
帧同步输入
x
12
输入
小球中心点横坐标
y
11
输入
小球中心点纵坐标
A_VAUXP
1
输入
A路ADC差分输入P端
A_VAUXN
1
输入
A路ADC差分输入N端
B_VAUXP
1
输入
B路ADC差分输入P端
B_VAUXN
1
输入
B路ADC差分输入P端
pwm_x
1
输出
舵机云台水平方向舵机的pwm信号
pwm_y
1
输出
舵机云台竖直方向舵机的pwm信号

为了采集反馈信号,需要一个模拟-数字转换器件。Xilinx 7系列的芯片都集成了模数转换器(XADC)。这是相比Xilinx前一代产品新增加的特性,可在系统设计中免去外置的ADC器件,提高了系统的集成度。XADC的框图如下:


XADC的主要性能指标有:

l 12-bit,1M采样率;

l 即可采集片外电压信号输入,又可采集芯片温度、芯片供电电压

l  通过DRP(dynamic reconfigurationport)接口,可灵活配置XADC的工作模式和参数(输入极性、采样通道选择、报警值等),也可查看ADC转换结果。

本平台的XADC的调用和配置,参考了《7 Series FPGAs and Zynq-7000 All Programmable SoC XADC Dual 12-Bit 1 MSPSAnalog-to-Digital Converter User Guide》(ug480)的p77-p85。具体读者可查阅此文档。本系统的XADC有两路,每一路都为差分信号,分别用到上面ADC框图中,外部模拟输入的VAUXP[6]/ VAUXN[6]以及VAUXP[7] / VAUXN[7]。

舵机控制模块的工作原理为:图像每一帧都会得到一组小球中心点的横纵坐标。在帧同步信号vsync_in的驱动下,根据ADC采样值计算出当前的舵机角度,同时计算出当前小球中心点坐标与画面中心点坐标的距离,将这两个数值的单位统一换算成pwm,然后根据上述控制算法框图,计算出下一时刻舵机的pwm值。



高工
2020-07-23 22:14:58     打赏
2楼

感谢分享


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]