一个Kinect虚拟演示实例的实现毕业设计论文.docx

上传人:白大夫 文档编号:4557213 上传时间:2019-11-16 格式:DOCX 页数:33 大小:3.08MB
返回 下载 相关 举报
一个Kinect虚拟演示实例的实现毕业设计论文.docx_第1页
第1页 / 共33页
一个Kinect虚拟演示实例的实现毕业设计论文.docx_第2页
第2页 / 共33页
一个Kinect虚拟演示实例的实现毕业设计论文.docx_第3页
第3页 / 共33页
一个Kinect虚拟演示实例的实现毕业设计论文.docx_第4页
第4页 / 共33页
一个Kinect虚拟演示实例的实现毕业设计论文.docx_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《一个Kinect虚拟演示实例的实现毕业设计论文.docx》由会员分享,可在线阅读,更多相关《一个Kinect虚拟演示实例的实现毕业设计论文.docx(33页珍藏版)》请在三一文库上搜索。

1、数学科学学院毕业设计(论文)题目:一个Kinect 虚拟演示实例的实现 目 录摘要:21 引言32 Kinect的简单介绍32.1 Kinect结构32.2 Kinect for Windows SDK能介绍33 Kinect的现阶段的应用33.1 虚拟应用33.2 3D建模53.3 计算机相关的应用63.4 小结74 Kinect虚拟演示系统的技术讨论74.1 Kinect骨骼追踪数据的处理方法74.1.1 骨骼追踪的数据结构74.1.2骨骼追踪数据的获取方式74.2骨骼点旋转信息84.2.1骨骼点旋转信息存储方式84.2.2在骨骼数据回调函数中获取骨骼点的旋转信息84.3Kinect彩色和

2、红外图像数据的处理94.3.1 彩色图像的格式94.3.2红外数据流94.4Kinect深度数据处理104.4.1深度数据的结构104.4.2如何获取数据流105演示系统结构115.1演示框架115.2 自然交互方式设计126图片的操作控制137 骨骼扫描148.视频数据处理179 主界面设计1810结束语19致谢19参考文献19Abstract20 一个Kinect虚拟演示实例的实现摘要:我们平时看到的演示活动大多使用幻灯片作为内容的载体,而演示人会在演示同时利用鼠标灯控制器来切换幻灯片。本文设计的虚拟演示系统是为了让用户可以更好的同演示内容进行交互。本文运用了Kinect的深度数据处理和骨

3、骼追踪数据处理的技术实现了一个用户可以对图片进行移动,放大和缩小的演示系统。关键词 幻灯片,虚拟演示系统,交互,深度数据,骨骼追踪1 引言生活中,我们平时看到的演示活动大多使用幻灯片作为内容的载体,利用大屏幕或者投影仪将内容显示出来,通常,人们利用PowerPoint软件来制作PPT演示文稿,PPT演示方法具有很多优势,但在一些情况下也存在缺点。首先,演讲人必须依靠鼠标或者其他控制器才能完成幻灯片的切换,频繁的鼠标操作会导致演示行为极不自然;其次,在一些特殊的演示场景中,比如远程课堂、视频会议等,演示行为仅能通过一个屏幕来显示,如何兼顾演讲者图像以及幻灯片图像就成了一个问题。虚拟演示系统就是为

4、了解决这些问题而出现的全新的演示方案。在该系统中,演示者的图像可以嵌入到场景中,同时演示者可以与场景中的元素互动,比如抓取场景中的物体,拖拽并且放大等。本文利用Kinect SDK提供的深度数据流和原始骨骼数据来设计一套合理的交互方式来控制演示内容。2 Kinect的简单介绍2.1 Kinect结构Kinect有三个摄像头,中间是一个RGB摄像头,用来获取640480的彩色图像,两边是两个深度传感器,左侧的是红外线发射器,右侧的是红外线接收器,用来检测玩家的相对位置。Kinect的两侧是一组四元麦克风阵列,用于声源定位和语音识别。图1.Kinect结构2.2 Kinect for Window

5、s SDK能介绍骨骼追踪:对在Kinect视野范围内移动的一个或两个人进行骨骼追踪,可以追踪到人身体上的20个节点。此外,Kinect还支持更精确的人脸识别。深度摄像头:利用“光编码”技术,通过深度传感器获取到视野内的环境三维位置信息。音频处理:与Micorsoft Speech的语音识别API集成,使用一组具有消除噪声和回波的四元麦克风阵列,能够捕捉到声源附近有效范围之内的各种信息。3 Kinect的现阶段的应用3.1 虚拟应用Kinect试衣镜,这是基于Kinect体感技术的试衣镜,让客户可以在家快速试穿衣服而不用到服装店,这可以更好的提高销售效率,使得网络商店应用的更加广泛。 图2.用户

6、准备选择 图3.用户选择服装类型 图4.用户已将服装虚拟试穿在身上3.2 3D建模开发人员可以利用C#编写一个应用程序,借助Kinect的三个摄像头将屋子内环境进行扫描,然后重建出一个3D模型。而且可以从Kinect的两个摄像头中获取不同的视频数据,然后将其进行整合,制作成动态3D模型。 图5.利用Kinect扫描房间 图6.调整视角3.3 计算机相关的应用Kinect手势操作浏览器,通过Kinect手势进行浏览器进行翻页,下放,收拉;使用Kinect进行多点触摸,浏览图片,地图;在手术室中,手术者可以通过Kinect查看患者的影像资料,这大大方便了医生手术,减少了手术室的人员流动。 图7.手

7、左右平移选择页面 图8.握拳打开某一项3.4 小结除以上的应用外,Kinect在很多方面都有着它的身影,比如:机械控制,虚拟游戏,虚拟实验等。可以通过Kinect操控遥控飞机,控制高达机器人;使用Kinect手势绘图,通过体感控制所绘图形,使之具有物理特性,比如重力,吸引力等;在虚拟游戏中,用户可以更好的体验游戏,真正的就像自己身处游戏之中。4 Kinect虚拟演示系统的技术讨论4.1 Kinect骨骼追踪数据的处理方法4.1.1 骨骼追踪的数据结构在SDK中每个骨骼点都是用Joint类型来表示的,每一帧的20个骨骼点组成基于Joint类型的集合。此类型包含3个属性,具体内容如下。JointT

8、ype:骨骼点的类型,这是一种枚举类型,列举出了20个骨骼点的特定名称。Position:SkeletonPoint类型表示骨骼点的位置信息。SkeletonPoint是一个结构体,包含X,Y,Z三个数据成员,用以存储骨骼点的三维坐标。TrackingState:JointTrackingState类型也是一种枚举类型,表示该骨骼点的追踪状态。4.1.2骨骼追踪数据的获取方式应用程序获取下一帧骨骼数据的方式是通过调用回调函数并传递一个缓存实现的获取骨骼数据调用的是OpenSkeletonFrame()函数。对于NUI骨骼API而言,相同的骨骼数据只会提供一次。 NUI骨骼API提供了两种应用模

9、型,分别是轮询模型和时间模型。 轮询模型通过调用SkeletonStream类的OpenNextFrame()函数即可。OpenNextFrame()函数声明如下。Public SkeletonFrame OpenNextFrame( Int millisecondswait ) 时间模型以事件驱动的方式获取骨骼数据,应用程序传递一个事件处理函数给SkeletonFrameReady事件,该事件定义在KinectSensor类中。当下一帧数据准备好时,会立即调用该事件回调函数。4.2骨骼点旋转信息除了跟踪骨骼点的位置,Kinect SDK还能计算出骨骼点的旋转信息,利用此功能可以计算出人体骨骼

10、在yaw轴的旋转情况。4.2.1骨骼点旋转信息存储方式在Kinect SDK中骨骼点旋转信息定义为BoneOrientation类,包含以下数据成员。StartJoint:起始骨骼点;EndJoint:结束骨骼点;HierarchicalRotation:相对旋转信息;AbsoluteRotation:绝对旋转信息。下面定义骨骼点的坐标系,如下图髋骨中心脊柱右髋左髋肩部中心右膝盖左膝盖右脚踝左脚踝右肩头部左肩右脚左脚右肘左肘右手腕左手腕右手左手骨骼点坐标系一该骨骼点为原点,以其上层骨骼点到它的直线方向为y轴正方向的坐标系。其中,相对旋转信息就代表了一段骨骼中,起始骨骼点和结束骨骼点的两个坐标系

11、之间的转移参数。相应地,绝对旋转信息就代表了结束骨骼点坐标系和Kinect空间坐标系之间的转移参数。4.2.2在骨骼数据回调函数中获取骨骼点的旋转信息由于骨骼点旋转信息包含在骨骼数据流中,因此需要在骨骼数据的回调函数中获取相应的数据。在获取了一帧的SkeletonFrame中的SkeletonData之后,可以使用下列代码读取骨骼点旋转信息:foreach (Skeleton skeleton in this.skeletonData) if(skeleton,TrackingState = SkeletonTrackingState,Tracked) foreach(BoneOrientat

12、ion orientation in skeleton.BoneOrientations) BoneRotation hierarchial = orientation.HierarchicalRotation; BoneRotation absolute =orientation,AbsoluteRotation; 4.3Kinect彩色和红外图像数据的处理4.3.1 彩色图像的格式彩色数据可以选用两种数据格式,这两种格式决定了返回应用的图像数据是RGB形式还是以YUV形式编码。RGB格式在sRGB色彩空间提供32位线性X8R8G8B8格式的色彩位图。YUV格式提供16位伽马校正的线性UYV

13、Y格式的色彩位图,YUV色彩空间的伽马校正等价于RGB色彩空间的sRGB 伽马校正。在Kinect for Windows SDK的API中,彩色图像类型用枚举类型ColorImageFormat表示,可枚举的值如下表所示。 成员名称 描述InfraredResolution640480Fps30 红外数据,分辨率为640480,帧为15f/s RawBayerResolution1280960Fps12 拜尔原始数据,分辨率为1280960,帧率为12f/s RawBayerResolution640480Fps30 拜尔原始数据,分辨率为640480,帧率为15f/s RawYuvReso

14、lution640480Fps15 数据类型为RawYUV,分辨率为640480,帧率为12f/s RgbResolution1280960Fps12 数据类型为RGB,分辨率为1280960,帧率为12f/s RgbResolution640480Fps30 数据类型为RGB,分辨率为640480,帧率为30f/s YuvResolution640480Fps15 数据类型为YUV,分辨率为640480,帧率为15f/s Undefined 未定义的格式4.3.2红外数据流红外图像数据需作为一种彩色图像格式聪SDK中获取,对应的图像格式为上表InfraredResolution640480F

15、ps30。因此,其处理方式跟色彩图像大体相同,而且需要特别注意的一点是,红外图像无法和色彩图像同时获取。4.4Kinect深度数据处理4.4.1深度数据的结构深度数据提供了一种结构,该结构中每个像素的高13位表示在深度传感器的视野范围内离特定坐标物体最近的距离。有两种深度数据流可以使用:帧的为 320240像素;帧的大小为 8060像素。4.4.2如何获取数据流通过建立缓冲区和相关方法调用,应用程序可以获取最新的彩色图像帧,深度图像帧及骨骼跟踪数据流。应用程序可以使用两种模式获取数据流。 轮询模型轮询模型是一种“拉”的方式。应用程序会定期检查数据源是否有新数据,如有,则加载。Kinect的三种

16、数据流都有OpenNextFrame方法,当调用OpenNextFrame方式时,应用程序可以给一个超时的值T,这个值就是应用程序愿意等待新数据返回的最长时间。方法试图在超时之前获取新到的数据帧,如果超时,则会返回一个null值。各种图像帧的请求方法如下。请求彩色图像帧的方法:ColorImageStream.OpenNextFrame(T)请求深度图像帧的方法:DepthImageStream.OpenNextFrame(T)请求骨骼数据帧的方法:SkeletonStream.OpenNextFrame(T)2.事件模型使用事件模型时,应用程序注册数据流的FrameReady事件。每当事件触

17、发时,将会调用事件的属性FrameReadyEventArgs来获取数据帧。彩色图像帧数据流获取,代码如下:Void sensor_ColorFrameReady(object sendor,ColorImageFrameReadyEventArgs e) ColorImageFrame colorFrame = e.OpenColorImageFrame();深度图像帧数据流获取,代码如下:Void sensor_DepthFrameReady(object sendor,DepthImageFrameReadyEventArgs e) DepthImageFrame depthFrame

18、= e.OpenDepthImageFrame();骨骼数据帧数据流获取,代码如下:Void sensor_SkeletonFrameReady(object sendor,SkeletonFrameReadyEventArgs e) SkeletonFramekeletonFrame = e.OpenSkeletonFrame();彩色图像帧,深度图像帧,骨骼数据帧数据流同步获取,代码如下:Void sensor_AllFrameReady(object sendor,AllFramesReadyEventArgs e) ColorImageFrame colorFrame = e.Open

19、ColorImageFrame(); DepthImageFrame depthFrame = e.OpenDepthImageFrame(); SkeletonFramekeletonFrame = e.OpenSkeletonFrame();5演示系统结构5.1演示框架本文的虚拟演示系统是通过对骨骼数据的追踪来捕捉人体的动作来控制图片的移动,放大,缩小,旋转等操作,从而形成一个能与人交互的一个虚拟演示系统,总体结构如下:骨骼数据追踪图片操作定义窗体界面定义图片捕捉动作操作动作视频流演示系统 对骨骼数据的追踪先定义骨骼点,通过定义的骨骼点确定骨骼位置;再定义一个骨骼状态函数,通过这个骨骼状态

20、函数来捕捉人体的动作,最后通过时间模型来对骨骼数据进行追踪。骨骼点 骨骼状态 时间模型 2图片操作通过对骨骼的追踪,确定到手的位置,然后定义操作的动作来识别是对图片进行什么操作。先获取图片的中心位置,然后在进行操作。获取中心位置缩放操作旋转操作移动操作 3.视频窗口定义一个KinectSensor对象用来表示Kinect设备,定义一个数组来存放获取到的图像数据,再通过Loaded方法来来初始化视频数据并接收视频流,最后利用kinectSensorColorFrameReady方法来获取视频数据并显示出来。获取图像数据 初始化为视频数据接收并显示视频5.2 自然交互方式设计1各种识别方式的特性针

21、对Kinect的自然交互功能,有三种不同的识别方式:静态姿态识别,动态手势识别以及语音识别。这三种方式的基本介绍如下: 识别方式 识别功能 优点 缺点 姿态识别 识别某一时刻 稳定 适用范围较窄 人体的静态姿态 手势识别 识别一小段时间 交互方式自然,动 误识别率高, 内手的连续动作 态识别符合人的思 误识别复杂度 维方式 低 语音识别 识别语音指令 交互方式自然 误识别率高对应于这些特性,他们的使用环境也不一样:姿态识别一般适用于控制交互状态的切换;手势识别利用其余人体动作的高度契合而作为主要的交互驱动方式;语音识别则对上述两种识别方式的盲点操作进行补充。2 应用所需交互功能对于不同的应用,

22、我们应该根据其本身的使用特点,设计出最合适的自然交互系统。演示系统所需的交互操作如下:操作类型 需求描述选择元素 元素指页面中的图片,文本和视频。需要选中当前 页面中的某一元素移动元素 在页面中移动选中的元素放大,缩小元素 放大和缩小被选中的元素切换元素 对选中的元素进行动画切换前后翻页 将页面转到上一页或下一页进入,退出子 针对当前页面的某些元素,将页面转到以其为主题的子页面 页面中3 组合出统一的交互系统选取移动元素收回手臂向前后翻页元素操作页面操作 切换元素放大缩小元素进入,退出子页面 手向前伸本文是控制演示系统中的球体的位置,大小。所以只有元素的操作,没有利用页面的操作。6图片的操作控

23、制C#中WPF默认支持开发多点的触控程序,只需下面三个方法即可:Protected override void OnManipulationStarting(ManipulationStartingEventArgs e) base.OnManipulationStarting(e); e.ManipulationContainer = mainCanvas; e.Handled = true; protected override void OnManipulationDelta(ManipulationDeltaEventArgs e) base.OnManipulationDelta(e

24、); var element = e.Source as FrameworkElement; var transformation = element.RenderTransform as MatrixTransform; /获取缩放的中心点 Point center = new Point(element.ActualWidth / 2, element.ActualHeight / 2); var matrix = transformation = null ? Matrix.Identity : transformation.Matrix; center = matrix.Transfo

25、rm(center); /缩放 if (e.DeltaManipulation.Scale.X 0.5 & e.DeltaManipulation.Scale.Y 0.5 & e.DeltaManipulation.Scale.X 2 & e.DeltaManipulation.Scale.Y 0 & center.Y 0 & center.X this.mainCanvas.ActualWidth & center.Y this.mainCanvas.ActualHeight) matrix.Translate(e.DeltaManipulation.Translation.X, e.Del

26、taManipulation.Translation.Y); element.RenderTransform = new MatrixTransform(matrix);protected override void OnManipulationInertiaStarting(ManipulationInertiaStartingEventArgs e) base.OnManipulationInertiaStarting(e); e.TranslationBehavior.DesiredDeceleration = 0.001; e.RotationBehavior.DesiredDecel

27、eration = 0.01; e.ExpansionBehavior.DesiredDeceleration = 0.01; 7 骨骼扫描 为了能识别人的动作,我们需要将人体的骨骼信息传送到Kinect,为此需要定义一个KinectSensor对象的SkeletonFrameReady事件。具体代码如下:private void KinectDevice_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) using (SkeletonFrame frame = e.OpenSkeletonFrame() if (

28、frame != null) frame.CopySkeletonDataTo(this.frameSkeletons); Skeleton skeleton = GetPrimarySkeleton(this.frameSkeletons); if (skeleton != null) Joint head = skeleton.JointsJointType.Head; Joint leftHand = skeleton.JointsJointType.HandLeft; Joint leftWrist = skeleton.JointsJointType.WristLeft; Joint

29、 rightHand = skeleton.JointsJointType.HandRight; Joint rightWrist = skeleton.JointsJointType.WristRight; Point leftHandPos = GetPosition(leftHand); Point leftWristPos = GetPosition(leftWrist); Point rightHandPos = GetPosition(rightHand); Point rightWristPos = GetPosition(rightWrist); if (rightHandPo

30、s.Y rightWristPos.Y & leftHandPos.Y leftWristPos.Y) leftHandTarget = GetHitTarget(skeleton.JointsJointType.HandLeft, mainCanvas); rightHandTarget = GetHitTarget(skeleton.JointsJointType.HandRight, mainCanvas); if (rightHandTarget != null) dics.Clear(); foreach (Image element in mainCanvas.Children)

31、dics.Add(element, Canvas.GetZIndex(element); ResetZIndex(dics, rightHandTarget); if (leftHandTarget != null & rightHandTarget != null) Image leftHandHitImage = leftHandTarget as System.Windows.Controls.Image; Image rightHnadHitImage = rightHandTarget as System.Windows.Controls.Image; if (leftHandHit

32、Image != null & rightHnadHitImage != null) String leftHandName = leftHandHitImage.Name; String rightHandName = leftHandHitImage.Name; if (rightHandName.Equals(leftHandName) List list = new List() new HandData Id=1,X=leftHandPos.X,Y=leftHandPos.Y, newHandData Id=2,X=rightHandPos.X,Y=rightHandPos.Y ;

33、handDataSource.RaiseNewDataEvent(list); else List list = new List() /new HandData Id=3,X=rightHandPos.X,Y=rightHandPos.Y ; handDataSource.RaiseNewDataEvent(list); else handDataSource.RaiseNewDataEvent(new List(); 在该方法中,我们从骨骼数据中获取左右手的具体位置,然后当左右手的手部(hand)高于肘部(wrist)时,则认为用户是要进行操作;然后根据左右手所在的位置,获取当前左右手所在

34、的对象,将该对象置于最前,以便于我们进行操作。然后判断左右手是否位于同一个对象之上,如果是,则将左右手的坐标点存储到list中,触发事件handDataSource.RaiseNewDataEvent(list),提醒有新的触摸点产生。8.视频数据处理用Loaded方法来初始化图形数据并接收视频流private void Window_Loaded(object sender, RoutedEventArgs e) kinectSensor = (from sensor in KinectSensor.KinectSensors where sensor.Status = KinectStat

35、us.Connected select sensor).FirstOrDefault(); kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); /启用红外数据kinectSensor.Start();kinectSensor.ColorFrameReady += kinectSensor_ColorFrameReady;用kinectSensorColorFrameReady方法来获取视频数据并显示出来private void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e) using (ColorImageFrame imageFrame = e.OpenColorImageFrame() if (imageFrame != null) this.pixelData = new byteimageFrame.PixelDataLength; imageFrame.CopyPixelDataTo(this.pixelData); this.ColorImage.Source = BitmapSourc

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1