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

注:本博文将讲解一个FPGA设计图像处理系统实例,此实例的功能为高速追踪乒乓球。读者可以参考本博文的算法思路、工程框架,但博主并不提供工程。

当前,实用的图像处理系统都要求高速处理。目前广泛采用软件进行处理,但软件处理存在速度、成本的问题。近年来,随着现成可编程门阵列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.图像处理部分功能框图:


·        色彩空间转换模块RGB2HSV

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

 

引脚说明如下:


端口名称

位宽

方向

端口说明

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 即可采集片外电压信号输入,又可采集芯片温度、芯片供电电压

通过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 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值