注意:本文不提供工程,作为思路供读者解读。
当前,实用的图像处理系统都要求高速处理。目前广泛采用软件进行处理,但软件处理存在速度、成本的问题。近年来,随着现成可编程门阵列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值。