基于zedBoard的手势识别及桌面操控系统
山东大学信息学院集成电路
Sorin
目录
基于zedBoard的手势识别及桌面操控系统........................................................................ 1
综述................................................................................................................................. 3
手势识别简介.............................................................................................. 3
手势识别应用前景:智能化,家庭化.................................................................. 3
技术背景:软硬件协同设计是大方向.................................................................. 3
项目简介............................................................................................................ 3
系统搭建.......................................................................................................................... 3
zedBoard硬件准备.............................................................................................. 3
Linux软件平台准备............................................................................................. 3
由SD卡启动linux......................................................................................... 3
交叉编译环境搭建....................................................................................... 4
编译OpenCV库与Qt库....................................................................................... 4
数据采集与显示.................................................................................................. 4
USB摄像头数据采集.................................................................................... 4
显示视频..................................................................................................... 4
图像预处理......................................................................................................... 4
滤波操作..................................................................................................... 4
肤色提取..................................................................................................... 4
肤色在不同颜色空间下的聚类分析............................................................... 4
多种提取方式相结合的方案......................................................................... 5
形态学操作抗噪........................................................................................... 5
特征学习与分类.................................................................................................. 5
轮廓与特征.................................................................................................. 5
贝叶斯分类器识别手势................................................................................ 5
文本文件的读取与显示....................................................................................... 5
硬件加速与协同设计........................................................................................... 5
运行效果.......................................................................................................................... 5
肤色提取............................................................................................................ 5
轮廓处理............................................................................................................ 5
手势识别............................................................................................................ 5
系统控制............................................................................................................ 5
项目评估.......................................................................................................................... 5
优缺点分析......................................................................................................... 5
总结与展望......................................................................................................... 5
参考资料.......................................................................................................................... 5
综述
手势识别简介
作为机器视觉领域的一项重要内容,基于视觉的手势识别技术(vBGR, Vision Based Gesture Reeognition)是自然的人机交互下的一个分支,它的发展与人机交互技术息息相关。手势识别就是把各种手势按照一定的规则通过计算机识别出来,指示计算机转化为相应的控制命令或者语义,实现对计算机的控制或信息交流。
手势识别应用前景:智能化,家庭化
智能机器时代的到来,对手势识别系统的需求大大增加。它代表了更自然、直接的人机交互,在智能电视、智能机器、以及智能家居等方面有着非常广泛的应用前景。尤其在智能电视方面,如电视阅读、频道控制等等方面对手势识别的词条数目、识别准确度等都提出了更高的要求。
技术背景:软硬件协同设计是大方向
目前的手势识别系统大都基于纯软件实现,识别速度和硬件成本往往不能兼顾,尤其在嵌入式领域表现更为明显。而软硬件协同设计,用硬件实现预处理,软件配合硬件部分完成智能算法,以达到高速、低成本的设计目的。Xilinx公司的zynq系列芯片以及PlanAhead、HLS工具为大规模系统的软硬件协同设计提供了可能。故本项目采用digilent公司开发的zynq实验平台zedBoard实现手势识别及应用系统的设计。
项目简介
该项目基于zedBoard开发设计,使用xilinx HLS工具进行图像预处理部分的硬件开发,在PS部分搭建linux系统,并使用OpenCV开发智能算法,使用QT完成显示。鉴于当前的识别算法现状,在肤色提取方面,该系统采取多种提取方法结合的方式提高提取成功率;使用Bayes分类器完成静态手势的学习与识别。
完整的系统将能通过手势控制显示屏上文本的缩放、换页等动作,以及完成简单的系统控制指令,来模拟智能电视交互功能实现。
系统搭建
zedBoard硬件准备
要在zedBoard运行linux,首先要在zedBoard配置linux的运行环境,在该项目中选择了Digilent公司的OOB设计作为母版进行改动移植。
OOB设计硬件构成 1
OOB设计硬件 1
Linux软件平台准备
由SD卡启动linux
参照zedBoardCTT制作启动Linux的BOOT文件、deviceTree及ramDisk。
在SDK环境下打开“” Create Zynq Boot Image“,按顺序加入官方提供的FSBL文件、由PlanAhead生成的bitStream文件及u-boot文件,生成u-boot.bin并更名为BOOT.bin,与设备树文件devicetree.dtb,磁盘镜像ramdisk8M.image.gz,以及x-linux内核镜像一起复制到SD卡,插到板卡上,配置启动模式为SD卡启动。
连接串口线,在linux下打开minicom,可以查看到启动信息
配置OpenCV及Qt运行环境
1.在Fedora下安装arm-xilinx-linux-gnueabi
2.交叉编译OpenCV,编译时注意同时编译必要的依赖包
3.交叉编译QtSourceEveryWhere,并配置qMake
4.编译Qt项目,在QtCreator中建立项目并运行成功后,在终端下进入项目文件夹,输入qmake -o Makefile project.pro 生成makefile,再输入make命令可生成在嵌入式系统上运行的qt程序
数据采集与显示
由于openCV不支持在xilinx-linux上使用cvCameraCapture捕捉图像,需要自己编写程序通过V4L读取webCam的图像,并进行处理。
USB摄像头数据采集
V4L是Linux环境下开发视频采集设备驱动程序的一套规范(API),它为驱动程序的编写提供统一的接口,并将所有的视频采集设备的驱动程序都纳入其 的管理之中。V4L不仅给驱动程序编写者带来极大的方便,同时也方便了应用程序的编写和移植。V4L2是V4L的升级版,由于我们使用的OOB是3.3的 内核,不再支持V4L,因而编程不再考虑V4L的api和参数定义。
V4L2支持内存映射方式(mmap)和直接读取方式(read)来采集数据,前者一般用于连续视频数据的采集,后者常用于静态图片数据的采集,本文重点讨论内存映射方式的视频采集。
应用程序通过V4L2接口采集视频数据分为五个步骤:
首先,打开视频设备文件,进行视频采集的参数初始化,通过V4L2接口设置视频图像的采集窗口、采集的点阵大小和格式;
其次,申请若干视频采集的帧缓冲区,并将这些帧缓冲区从内核空间映射到用户空间,便于应用程序读取/处理视频数据;
第三,将申请到的帧缓冲区在视频采集输入队列排队,并启动视频采集;
第四,驱动开始视频数据的采集,应用程序从视频采集输出队列取出帧缓冲区,处理完后,将帧缓冲区重新放入视频采集输入队列,循环往复采集连续的视频数据;
第五,停止视频采集。
由此构建V4LCam的类声明如下,方便程序调用
typedef struct{
void *start;
unsigned length;
}buffer;
class V4lCam
{
public:
V4lCam();
struct v4l2_buffer camera_buf;
void init(int width,int height);
buffer *buffers;
void startCamStream();
int init_v4l2(void);
struct v4l2_buffer imgBuf;
buffer *getFrameData();
void releaseCap();
V4Lsize imgSize();
private:
int PicState;
unsigned short IMAGEWIDTH;
unsigned short IMAGEHEIGHT;
int fd;
};
显示视频
要想Qt显示由V4L读取的摄像头图像,要将YUV转化为RGB图像,并通过手动设置QImage数据的方式显示。
V4L读取到的YUV(422)图像转化为RGB图像的部分代码:
V4Lsize camsiz=cam.imgSize();
buf=cam.getFrameData();
CvSize siz;
siz.width=camsiz.width;
siz.height=camsiz.height;
IplImage *img,*img2;
img=cvCreateImage(siz,8,3);
img2=cvCreateImage(siz,8,3);
input2YUVimage((char*)(buf->start),img->imageData,siz.width,siz.height);
cvCvtColor(img,img2,CV_YCrCb2RGB);
‘
在Qt上实现动态显示,使用Qpainter绘制所有的图像并以一定频率刷新即可。
图像预处理
滤波操作
由WebCam读取的图像往往不够清晰,会有很多噪点,为了后面的处理更加方便,首先对图像进行滤波处理。常用的滤波操作包括:中值滤波、高斯滤波等,经过测试,发现核大小为5X5的中值滤波具有更好的效果与运行速度,而且便于硬件实现。
肤色提取
肤色提取是手势识别系统中的第一步,也是最终要的一步,肤色提取的效果甚至可以直接影响识别系统的成败。幸运的事,已有许多前人为此作出了贡献。
肤色在不同颜色空间下的聚类分析
RGB空间
在RGB彩色模型中,所表示的图像由3个图像分量组成,每个分量阁像都是其原色图像。多数的阁像釆集设各都是以CCD技术为核心,直接感知色彩的R、G、B 二个分量,这也使得三基色模型成为图像成像、显示、打印等设备的基础,具有十分重要的作用,被广泛用于视频监视器和彩色摄像机中。
HSV空间
HSV (色调、饱和度、亮度)彩色空间是人们用来从调色板或颜色轮中挑选颜色所用的彩色系统之一。该颜色系统比RGB系统更接近于人们的经验和对彩色的感知。HSV空间中将亮度信息分离,因而色度H分量对光照变化有更高的鲁棒性。经过采样也可得知,肤色在H分量上具有很高的鲁棒性,因此在使用H与S分量进行肤色分割,具有很好的效果。
HSV颜色空间 1
YCrCb颜色空间
YCbCr空间广泛用于图像和视频压缩标准,如MPEG和JPEG都采用此格式,它是YUV彩色空间家族中的一种。在YCbCr模型中,Y表示亮度。Cb和Cr分量分别表示蓝色和红色的色度,并且Cb和Cr之间是二维独立的。经过分析可知,肤色的Cb、Cr分量的联合概率密度图像大概成椭圆分布,故椭圆模型[i]pow(Cb-148,2)/(30.4*30.4)*cos(2.44)+pow(Cr-106,2)/(10.6*10.6)*sin(2.44)<1仍值得采用。但在实际测试的过程中,得到的图像并不十分理想,优势在于在讨论的3中模型中,CrCb的椭圆模型对光照的敏感性是最小的。
多种提取方式相结合的方案
在项目研究过程中,经过多次试验,发现采用HSV空间的HS分量及RGB空间共同进行阈值处理能够获得比较好的效果。在经过查阅文献[ii]及试验得知H分量实际对V分量有一定依赖性,但只要不在光照强烈的室外,分割效果依然不错。经过多次试验,发现在OpenCV环境下,采用85<H<125可以获得比较理想的分割效果。参考文献[iii]限制R>80&&G>25&&B>10&&R-B>15)||(R>210&&G>200&&B>160&&R-G<=15)时可以在RGB空间下获得比较好的分割效果。故最终选取的分割方案如下:
H<130&&H>80&&S<170&&S>15&&R>G&&R>B&&((R>80&&G>25&&B>10&&R-B>15)||(R>210&&G>200&&B>160&&R-G<=15))
形态学操作抗噪
经过固定阈值分割得到的二值化图像具有较多的噪声,当使用形态学操作进行简单的处理。膨胀操作可以连通小的区域,去掉负噪声;腐蚀操作可以将周围环境中的噪点去除。经过多次试验得出,按序进行一次膨胀、两次腐蚀、两次膨胀可以获得最好的形态学处理效果。
特征学习与分类
轮廓与特征
轮廓在表观视觉中十分有用,可用轮廓踢除由于预处理不当引起的空洞,并删除噪点。
在OpenCV中,轮廓是通过序列来表示的,通过cvFindContor可以很方便地获得二值图像的轮廓
为了去除不希望的区域,如环境的干扰、噪点等,并寻找到最合适的轮廓,在查找轮廓的过程中,首先通过周长面积比去掉大面积的背景噪声,然后在剩余的轮廓中选取面积最大的区域作为监测到的手势区域。该部分代码如下:
CvContourScanner scanner = cvStartFindContours(skin,memSto,sizeof(CvContour),CV_RETR_CCOMP,CV_CHAIN_APPROX_NONE);
while( (seq = cvFindNextContour(scanner) ) != NULL){
area = fabs(cvContourArea(seq));
indexArea=area/(siz.width*siz.height);
lenth=cvContourPerimeter(seq);
if(indexArea<0.009||lenth*lenth/area>150.0){
cvSubstituteContour(scanner,NULL);//删除当前的轮廓
}else{
CvBox2D box=cvMinAreaRect2(seq,memSto);
box_area=box.size.width*box.size.height;
seq2= cvConvexHull2(seq,memStoHull,CV_CLOCKWISE,1);
if(area>areaMax){
areaMax=area;
classifydata.areaRatio=areaMax/fabs(cvContourArea(seq2));
classifydata.recRatio=areaMax/(box.size.height*box.size.width);
classifydata.angle=box.angle;
rec_wid=box.size.width;
indAraMax=indexArea;
indLenMax=(lenth*lenth)/area;
seqMax=seq;
hullMax=seq2;
}
// }
}
}
seq=cvEndFindContours(&scanner);
提取到轮廓后可以获得很多有用的特征,其中具有缩放旋转不变性的如归一化Hu矩、周长面积比、以及其凸包凸缺陷等特征都可提供良好的分类依据。
贝叶斯分类器识别手势
贝叶斯分类的基础是概率推理,就是在各种条件的存在不确定,仅知其出现概率的情况下,如何完成推理和决策任务。概率推理是与确定性推理相对应的。
openCV中与贝叶斯分类器相关的API函数有以下几个:
(1)CvNormalBayesClassifier::CvNormalBayesClassifier();
该函数为默认构造函数;
(2)CvNormalBayesClassifier::CvNormalBayesClassifier(const Mat& trainData, const Mat& response, const Mat& varIdx=Mat(),const Mat& sampleIdx=Mat());
该函数实际是在默认构造函数内部调用train()函数进行分类器训练;
(3)bool CvNormalBayesClassifier::train(const Mat& trainData, const Mat& response, const Mat& varIdx=Mat(),const Mat& sampleIdx=Mat());
该函数进行贝叶斯分类器的训练,输入向量必须为行向量;变量response必须为整数,但其在初始化时类型可被设置为CV_32FC1;
所有特征向量必须完整,不允许训练样本集的某一个向量存在数据缺失;
(4)float CvNormalBayesClassifier::predict(const Mat& samples, Mat* result=0);
该函数根据用户输入的测试样本的特征向量,返回其所属的类别;注意,如果输入是很多个测试样本的特征向量组成的矩阵,返回值为result矩阵;
在该项目中,先构造贝叶斯分类器在上位机学习训练已经获得的特征数据,并将分类器数据导出在嵌入式设备上使用
部分代码
if(IS_TRAINING&&(!TRAIN_COMPLETED)){
classifier.load("classifier.txt");
classifier.train(train_mat,res_mat,Mat(),Mat(),0);
classifier.save("classifier.txt");
TRAIN_COMPLETED=1;
}
识别结果见附件
硬件加速与协同设计
使用zynq平台进行开发的巨大优势就在于可以使用HLS进行高层次综合,用硬件加速代替原本使用软件完成的部分。其中图像处理中基于像素流的预处理部分最适合使用HLS进行加速,通过AXI-Stream+DMA与PS直接进行高速数据通信,可以极高地加速系统运行。
软硬件协同设计的基本流程如下:
运行效果
在屏幕的左上角即为读入的源图像与检测到的轮廓及凸包的叠加图,右下角为检测到的肤色区域,右上角为通过轮廓重建的二值图像,由此可以看到有效地去除了噪点并填补了内部及边缘处的空洞。
result显示的是由分类器返回的结果,该手势与训练时预置的索引号是一致的,对手势的倾斜角度的判断-45也是正确的,其他的特征值是分类器用来学习与识别的,在这里无法直观得到信息
项目评估
优缺点分析
该项目仅仅作为一个参考模型,显示了软硬件协同设计进行智能视觉处理的基本思路。 利用现有技术,大大缩短了开发周期提高了开发质量。
但该项目尚有许多不足之处,如在肤色提取环节上仍有较大上升空间以及识别手势数量较少等。
总结与展望
参考资料
《软硬件协同设计——基于Zynq》
《精通Qt编程(第四版)》
《Learning OpenCV》
Xilinx官方文档
懒兔子博客
超群天晴博客
[i]
[ii]
[iii]