手势识别代码详细说明1(第二部分见下一篇)


源代码位置见链接

第一节  整体框架的结构介绍

图像采集就是利用相机或者摄像头等图像采集设备对操作者的手势进行捕捉的过程,本实验系统采用图像的预处理就是对采集到的图像进行一些前期的简单处理,其目的是使图像适合后面的手势特征参量的提取过程。本实验系统,识别目标为5种简单的静态手势,判别上下左右四种动态手势,以及手势运动轨迹识别。所以先前加工阶段的重点内容是手势图片的二值化、中值降噪和图片的分割。

本系统中首先用OV7670摄像头模块对手势进行捕捉,其中涉及到对摄像头的配置和调试,随后进入图像预处理阶段,首先进行Gauss处理,设置基于人手肤色的阈值对图像进行二值化,二值化后的图像进一步进入中值滤波模块,对图像进行平滑和滤波,最终,再由手势定位和分割算法对其进一步处理,得到预处理完毕的图像,以供后面的识别算法使用。图像采集和预处理过程如下框图:


图3.1 图像采集和预处理框图

整体系统中除了图像采集及图像的预处理以外,还包括图像的显示,以及识别算法的设计。在图3.2中,详细的描述了整个识别系统,具体流程叙述如下:首先,利用OV7670摄像头捕获到格式为YCrCb的24bit图像数据,然后使用数据选择器分离出对后面处理没有作用的Y色彩分量,再经过高斯概率模型,计算出每一个像素点与得到的标准肤色像素符合的概率,再通过阈值的界定,把YCrCb的24bit数据简化成为二值的1bit数据。图像像素数据转为二值化的操作简化了后端处理算法的复杂度的同时,大大减少了FPGA芯片上面存储资源的消耗。然后使用中值滤波把Guass概率模型处理后的图像数据进行降噪处理,在去除白噪声等CMOS图像传感器噪声的同时也虑掉了因光照带入的大部分环境噪声。中值滤波后的二值化图像数据需要从两路输出,一路在乒乓ram中存储,并依次显示,一路用于图像的定位与分割。最后把乒乓ram中的数据进行显示的同时也用于手势识别算法的输入,从而实现图像显示与手势识别的同步。






图3.2 提出框架的结构

第二节  所采用的硬件介绍  

如图3.3所示,该系统包括ov7670摄像头、显示器、vga信号数模转换模块、以及xilinxgenesys开发板。通过ov7670摄像头,采集到图像数据格式为YCrCb,经过一系列转换、减噪、定位、分割、识别的操作得到手势识别的结果,把结果用串口传输到PC端就可以做来作为应用程序的输入端口。


图3.3 提出的系统所使用的硬件资源

2.1摄像头介绍

本文的识别系统采用了Omnivision公司的OV7670摄像头模块,如下图3.4所示,其驱动较为简单,图像效果可以满足实验要求。


图3.4 摄像头模块图片

OV7670为数字输出的CMOS摄像头,其摄像头为三十万像素,其焦距为3 .6毫米(可以手动微调),其体积较小,工作电压低,支持VGA显示。通过SCCB(I2C协议的简化)总线控制,不同的配置可以得到不同分辨率和数据格式的影像数据,还包含有图像处理功能,如伽马曲线、饱和度、色度、白平衡等。此摄像头的在本设计中的图像采集速度为30帧/秒。

其主要管脚定义为:

3V3——输入电源电压       GND——接地          SIO_C——SCCB控制时钟

VSYNC——帧同步           HREF——行同步       SIO_D——SCCB串行输入

PCLK——像素时钟          XCLCK——时钟信号     D0-D7——数据端口

RESET——复位端口         PWDN——功耗选择

2.2摄像头驱动

摄像头的驱动需要严格的遵守摄像头芯片的时序,如图3.5所示,为SCCB时序图。主要包括:对摄像头进行配置的SCCB时序和图像输出的时序。

SCCB通信时序,主要是用作对片内寄存器进行配置,从而控制输出图像的各种所需功能,其时序与I2C时序相类似,如下图:


图3.5 SCCB时序图

在SCCB的时序下,对摄像头内部的寄存器进行设置,主要是写入数据,实现对数据格式、帧率、时钟模块的设计,其核心的参数设置为:

 

图3.6 对SCCB寄存器配置Verilog代码

通过设置寄存器,将摄像头设置成了输出图片大小为640*480,格式为YCrCb(一般看成等价于YUV 422),使用FPGA提供的外部时钟。

2.3开发板介绍

xilinx公司的GENESYS  FPGA的评估板,被选为系统硬件。在FPGA的virtex5芯片上面实现整个手势系统的硬件搭建,帧率是每秒60帧,由于摄像头的采集帧率为每秒30帧,所以,在这里每一帧都处理两次,为使用60fps摄像头的整体架构留出空间,便于进一步开发及维护。实现了图像数据真正意思上面的采集、处理、显示的实时性,同步性。值得一提的是,系统处理的图像像素是640×480,相对于同样使用FPGA的设计[25]中图像像素240*320有了很大的提升。

在我们的实现中,ov7670camero和 xilinx公司的GENESYS  FPGA相配合,xilinx’sise 作为开发工具。

我们采用的xilinx公司的GENESYS  FPGA 平台的硬件资源如下:

Ø  Xilinx Virtex-5 LX50T FPGA in a 1156-pin BGA package

Ø  7,200 slices each containing four 6-input LUTs and eight flip-flops

Ø  112 FPGA I/O's rounted to expansion connectors

Ø  256Mbyte DDR2 SODIMM with 64-bit wide data

Ø  1.7Mbits of fast block RAM

Ø  12 digital clock managers

Ø  6 phased-locked loops

Ø  48 DSP slices

由于实时显示的图像需要通过VGA信号线,需要的信号为模拟信号,而我们采用的开发板没有此模拟信号的输出,所以,我们需要使用通用IO作为此显示信号,再使用数模转换芯片输出显示需要的模拟信号,其中模数转换芯片选用ADV7123,它的的特征参数为:

Ø  吞吐量:330 MSPS

Ø  三通道、10位数模转换器

Ø  无杂散动态范围(SFDR)

Ø  RS-343A/RS-170兼容输出

Ø DAC输出电流范围:2mA至26mA

Ø  TTL兼容输入

Ø  5 V/3.3 V单电源供电

Ø  48引脚LQFP封装

Ø 低功率;30mW 

 

 

第3节 采用的信号及时序分析

本系统整体上使用同步时钟的设计,pclk为系统工作时钟,速度为30M。通过配置OV7670摄像头的寄存器,可以采集格式为YUV/RGB的图像,而我们采用的图像格式为YCbCr,YCbCr色彩空间格式是YUV的一个偏移,其中Y的意思是一致的,而其它两个分量同样指的是色彩,YCbCr是YUV色彩空间中的一员,所以,在OV7670中的YUV格式可以完全按照色彩空间YCbCr进行处理,值得注意的是,U相当与Cr,V相当与Cb。我们配置寄存器采集到YUV4:2:2格式的图像数据,然后通过后面的数据选择器过滤掉我们不关心的Y信号,只保留U和V信号,如图3.7中的CMOS_oDATA信号。再把U与V分量信号送入Guass模块,与肤色标准值进行Gauss概率的比较运算,得出为肤色的概率值,通过与阈值的比较从而得到我们关心的二值图像,即图3.7中的binary_data。像素值为1的表示的是肤色,其余的部位像素值为0。到此为止,即完成了数据的转换过程,得到的二值图像数据即可直接用于后面的图像显示、手势分割以及指尖识别的运算。



图3.7  数据转换的波形图


 

第四章 具体模块的详细介绍

第1节  肤色检测及高斯模型介绍

很多研究在手势上做出一些特殊标记来进行手势分割,例如使用Red colour glove来进行分割。但是附加的条件降低了系统的实用性,所以我们的设计根据色彩空间的选用原则:肤色能在所采用的色彩空间中表现出很好的聚类特性。采用的色彩空间模型能够很好的把“肤色”和“非肤色”区分开来。通过肤色在各色彩空间的聚类分析对比结果可知,肤色在YCbCr色彩空间中的聚类更为紧凑,采用此色彩空间更易于实现聚类算法。于是我们采用YCbCr色彩空间进行肤色检测。

我们把肤色在YCbCr的聚类分布,近似的看成是符合高斯概率分布模型,即认为肤色这样的随机样本在YCrCb的色彩空间中正态分布近似的看做成为高斯概率模型分布,而高斯概率模型分布在数学上面已经是很成熟的技术,又在统计学中发挥了十分重要的意思。它的表达公式直观,计算简单。十分适合我们加以改进,从而用于手势识别的肤色概率模型的建模中去。

Gauss(高斯)DSP模块是数字信号处理里的一种首要方法,其目的为对图片进行平滑性操作和对图片进行加权平均,从而可以根据一定的阈值来对其进行二值化处理。

具体来说,高斯处理是对整幅图。像加权平均,针对每个像素点,都是由其自身和相邻域内的其它点经加权平均后得到。而具体的实现操作则是将图像与正态分布(也叫高斯分布)作卷积,因为高斯函数的傅里叶变换还是高斯函数,所以对图片来说,有低通的作用,在频域可以实现高斯滤波。

本文中的二值化处理,是基于肤色的。肤色作为人手表面最为明显的特征之一,可以很自然的被用作检测区分,在对手势的早期研究中,通过极其大量的试验和推算,可以找出手势的肤色聚类空间和肤色在其中的分布,可得到一个近似的基于手的阈值。

在本论文中,在进行二值化处理时,根据肤色的聚类空间和高斯卷积和的共同作用,可以对每个像素点根据其颜色(肤色)信息,即YCrCb中的Cr和Cb信息,进行高斯运算,再将最终的结果与设定的阈值进行比较,则可以将图像二值化。

二维的高斯概率模型为:P(Cb,Cr)=exp[-0.5(x—M)TC-1(x—M)],x=[Cb,Cr]T,即为样本象素在YCbCr颜色空间的值。M=E(x),为肤色在YCbCr颜色空间的样本均值。C=((x—M)(x—M)T),为肤色相似度模型的协方差矩阵。我们采集了实验室及周边不同肤色的45名同学,每人采集不同光照下的20幅图片,通过计算得出M=[123.1015,139.2258]T,C=[0.0108,-0.0019;-0.0019,0.0074]。

图4.1所示,(a)图为原始图像,(c)中,x轴为像素点的横坐标,y轴为像素点的纵坐标,z轴为通过高斯概率公式计算出的像素点的高斯概率值。(d)图是左图的横截面。图中可以看出,肤色的部分,也就是手的部分概率值明显大于其他部分,所以,在适当的阈值下把图像的概率值限定为二值数据就可以很好的分割出手的部分,就相当于在b图的适合的z值部分横切一刀,就可以把位于上部的肤色部分分割出来。


图4.1 (a)用于处理的手势图像(b)、(c)、(d)经过高斯模块处理后的不同视角的图片(e)经过阈值分割后的图像(d)经过中值滤波处理后的图像(f)经过分割后得到的图像

由于这一部分主要是数据计算,所以我们采用ise与matlab联合的systemgenerator插件自动生成代码,其中设计的框图如图4.2所示:


图4.2 system generator的程序框图

第2节  中值滤波模块分析

中值滤波属于图象处理的范畴,其目的重点是强化一幅图片里特定相关信息,还能减弱或者消去部分不必要的信息,实质上,这种处置实质上没有加强图像的有用信息,结果只是增强了对某种信息的识别能力,使得处理过的图像更加适合一些特定的应用或后续处理。

中值滤波的主要过程可以概括为:把一幅灰度图片里任意一点的相关灰度值被该点相邻邻域中各点的灰度值的均值(中值)取代。本系统中,采用了3*3的邻域作为取中值的对象,经过运算,将数字图像中各点的灰度值(本文取二值图像,灰度为0或1)用计算后的均值代替,即可实现中值滤波。如图4.3所示:

 

 

 

 


图4.3 中值滤波算法几何演示图

中值滤波法是一种非线性平滑技术,其既保持图片细节,也可去掉噪声,而且对于孤立噪声去除效果很好,但对缓变的噪声,其效果较差。它对消除椒盐噪声非常有效。它的计算方式是,将目标像素点的灰度值用其某个范围领域中所有像素点灰度值的平均值代替。而我们这里面是对二值化的图像数据进行处理,所以其相对于灰度图像的中值滤波要简单一些,我们只需要计算该点某邻域窗口内的所有像素点的和值是否大于此邻域窗口的像素点个数的一半,如果大于,此像素点滤波后的像素为1,否则就为0。

虽然我们对于此中值滤波的算法要求较为简单,但是由于整体对速度的要求较高,即30帧每秒,这和摄像头采集图像的速度是相同的,就要求所有的模块对数据进行同步处理。所以,我们必须在下一帧数据到来之前或者同时完成对上一帧数据的滤波处理,所以我提出的中值滤波模块的结构如图4.4所示。

首先,此模块与整体同步,使用与Gauss模块相同的guass_clk作为系统时钟,在一帧数据进来的时候,分为九路,按照地址addra在九个ram中存储相同的数据。与此同时,把上一帧存储的数据按照图上所示的输出地址,在相同时钟下面输出,并相加后,与4作比较,大于4的即认为此点的像素数据是1,小于的则为0,这样就很好的完成了同步的实时设计,在这里面ram采用IP核生成,其类型为:simple Dual Port RAM。但是,值得注意的是,ram的类型一定要设置为先读后写,否则,数据将会丢失,此模块将失去作用。这种设计方法虽然占用的存储空间较多,但是它在此部分完成了同步设计,优化了整体时钟的分配,减少了竞争冒险的现象,最重要的是,其使整个系统能实现真正意义上面的实时处理与现实。



图4.4 文中设计的中值滤波的框架图

图4.5可以看出,我们采用了3阶的中值滤波。这个是我们通过matlab建模验证的,在matlab建模中,我们首先采用了3阶的中值滤波,发现滤波的强度不够,然后我们又使用了5阶的中值滤波,发现滤波后图像有少量变形,即强度有点过。那么,为什么我们在这里采用3阶的中值滤波呢?原因在于图像数据的格式,我们在硬件上面通过ov7670采集到的数据实际上是4:2:2数据格式的,即在横向维度上面每两个点只才一个像素值,为了节省片上面积,我们也不必要直接将其直接转换成4:4:4数据格式,只需要在显示的时候把每一个像素点显示两次即可。所以这里进行中值滤波的也是4:2:2格式的数据,我们对其进行3*3的中值滤波就相当于进行了6*3的中值滤波,相对于我们建模时所采用的5*5的中值滤波恰巧强度弱了一些,而且很适合硬件实现。后经验证,此种结构的中值滤波能很好的消除摄像头引入的椒盐噪声,滤波效果很好,Figure7即是得到的滤波效果的对比,可以看出光照对Guass模块及中值滤波模块的影响较小。


图4.5 二值图像经过滤波器处理的去噪效果

第3节  乒乓ram分析

在本论文的系统中,图像显示部分接收到的数据是二值化的,这实质上已经将数据量减少了,但是对于一幅图像来说,其大小仍然有640*480位大小,而系统使用的FPGA芯片Xilinx Virtex-5 其内部的Block RAM的大小为32K,不足以缓存多幅图像用于显示,所以需要采用Ping-Pang缓存机制来记录高速数据采集设备(本系统中为OV7670摄像头)采集进来的图像流数据,从而可将保存下来的每帧图像数据供给后面的识别模块进行识别。

Ping-Pang缓存的基本过程是:经过2个特定的数据缓冲区(A&B),接收的信号流被等时间的划分到两个部分。

在第一个时钟周期内,输入的图像像素数据被存储到数据缓存区A中。然后,在第二个时钟周期内,根据MUX模块的切换作用,输入的图像像素数据被切换输入到数据缓冲区域B中,并且,把先前数据缓冲区域A中暂留的,在前一个时钟保留的数据,经由输出数据模块切换作用,送到下面的数据流加工处理部分(本文中为手势识别模块)进行运算和处理。接下来第三个缓存时钟,输入数据切换模块再次切换缓存模块,把接收到的数据流存储到数据缓存模块A中,并将数据缓存模块B中存储的第二个时钟的数据,经由输出数据切换部分的切换,输出到数据处理部分进行计算处理。整个过程如此不断循环。

其操作原理的图示如下:


图4.6  Ping-Pang存储原理示意图

除了我们前面提到的存储空间不足的问题,我们提出结构的图像采集的时序和vga显示的时序也不同,所以,为了解决存在的这两个问题,达到同步处理,我们使用了乒乓操作。按照前面分析所提供的操作时序,摄像头采集到的图像数据被依次存储到两个RAM中,在第二个时钟周期的时候,除了把输入的数据存储到RAM A 中,还需要把RAM B中的数据输出,用于vga的数据显示与指尖识别,在第三个时钟周期的时候,通过使用输入数据选择器MUX的再次切换,将输入的数据流缓存到ram A同时将ram B缓存的第2个周期的数据传给输出数据选择单元并输出给后面的模块。如此循环。在这里面ram采用IP核生成,其类型为:simple Dual Port RAM。外部使用的I/O如图4.6中ramA的细节图所示。

本系统中,使用Ping-Pang缓存机制,实现了低速处理模块和高速数据流(图像流)的匹配问题,并通过输出数据选择模块和输入数据选择模块相互按节拍切换,相当缓存的信号流无卡顿的经过数据处理单元,使之流畅的进行数据缓存与处理,提高了效率。

第4节  手势跟踪与分割

手势分割作为手势识别的关键组成之一,分割的过程经常受到光照和背景复杂度的影响,所以对不同的要求和图像信息,应该用不同的分割办法。

常用的分割方法有三种:1.依靠图片直方图阈值区分的方法,即通过图片灰度信息的波谷作临界值,主要在静态图像的分割上应用。2.在动态图像分割中的帧差法、光学流法和差影法。3.基于颜色特征的物理分割方法。

本文采用的手势分割方法是:先确定手的质心位置,以此来确定手的位置,进而再根据质心对图像进行分割。

在实际计算一幅图像 f ( x , y )(维数M×N)中手部所在位置时,我们已经完成了图像数据格式的二值转化,而且,为了用最少的面积分割出手势部分,我们需要找到手势区域的图像中心。于是,我们大致通过计算二值化图像的重心位置解决上述问题,一方面,重心是随着手的移动而改变,所以能达到随时跟踪手部位置的目的。另一方面,手部的重心基本能代表手势的中心,能使切割手势方框的面积最小。具体计算重心及分割手势的方法如下图4.7中(a)-(d)所示:

a)       计算质心,计算公式如下:        

                                                         

f(x,y)为图像的像素值,这里已经二值化了,所以为0或1。Xc为重心的横坐标,Yc为重心的纵坐标。

b)       求出下边界,即图中的Length。由于手部的下面常常有衣服袖子的分割,所以比较容易找到下边界,这个可以通过计算图像下边部分大于行像素和均值的最大行数获得。

c)       计算Length1。根据人手的大致比例,及大量测量得知:Length1近似于1.8*Length,为了节省资源,在硬件上面可用Length+(Length*52)>>6实现。

d)       计算Length2。与步骤3近似,可用Length*1.4近似获得,为了硬件易于实现,用Length+(Length*52)>>7获得。


                             

图4.7 手势重心及手势分割中的变量位置

通过上述步骤,我们很好的跟踪了手部的运动,找到了手势的重心。而且通过重心很好的分割出了手势,此分割过程减少了需要处理的数据量,剔除了其余背景无用信息的干扰,提高了整体识别的鲁棒性。如图4.7(e)所示,为PC机上面建模的分割结果,图4.7(f)为实际系统的分割结果。

第5节  VGA显示模块

5.1 VGA接口简介

本实验系统中,需要将摄像头拍摄到的手的图像显示在显示器上,以便让人更加直观的看到系统所处理的手势,为此,使用了VGA接口和电脑显示器,图4.8展示了其具体接口细节。


图4.8 VGA接口及显示器

VGA即指视频图形阵列,此接口广泛的应用在数字式的传输连接中,各种带D-SUB 15PIN接口的电子设备均支持此种接口,在本系统中,此VGA接口就是充当着FPGA和电脑显示器连接的接口,用于将FPGA采集到的实时图像数据发送给FPGA显示出来。


在此系统中,由于摄像头输出的是数字信号,本设计所采用的FPGA开发板上面也不具备此模拟信号的输出,但是,本文中使用的VGA接口按照国际上面的标准规定,接收的是模拟信号,才能保证全色彩的实现。而虽然我们只在这里用到了二值化的图像,设计时为了有更好的兼容性,依然采用模拟信号进行连接,所以需要使用模数转化器来实现,本实验中选择 转换器,图4.9所示的为其硬件及电路图。


图4.9 转换器

5.2 VGA显示时序

本文采用的VGA显示时序为逐行扫描的方式,其特征为从显示器的左上点开始,自左至右,从上而下,挨个点进行扫描,一行结束,扫描点就跳转到下一相邻行左端的第一个点,当扫描到行的末端的时候,行同步信号拉低,经过等待的前沿时间和后沿时间,再次拉高,进行下一行扫描,以此来完成同步;等到行扫描结束,即完成了一幅图像的显示,此时,使用场同步信号来完成场同步操作,此操作使扫描点重置到屏幕起始的左上点,至此为止,完成了行和场的重置,重新进行下一帧图像的显示。

其VGA行时序和场时序如下图:

图4.10 VGA行和场时序


本文采用的部分VGA显示代码的截图如图4.11如下:


图4.11 部分VGA显示代码

经过试验系统的测试,其显示效果(二值图)如下:


图4.12 测试显示效果图

即经过测试,VGA显示部分可以达到预期的显示目标。



....................................................................

第二部分见下一篇-手势识别代码详细说明2

欢迎留言讨论

  • 6
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值