您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > kinect基本手势识别
[译]KinectforWindowsSDK开发入门(十一):手势识别下:基本手势识别上文简要介绍了手势识别的基本概念和手势识别的基本方法,并以八种手势中的挥手(wave)为例讲解了如何使用算法对手势进行识别,本文接上文,继续介绍如何建立一个手部追踪类库,并以此为基础,对剩余7中常用的手势进行识别做一些介绍。1.基本的手势追踪手部追踪在技术上和手势识别不同,但是它和手势识别中用到的一些基本方法是一样的。在开发一个具体的手势控件之前,我们先建立一个可重用的追踪手部运动的类库以方便我们后续开发。这个手部追踪类库包含一个以动态光标显示的可视化反馈机制。手部追踪和手势控件之间的交互高度松耦合。首先在VisualStudio中创建一个WPF控件类库项目。然后添加四个类:KinectCursorEventArgs.cs,KinectInput.cs,CusrorAdorner.cs和KinectCursorManager.cs这四个类之间通过相互调用来基于用户手所在的位置来完成光标位置的管理。KinectInput类包含了一些事件,这些事件可以在KinectCursorManager和一些控件之间共享。KinectCursorEventArgs提供了一个属性集合,能够用来在事件触发者和监听者之间传递数据。KinectCursorManager用来管理从Kinect传感器中获取的骨骼数据流,然后将其转换到WPF坐标系统,提供关于转换到屏幕位置的可视化反馈,并寻找屏幕上的控件,将事件传递到这些控件上。最后CursorAdorner.cs类包含了代表手的图标的可视化元素。KinectCursorEventArgs继承自RoutedEventArgs类,它包含四个属性:X、Y、Z和Cursor。X、Y、Z是一个小数,代表待转换的用户手所在位置的宽度,高度和深度值。Cursor用来存储CursorAdorner类的实例,后面将会讨论,下面的代码展示了KinectCursorEventArgs类的基本结构,其中包含了一些重载的构造器。publicclassKinectCursorEventArgs:RoutedEventArgs{publicdoubleX{get;set;}publicdoubleY{get;set;}publicdoubleZ{get;set;}publicCursorAdornerCursor{get;set;}publicKinectCursorEventArgs(doublex,doubley){X=x;Y=y;}publicKinectCursorEventArgs(Pointpoint){X=point.X;Y=point.Y;}}RoutedEventArgs基类有一个构造函数能够接收RoutedEvent作为参数。这是一个有点特别的签名,WPF中的UIElement使用这种特殊的语法触发事件。下面的代码是KinectCursorEventArgs类对这一签名的实现,以及其他一些重载方法。publicKinectCursorEventArgs(RoutedEventroutedEvent):base(routedEvent){}publicKinectCursorEventArgs(RoutedEventroutedEvent,doublex,doubley,doublez):base(routedEvent){X=x;Y=y;Z=z;}publicKinectCursorEventArgs(RoutedEventroutedEvent,Pointpoint):base(routedEvent){X=point.X;Y=point.Y;}publicKinectCursorEventArgs(RoutedEventroutedEvent,Pointpoint,doublez):base(routedEvent){X=point.X;Y=point.Y;Z=z;}publicKinectCursorEventArgs(RoutedEventroutedEvent,objectsource):base(routedEvent,source){}publicKinectCursorEventArgs(RoutedEventroutedEvent,objectsource,doublex,doubley,doublez):base(routedEvent,source){X=x;Y=y;Z=z;}publicKinectCursorEventArgs(RoutedEventroutedEvent,objectsource,Pointpoint):base(routedEvent,source){X=point.X;Y=point.Y;}publicKinectCursorEventArgs(RoutedEventroutedEvent,objectsource,Pointpoint,doublez):base(routedEvent,source){X=point.X;Y=point.Y;Z=z;}接下来,要在KinectInput类中创建事件来将消息从KinectCursorManager中传递到可视化控件中去。这些事件传递的数据类型为KinectCursorEventArgs类型。在KinectInput类中添加一个KinectCursorEventHandler的代理类型:(1)添加一个静态的routedevent声明。(2)添加KinectCursorEnter,KinectCursorLeave,KinectCursorMove,KinectCursorActive和KinectCursorDeactivated事件的add和remove方法。下面的代码展示了三个和cursor相关的事件,其他的如KinectCursorActivated和KinectCursorDeactivated事件和这个结构相同:publicdelegatevoidKinectCursorEventHandler(objectsender,KinectCursorEventArgse);publicstaticclassKinectInput{publicstaticreadonlyRoutedEventKinectCursorEnterEvent=EventManager.RegisterRoutedEvent(KinectCursorEnter,RoutingStrategy.Bubble,typeof(KinectCursorEventHandler),typeof(KinectInput));publicstaticvoidAddKinectCursorEnterHandler(DependencyObjecto,KinectCursorEventHandlerhandler){((UIElement)o).AddHandler(KinectCursorEnterEvent,handler);}publicstaticvoidRemoveKinectCursorEnterHandler(DependencyObjecto,KinectCursorEventHandlerhandler){((UIElement)o).RemoveHandler(KinectCursorEnterEvent,handler);}publicstaticreadonlyRoutedEventKinectCursorLeaveEvent=EventManager.RegisterRoutedEvent(KinectCursorLeave,RoutingStrategy.Bubble,typeof(KinectCursorEventHandler),typeof(KinectInput));publicstaticvoidAddKinectCursorLeaveHandler(DependencyObjecto,KinectCursorEventHandlerhandler){((UIElement)o).AddHandler(KinectCursorEnterEvent,handler);}publicstaticvoidRemoveKinectCursorLeaveHandler(DependencyObjecto,KinectCursorEventHandlerhandler){((UIElement)o).RemoveHandler(KinectCursorEnterEvent,handler);}}注意到以上代码中没有声明任何GUI编程中的Click事件。这是因为在设计控件类库时,Kinect中并没有点击事件,相反Kinect中两个重要的行为是enter和leave。手势图标可能会移入和移出某一个可视化控件的有效区域。如果要实现普通GUI控件的点击效果的话,必须在Kinect中对这一事件进行模拟,因为Kinect原生并不支持点击这一行为。CursorAdorner类用来保存用户手势图标可视化元素,它继承自WPF的Adorner类型。之所以使用这个类型是因为它有一个特点就是总是在其他元素之上绘制,这在我们的项目中非常有用,因为我们不希望我们的光标会被其他元素遮挡住。代码如下所示,我们默认的adorner对象将绘制一个默认的可视化元素来代表光标,当然也可以传递一个自定义的可视化元素。publicclassCursorAdorner:Adorner{privatereadonlyUIElement_adorningElement;privateVisualCollection_visualChildren;privateCanvas_cursorCanvas;protectedFrameworkElement_cursor;StroyBoard_gradientStopAnimationStoryboard;readonlystaticColor_backColor=Colors.White;readonlystaticColor_foreColor=Colors.Gray;publicCursorAdorner(FrameworkElementadorningElement):base(adorningElement){this._adorningElement=adorningElement;CreateCursorAdorner();this.IsHitTestVisible=false;}publicCursorAdorner(FrameworkElementadorningElement,FrameworkElementinnerCursor):base(adorningElement){this._adorningElement=adorningElement;CreateCursorAdorner(innerCursor);this.IsHitTestVisible=false;}publicFrameworkElementCursorVisual{get{return_cursor;}}publicvoidCreateCursorAdorner(){varinnerCursor=CreateCursor();CreateCursorAdorner(innerCursor);}protectedFrameworkElementCreateCursor(){varbrush=newLinearGradientBrush();brush.EndPoint=newPoint(0,1);brush.StartPoint=newPoint(0,0);brush.GradientStops.Add(newGradientStop(_backColor,1));brush.GradientStops.Add(newGradientStop
本文标题:kinect基本手势识别
链接地址:https://www.777doc.com/doc-2882901 .html