你的位置:EETOP 赛灵思(Xilinx) 社区 >> >> 全部 >> 详细内容

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

发布者:jackzhang 时间:2015-09-06 13:43:47

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

最新课程

  • 深入浅出玩儿转FPGA

    本视频基于Xilinx公司的Artix-7FPGA器件以及各种丰富的入门和进阶外设,提供了一些典型的工程实例,帮助读者从FPGA基础知识、逻辑设计概念

  • 从零开始大战FPGA基础篇

    本课程为“从零开始大战FPGA”系列课程的基础篇。课程通俗易懂、逻辑性强、示例丰富,课程中尤其强调在设计过程中对“时序”和“逻辑”的把控,以及硬件描述语言与硬件电路相对应的“

  • Verilog基础及典型数字

    课程中首先会给大家讲解在企业中一般数字电路从算法到流片这整个过程中会涉及到哪些流程,都分别使用什么工具,以及其中每个流程都分别做了