基于Kinect的PPT演示辅助系统的制作方法

文档序号:11864085阅读:399来源:国知局
基于Kinect的PPT演示辅助系统的制作方法与工艺

本发明涉及Kinect体感摄像头应用开发领域,具体地说是基于Kinect的PPT演示辅助系统及方法。



背景技术:

随着科技日新月异的发展,越来越多的老师会使用PPT来辅助进行教学活动,越来越多的企业会用PPT演示的形式来发布他们的产品或者是总结他们近期各方面的状况。PPT这一软件无论在教学领域还是在商业领域都有十分广泛的应用。但目前使用PPT教学的老师,往往需要使用鼠标控制,这样就把演讲者的活动范围局限在了电脑的旁边。虽然光笔或者无线鼠标得到了推广,但与此同时PPT原有的强大的注释笔功能也随之淡出了人们的视线。光笔虽然能用激光点来提示听众演讲的重点,但是无法在屏幕上留下注释痕迹。



技术实现要素:

为了克服现有的PPT演示辅助工具的不足,本发明提供一种基于Kinect的PPT演示辅助系统及方法。用户无需使用传统的鼠标、光笔即可进行演讲,扩大了使用者的活动范围,同时提供了一种更好的人机交互方式。

本发明需要保护的系统技术方案概括为:

一种基于Kinect的PPT演示辅助系统,特征在于,系统主要模块分为数据采集模块、手势识别模块、位置计算模块和PPT功能控制模块。数据采集模块,包括Kinect,安放于云台上并通过电机控制云台旋转角度,主要是利用Kinect采集深度信息和骨骼信息,深度信息用于计算用户(演讲者)的位置,骨骼信息用于手势识别。手势识别模块根据采集数据识别出用户(演讲者)手势,进而能够执行用户所需要的操作。位置计算模块,根据采集数据识别出用户(演讲者)手势头部位置操控云台转动,实现实时跟踪。

PPT功能控制模块是向用户提供的一系列服务,基于C#编程语言的相关控件和Microsoft Office PowerPoint公开的API,实现演讲者手势对于PPT演示的控制功能,包括画笔注释、PPT(快速)翻页、图片展示、视频播放等功能的使用。系统打破传统演示需要点击才能控制的现状,基于头部识别,控制云台转动以此扩大使用者的活动空间,结合传统鼠标和光笔的优点,使注释笔更加易用,PPT播放时可即时查看库中图片和影片,达到展示图片细节的目的以及更方便地控制影片播放。

所述数据采集模块直接利用Kinect SDK的深度和骨骼获取函数来采集信息。

所述手势识别模块,根据Kinect采集到的深度和骨骼信息,根据预先定义的手势库,识别演讲者进行PPT演示时的手势。包括翻页手势识别、唤出手势识别、暂停手势识别、挥手手势等基本手势的识别,以及图片拖动和缩放、视频播放、注释笔、快速翻页功能的手势识别等子模块。

所述翻页手势识别模块采用Microsoft.Samples.Kinect.SwipeGestureRecognizer库中定义的两个手势手势SwipeLeftDetected以及SwipeRightDetected。SwipeLeftDetected手势的定义为左手自然抬起至胸口,向右水平挥动过人体中心线,模拟鼠标左键“←”。SwipeRightDetected手势的定义为右手自然抬起至胸口,向左水平挥动过人体中心线,模拟鼠标右键“→”。

所述唤出手势识别子模块又包括了注释笔、左右边栏、上边栏的唤出识别子模块。

所述注释笔唤出识别子模块,当用户第一次右手握住放开后,屏幕上会出现进行注释的十字光标,十字光标会随着演讲者的右手移动。演讲者可以选择一个他需要进行注释的地点,然后握住右手,此时用户就可以添加注释了。为避免发生注释笔误唤出,系统对注释笔唤出区域进行了限制:1).dis1-dis2<-0.2,其中,dis1是颈部到右手的距离,dis2是头部到胯部的距离。2).RightHand.Position.Y-RightShoulder.Position.Y>=-0.1,其中RightHand.Position.Y表示右手中心点的Y轴坐标,RightShoulder.Position.Y表示右肩中心点的Y轴坐标。

所述左右边栏唤出识别子模块,用户自然抬起左右手即可唤出左右边栏。考虑到用户正常的肢体语言,系统对左右栏唤出方式进行了限制:1).dis1-dis2>0,其中dis1是颈部到右手的距离,dis2是头部到胯部的距离。2).左(右)手的与左(右)肩方向和水平角度必须小于26°。3).只有当用户抬手时间超过1秒,左右边栏才会唤出。

所述上边栏唤出识别子模块,用户只需将右手稍稍抬过头,即可唤出上边栏。

所述暂停手势识别子模块,设定了两个向量:左手小臂的方向向量(x1,y1)以及右手小臂的方向向量(x2,y2)。

x1=LeftHand.Position.X-LeftElbow.Position.X

x2=RightHand.Position.X-RightElbow.Position.X

y1=LeftHand.Position.Y-LeftElbow.Position.Y

y2=RightHand.Position.Y-RightElbow.Position.Y

其中,LeftHand.Position.X表示左手中心点的X轴坐标,LeftElbow.Position.X表示左肘中心点的X轴坐标,RightHand.Position.X表示右手中心点的X轴坐标,RightElbow.Position.X表示右肘中心点的X轴坐标,LeftHand.Position.Y表示左手中心点的Y轴坐标,LeftElbow.Position.Y表示左肘中心点的Y轴坐标,RightHand.Position.Y表示右手中心点的Y轴坐标,RightElbow.Position.Y表示右肘中心点的Y轴坐标。在视频播放的情况下,当|x1*x2+y1*y2|<0.008时,两个小臂几乎垂直时,系统认为此时构成暂停手势。为了减少误触发率,系统对于暂停手势识别设置了如下限制:

1).左右手的水平中点应该在头部的水平中点附近|(LeftHand.Position.X+RightHand.Position.X)/2-head.Position.X|<0.08,其中head.Position.X表示头部中心点X轴坐标。

2).左右手应该在两肩之间(LeftShoulder.Position.X<LeftHand.Position.X)&&(RightShoulder.Position.X>RightHand.Position.X),其中LeftShoulder.Position.X和RightShoulder.Position.X分别表示左肩和右肩中心点X轴坐标。

所述挥手手势识别子模块,使用“挥手”这样一个手势来实现功能的退出,挥手这一手势识别的最长时间为1秒。Kinect在1秒内识别左右挥动的次数至少为3次则判断其为挥手手势。当手的位置高于手肘的位置时开始识别。每当手过中线到达对侧时,计数器加1。计数器超过挥动判定最少次数则被判定为挥手。

所述图片拖动和缩放手势识别子模块在PPT演示的时候唤出右边栏,能显示出该工程目录下图像文件夹内所有拓展名为jpg、png、bmp等的图片,可以将它们拖入PPT内进行展示,向右伸出右手1秒便可以唤出右边的图片栏,把右手缩回图片栏则会消失。通过右手的上下摆动完成图片栏的滑动和图片的选择,演讲者右手上下移动出现图案选取图片,右手握住后向左边拖拽可以把图片拖入PPT,在此状态下双手握紧然后向外或者向内移动可以以中心为基准放大缩小图片,右手握住并移动可以移动图片,移动和缩放操作都可以多次进行,在此状态下挥手可以回到正常状态。右手的选择区域的上边界与右肩同高,高度约为0.2,映射到现实中的0.4m。抬起手时选择区域向下滑动,以展示列表上方的图片,手放低时则相反,到达列表头或尾时则不再滑动。右手落在选择区域内时,根据与右肩的高度等比例映射到屏幕上:

Y=(RightShoulder.Y-RightHand.Y)/0.2*ScreenHeight

其中,Y为右手选择区域高度,RightShoulder.Y和RightHand.Y分别为右肩和右手中心点的Y轴坐标,ScreenHeight为屏幕高度。

所述视频播放手势识别子模块在演讲中随时调出视频库中的任何视频进行播放,视频栏的唤出和移动和图片栏的处理方式类似,只是视频的选择操作是用左手来完成的,在视频的播放中可以使用“暂停”手势在进行视频的播放/暂停控制。系统使用同一个手势控制视频的暂停和播放,在一次暂停或播放后等待1s再检测后续的手势。

所述注释笔手势识别子模块,当演讲者抓住右手便进入划线状态,屏幕上会出现光标,位置是根据演讲者右手相对于肩膀的位置确定的,右手作抓取姿势便可以在屏幕上相应位置划出红线,右手松开则可以移动光标,然后可以划下一段线。最后使用“挥手”姿势退出划线状态,画过的线被擦除。划线过程中的坐标映射采用右手与左肩之间的相对位置,把在相应矩形框内的位置线性映射到屏幕上。具体的映射公式为:

X=(RightHand.X–LeftShouder.X–0.32)/0.35*ScreenWidth

Y=(RightHand.Y–LeftShouder.Y+0.08)/0.16*ScreenHeight

其中,RightHand为右手坐标,LeftShouder为左肩坐标,ScreenWidth和ScreenHeight是当前屏幕的宽度和高度,可以自适应不同分辨率的屏幕。

所述快速翻页手势识别子模块唤出当前PPT所有幻灯片的缩略图后,可以左右滑动查看所有唤出的缩略图,并且选中其中一张之后可以直接快速翻页至相应的幻灯片,在放映模式和非放映模式下都可以使用。演讲者把右手向上举过头顶,可以唤出上边栏,上边栏里显示的是当前放映的PPT中所有幻灯片的缩略图。在此状态下并且右手高于肩或以上高度时,可以对唤出的上边栏进行滚动或者对幻灯片缩略图进行选取。当小臂与法线的夹角超过45度时,上边栏进行滑动。小臂处于法线左侧时向前滑动,右侧时向后滑动。小臂与法线夹角不足45度时,出现一个图案对当前上边栏中显示的幻灯片缩略图选取,系统把中间的区域分成5个小区域,每个对应缩略图中的1至5个,根据手的位置选取。此时右手握住,进入翻页状态,选取的图案的位置确定,不再发生改变。在翻页状态下右手向下拉至腹部或者以下,就可以快速翻页至选择的幻灯片处,并且上边栏消失,状态转换至正常状态。若在翻页状态下松开右手,转换至上边栏状态;在上边栏状态下挥手转换至正常状态。

所述位置计算模块通过分析Kinect采集的数据,计算出演讲者相对摄像头范围中心的偏移位置,以串口通信方式给伽利略开发板发送信号,从而通过伽利略控制步进电机进行水平方向转动,实现实时跟踪演讲者。

所述PPT功能控制模块,注释笔控制使用C#编程语言中的图形(Graphics)类来进行注释笔红线的绘制;PPT(快速)翻页控制主要基于Microsoft Office PowerPoint公开的API,选用本系统PPT交互控制操作所需要的程序集,依照手势识别的结果实现对PPT的操控;图片展示用C#编程语言中的picturebox控件实现;视频播放控制用C#编程语言中的AxWindowsMediaPlayer控件来进行视频的播放。

附图说明

图1硬件组成

图2系统初始化流程

图3系统软件架构

图4翻页手势

图5左右边栏唤出手势

图6暂停手势

图7挥手手势

图8右手操作图片栏手势

图9注释笔手势划线区域示意图

图10 PPT快速翻页手势识别流程图

图11手势识别总状态转化图

图12 Kinect检测位置示意

图13 Galileo状态转化图

图14画线控制流程图

图15 PPT控制模型

具体实施方式

本系统设计利用Kinect摄像头同步采集的深度信息、骨架信息,基于Kinect SDK进行开发,并运行于Bay Trail嵌入式处理器。系统使用步进电机来控制云台的转动,根据Kinect传来的演讲者的位置信息,决定步进电机的转动状态,使用伽利略开发板和ULN2003芯片对步进电机进行驱动,以达到Kinect可以实时跟踪演讲者的目的。根据骨骼信息,设计了各种识别率高、学习成本低的手势,以此实现演讲者使用手势来操作PPT(快速)翻页、使用注释笔、查看图片、播放视频等一系列实用功能。

系统硬件架构以Bay Trail嵌入式处理器为核心,与各个外围设备外设连接,进行数据处理,发送信号等。Kinect负责采集深度及骨架信息,然后通过对演讲者的手势信息进行识别,基于C#编程语言的相关控件和Microsoft Office PowerPoint公开的应用程序接口(API),实现演讲者手势对PPT演示的控制。伽利略开发板用于接收电机转动信息控制电机,外接显示屏放映PPT、显示图片、播放视频等,步进电机实时跟随演讲者转动,以保证Kinect采集信息的准确性。

以下结合实施例和附图对本发明技术方案作进一步介绍。本实施例系统组成:Kinet+Bay trail+Galileo开发板+步进电机+屏幕,系统硬件组成如图1所示。

整个系统的原理为:系统硬件架构以Bay Trail嵌入式处理器为核心,与各个外围设备外设连接,进行数据处理,发送信号等。Kinect负责采集深度和骨骼信息(此技术已属于现有技术,不是本发明对现有技术的贡献部分),然后系统依据预先定义的手势对演讲者的手势信息进行识别,通过调用Microsoft Office PowerPoint公开的API,实现演讲者手势对于PPT演示的控制。伽利略开发板用于接收电机转动指令信息从而控制电机,外接显示屏放映PPT、显示图片、播放视频等,步进电机实时跟随演讲者转动,以保证Kinect采集信息的准确性。伽利略开发板对步进电机的控制是直接把伽利略的输出端口通过ULN2003芯片连接步进电机的驱动模块,来对步进电机的转动进行控制。

系统启动时首先要进行初始化,初始化流程如图2所示:

系统软件架构如图3所示:系统主要模块分为数据采集模块、手势识别模块、位置计算模块和PPT功能控制模块,所述手势识别模块、位置计算模块、PPT功能控制模块皆运行在Bay Trail嵌入式处理器中。数据采集模块,主要是利用Kinect采集手势识别所需要的深度信息和骨骼信息(已属于现有技术,不是本发明对现有技术的贡献部分),为手势识别和计算位置信息提供了数据。手势控制模块是系统的控制模块,根据采集数据识别出用户手势,进而能够执行用户所需要的操作。位置计算模块是与硬件部分的接口,根据位置操控云台转动,实现实时跟踪。PPT功能控制模块是向用户提供的一系列服务,包括画笔注释、PPT(快速)翻页、图片展示、视频播放等功能的使用。

1.数据采集模块

利用Kinect SDK的深度和骨骼获取函数来采集信息。深度信息采集的分辨率为680×480,帧率为30帧每秒。

2.手势控制模块

(1)翻页手势识别

采用Microsoft.Samples.Kinect.SwipeGestureRecognizer库中定义的两个手势手势SwipeLeftDetected以及SwipeRightDetected。SwipeLeftDetected手势的定义为左手自然抬起至胸口,向右水平挥动过人体中心线,模拟鼠标左键“←”。SwipeRightDetected手势的定义为右手自然抬起至胸口,向左水平挥动过人体中心线,模拟鼠标右键“→”。如图4所示。

(2)唤出手势识别

该子模块又包括了注释笔、左右边栏、上边栏的唤出识别子模块。

a.注释笔唤出识别

当用户第一次右手握住放开后,屏幕上会出现进行注释的十字光标,十字光标会随着演讲者的右手移动。演讲者可以选择一个他需要进行注释的地点,然后握住右手,此时用户就可以添加注释了。为避免发生注释笔误唤出,系统对注释笔唤出区域进行了限制:1).dis1-dis2<-0.2,其中,dis1是颈部到右手的距离,dis2是头部到胯部的距离。2).RightHand.Position.Y-RightShoulder.Position.Y>=-0.1,其中RightHand.Position.Y表示右手中心点的Y轴坐标,RightShoulder.Position.Y表示右肩中心点的Y轴坐标。

b.左右边栏唤出识别

用户自然抬起左右手即可唤出左右边栏。考虑到用户正常的肢体语言,系统对左右栏唤出方式进行了限制:1).dis1-dis2>0,其中dis1是颈部到右手的距离,dis2是头部到胯部的距离。2).左(右)手的与左(右)肩方向和水平角度必须小于26°。3).只有当用户抬手时间超过1秒,左右边栏才会唤出。如图5所示.

c.上边栏唤出识别

用户只需将右手稍稍抬过头,即可唤出上边栏。

(3)暂停手势识别

设定了两个向量:左手小臂的方向向量(x1,y1)以及右手小臂的方向向量(x2,y2)。

x1=LeftHand.Position.X-LeftElbow.Position.X

x2=RightHand.Position.X-RightElbow.Position.X

y1=LeftHand.Position.Y-LeftElbow.Position.Y

y2=RightHand.Position.Y-RightElbow.Position.Y

其中,LeftHand.Position.X表示左手中心点的X轴坐标,LeftElbow.Position.X表示左肘中心点的X轴坐标,RightHand.Position.X表示右手中心点的X轴坐标,RightElbow.Position.X表示右肘中心点的X轴坐标,LeftHand.Position.Y表示左手中心点的Y轴坐标,LeftElbow.Position.Y表示左肘中心点的Y轴坐标,RightHand.Position.Y表示右手中心点的Y轴坐标,RightElbow.Position.Y表示右肘中心点的Y轴坐标。在视频播放的情况下,当|x1*x2+y1*y2|<0.008时,两个小臂几乎垂直时,系统认为此时构成暂停手势。如图6所示.

为了减少误触发率,系统对于暂停手势识别设置了如下限制:

1).左右手的水平中点应该在头部的水平中点附近|(LeftHand.Position.X+RightHand.Position.X)/2-head.Position.X|<0.08,其中head.Position.X表示头部中心点X轴坐标。

2).左右手应该在两肩之间(LeftShoulder.Position.X<LeftHand.Position.X)&&(RightShoulder.Position.X>RightHand.Position.X),其中LeftShoulder.Position.X和RightShoulder.Position.X分别表示左肩和右肩中心点X轴坐标。

(4)挥手手势识别

挥手这一手势识别的最长时间为1秒。Kinect在1秒内识别左右挥动的次数至少为3次则判断其为挥手手势。当手的位置高于手肘的位置时开始识别。每当手过中线到达对侧时,计数器+1。计数器超过挥动判定最少次数则被判定为挥手。使用“挥手”这样一个手势来实现功能的退出,退出手势使用场景,如图7所示:

(5)图片拖动和缩放手势识别

在PPT演示的时候唤出右边栏,能显示出该工程目录下图像文件夹内所有拓展名为jpg、png、bmp等的图片,可以将它们拖入PPT内进行展示,向右伸出右手1秒便可以唤出右边的图片栏,把右手缩回图片栏则会消失。通过右手的上下摆动完成图片栏的滑动和图片的选择,右手的选择区域的上边界与右肩同高,高度约为0.2,映射到现实中的0.4m。抬起手时选择区域向下滑动,以展示列表上方的图片,手放低时则相反,到达列表头或尾时则不再滑动。右手落在选择区域内时,根据与右肩的高度等比例映射到屏幕上:

Y=(RightShoulder.Y-RightHand.Y)/0.2*ScreenHeight

其中,Y为右手选择区域高度,RightShoulder.Y和RightHand.Y分别为右肩和右手中心点的Y轴坐标,ScreenHeight为屏幕高度。

演讲者右手上下移动出现图案选取图片,右手握住后向左边拖拽可以把图片拖入PPT,在此状态下双手握紧然后向外或者向内移动可以以中心为基准放大缩小图片,右手握住并移动可以移动图片,移动和缩放操作都可以多次进行,在此状态下挥手可以回到正常状态。如图8所示.

(6)视频播放手势识别

视频栏的唤出和移动和图片栏的处理方式类似,只是视频的选择操作是用左手来完成的,在视频的播放中可以使用“暂停”手势在进行视频的播放/暂停控制。系统使用同一个手势控制视频的暂停和播放,在一次暂停或播放后等待1秒再检测后续的手势。

(7)注释笔手势识别

当演讲者抓住右手便进入划线状态,屏幕上会出现光标,位置是根据演讲者右手相对于肩膀的位置确定的,右手作抓取姿势便可以在屏幕上相应位置划出红线,右手松开则可以移动光标,然后可以划下一段线。最后使用“挥手”姿势退出划线状态,画过的线被擦除。划线过程中的坐标映射采用右手与左肩之间的相对位置,把在相应矩形框内的位置线性映射到屏幕上。具体的映射公式为:

X=(RightHand.X–LeftShouder.X–0.32)/0.35*ScreenWidth

Y=(RightHand.Y–LeftShouder.Y+0.08)/0.16*ScreenHeight

其中,RightHand为右手坐标,LeftShouder为左肩坐标,ScreenWidth和ScreenHeight是当前屏幕的宽度和高度,可以自适应不同分辨率的屏幕。如图9所示.

(8)快速翻页手势识别

在唤出当前PPT所有幻灯片的缩略图后,可以左右滑动查看所有唤出的缩略图,并且选中其中一张之后可以直接快速翻页至相应的幻灯片,在放映模式和非放映模式下都可以使用。演讲者把右手向上举过头顶,可以唤出上边栏,上边栏里显示的是当前放映的PPT中所有幻灯片的缩略图。在此状态下并且右手高于肩或以上高度时,可以对唤出的上边栏进行滚动或者对幻灯片缩略图进行选取。当小臂与法线的夹角超过45度时,上边栏进行滑动。小臂处于法线左侧时向前滑动,右侧时向后滑动。小臂与法线夹角不足45度时,出现一个图案对当前上边栏中显示的幻灯片缩略图选取,系统把中间的区域分成5个小区域,每个对应缩略图中的1至5个,根据手的位置选取。此时右手握住,进入翻页状态,选取的图案的位置确定,不再发生改变。在翻页状态下右手向下拉至腹部或者以下,就可以快速翻页至选择的幻灯片处,并且上边栏消失,状态转换至正常状态。若在翻页状态下松开右手,转换至上边栏状态;在上边栏状态下挥手转换至正常状态。快速翻页手势识别流程图如图10。

所有手势识别的状态转换图如图11所示。系统初始化后的状态为正常状态。在正常状态下,若系统识别手势为右手举过头,则转到上边框唤出状态;若系统识别手势为右手伸出一定距离且持续时间大于1秒,则转到右边框唤出状态;若系统识别手势为右手第一次握住再松开,则转到进入划线状态;若系统识别手势为左手伸出一定距离且持续时间大于1秒,则转到左边框唤出状态。在上边框唤出状态下,若系统识别手势为左手挥手,则返回正常状态;若系统识别手势为右手握住,则转到翻页状态。在翻页状态下,若系统识别手势为右手松开,则返回上边框唤出状态。在右边框唤出状态下,若系统识别手势为右手放下,则返回正常状态;若系统识别手势为右手握住并拖入图片,则转到右边框显示图片状态。在右边框显示图片状态下,若系统识别手势为挥手,则返回正常状态。在左边框唤出状态下,若系统识别手势为左手放下,则返回正常状态;若系统识别手势为左手握住,则转到左边框显示视频状态。在左边框显示视频状态下,若系统识别手势为挥手,则返回正常状态;若系统识别手势为左手松开,则转到播放左边框显示的视频状态。在播放左边框显示的视频状态下,若系统识别手势为挥手,则返回正常状态;若系统识别手势为暂停信号,则返回到左边框显示视频状态。在进入划线状态下,若系统识别手势为右手握住,则转到划线状态。在划线状态下,若系统识别手势为右手松开,则返回进入划线状态。

3.位置计算模块

演讲者的位置信息通过Kinect采集,根据骨架流中头节点的X轴方向坐标,判断当前需要往哪个方向旋转,通过USB转串口发送一个控制字符串(“l”,“r”或“s”)给伽利略板,伽利略板通过控制D8-D11输出端口的高低电平来对步进电机的转动进行控制。Kinect对演讲者的X轴方向坐标的检测示意,如图12:

屏幕的水平中心为坐标0点,用户面向Kinect时,左边为负,右边为正。初始化时保持在Stay状态,一旦X的绝对值超过阈值0.05(这里的±0.05代表偏移水平正中心0.05m)便从串口发送控制字符串,并更改当前状态为旋转状态。比如X<-0.05时给Galileo发送”l”,让云台顺时针转动以跟踪演讲者的移动。直到X的绝对值小于0.02,便再次回到静止状态。回到静止状态的阈值设置得较小,可以保证回到静止状态时人物基本处于正中心处。不管当前是什么运行状态,接收到“l”字符就保持顺时针转动,接收到“r”字符就保持逆时针转动,接收到“s”字符就保持静止。这样设计的好处在于,Galileo不会连续收到相同的指令,否则会造成指令发送速度快于接收速度,指令在缓冲区堆积,造成Galileo反应延时。状态转化图如图14:

4.PPT功能控制模块

(1)注释笔控制

使用C#中的Graphics类来进行红线的绘制。Graphics类是封装在System.Darwing中的一个GDI绘图类,可以在应用界面或者图层中绘制点、线、矩形、圆等一系列简单图形。对应于右手在虚拟矩形框中的位置,我们使用一个黑色的十字标识来表示当前光标在屏幕上的位置,这个十字标识由两个细长黑色矩形的图形框组合而成,根据演讲者右手的位置而实时改变在屏幕上的位置。十字标识在界面上移动时,其覆盖过的红线就会被擦除。为了解决这一问题,使用一个图层用来绘制红线。生成一个和当前屏幕相同大小的位图DrawBmp和能在这个位图上绘制图案的Graphics。在划线状态下,每一帧骨骼数据传过来,可以得到一个映射在屏幕上的点的坐标。因为Kinect采样的帧数为每秒30帧,如果仅仅依据每帧的坐标在屏幕上画一个点,画出的点是离散的,没办法连成线,所以每次要把前后两个点画成一条线。使用一个标志位来判断当前是否是这一笔的第一个点,若是,则记录当前点的位置为prePoint,此后的每一帧,得到一个新的点的坐标后,记为nowPoint,调用C#中的函数DrawGra.DrawLine(RedPen,prePoint,nowPoint)函数在两点之间画一根直线(RedPen为C#中的画笔Pen类,用来表示画线的颜色和粗细),这根线是画在DrawBmp上的。然后使用整个屏幕窗口的Graphics类把DrawBmp画在应用窗口中:G.DrawImage(DrawBmp,0,0),后面的两个0表示画出的图片的左上角在屏幕的左上角,正好和整个窗口重合。这样红线和“十”字标示不在一个图层,就不会被擦除了。然后把nowPoint赋值给prePoint,等待下一帧的数据。如此往复完成了画线的功能。整体状态流程如图14所示:

(2)快速翻页控制模块

PPT的翻页,首先要获取幻灯片应用程序的对象。该模块基于Microsoft Office PowerPoint公开的一些API来进行二次开发,选用主互操作程序集(PIA)。主互操作程序集是一个由供应商提供的唯一的程序集。它包含用COM实现的类型定义(作为元数据)。只能有一个主互操作程序集,而且该程序集必须由COM类型库的发行者用强名称签名。一个主互操作程序集可以包装同一类型库的多个版本。PIA中Microsoft.Office.Interop.PowerPoint.Application代表了PPT应用对象。此对象模型如图15所示:

获取了幻灯片应用程序对象之后,需要获取幻灯片对象,即Microsoft.Office.Interop.PowerPoint.Slide,但幻灯片对象存在于演示文稿对象之中,所以要先获取演示文稿对象,即Microsoft.Office.Interop.PowerPoint.presentation。获得slide对象之后就可以使用幻灯片对象的select方法对其进行翻页操作。

但是在大多数时候我们都使用PPT的放映模式,此模式下不能用slide对象的操作对PPT进行翻页操作。所以需要获取Application.SlideShowWindows.View对象,view对象代表PPT播放的幻灯片,用view对象的first,last,previous,next,gotoslide等方法可以实现放映时PPT的翻页。

(3)图片展示

图片用C#中的picturebox类显示,把picturebox的显示模式改为拉伸后图片会随picturebox大小位置属性的改变而改变,所以改变picturebox控件的属性就可以实现图片状态改变。picturebox的top和left属性决定了picturebox显示的位置,而这两个属性是根据手的位置映射到屏幕位置而决定。图片缩放的实现是记录下双手握住瞬时的左右手距离,根据之后每一时刻的双手距离和初始距离之比实时改变picturebox的尺寸。整个系统初始化时生成右边的图片栏。首先使用语句String path=Environment.CurrentDirectory+"\image"打开当前程序目录下的image文件夹,遍历其中所有jpg、png和bmp后缀的文件,并记录个数imageFileNum。因为在图片栏中每张图片设定为以长宽不超过150像素的大小展示,两个图片之间设置了30像素的间隔,所以整个右边栏图片RightBmp的高度应该是(30+imageFileNum*180)像素,宽度设置为200像素。生成合适大小的图片后,便依次把每张图片的缩略图绘制在RightBmp的对应位置,并用一个数组记录下每个图片的名称,以便后续选择图片时使用。把RightBmp放入一个PictureBox:RightArea,先把Visible属性设置为false,等待以后唤出时使用。

(4)视频播放功能

用C#中的AxWindowsMediaPlayer控件来进行视频的播放。MediaPlayer(wmp)是微软提供的com组件,能够很方便操作视频、音频等流媒体文件。在视频栏中选中视频之后,把视频路径提取为wmp的Url,把wmp.Visible设置为true,调用wmp.Ctlcontrols.play()函数进行视频的播放。需要暂停的时候调用wmp.Ctlcontrols.pause()即可。需要注意的是,为了操作的简便,使用同一个手势(类似于T的手势)控制视频的暂停和播放,所以在一次暂停或播放后等待1秒再检测后续的手势。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1