1、#1BA78B HorizontalAlignment=Left Margin=240,41,0,39 Stroke=Black Width=10 RenderTransformOrigin=0.5,0 TransformGroupScaleTransform/SkewTransform/RotateTransform Angle=Binding BeamAngle/TranslateTransform/TransformGroup/Rectangle.RenderTransform/Rectangle 上图是程序的UI界面。后台逻辑代码和之前的例子大部分都是相同的。首先实例化一个Kinect
2、AudioSource对象,然后将主窗体的DataContext赋值给本身。将BeamAngleMode设置为Adaptive,使得能够自动追踪说话者的声音。我们需要编写KinectAudioSource对象的BeamChanged事件对应的处理方法。当用户的说话时,位置发生变化时就会触发该事件。我们需要创建一个名为BeamAngle的属性,使得矩形的RotateTransform可以绑定这个属性。public partial class MainWindow : Window, INotifyPropertyChanged public MainWindow() InitializeComp
3、onent(); this.DataContext = this; this.Loaded += delegate ListenForBeamChanges(); ; private KinectAudioSource CreateAudioSource() var source = KinectSensor.KinectSensors0.AudioSource; source.NoiseSuppression = true; source.AutomaticGainControlEnabled = true; source.BeamAngleMode = BeamAngleMode.Adap
4、tive; return source; private void ListenForBeamChanges() KinectSensor.KinectSensors0.Start(); var audioSource = CreateAudioSource(); audioSource.BeamAngleChanged += audioSource_BeamAngleChanged; audioSource.Start(); public event PropertyChangedEventHandler PropertyChanged; private void OnPropertyCha
5、nged(string propName) if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propName); private double _beamAngle; public double BeamAngle get return _beamAngle; set _beamAngle = value; OnPropertyChanged(BeamAngle); 以上代码中,还需要对BeamChanged事件编写对应的处理方法。每次当波束的方向发生改变时,就更改BeamAngle
6、的属性。SDK中使用弧度表示角度。所以在事件处理方法中我们需要将弧度换成度。为了能达到说话者移到左边,矩形条也能够向左边移动的效果,我们需要将角度乘以一个-1。代码如下:void audioSource_BeamAngleChanged(object sender, BeamAngleChangedEventArgs e) BeamAngle = -1 * e.Angle; 运行程序,然后在房间里不同地方走动,可以看到矩形条会根据你的位置左右摆动。2. 语音命令识别 在这一部分,我们将会结合KinectAudioSource和SpeechRecognitionEngine来演示语音命令识别的强
7、大功能。为了展示语音命令能够和骨骼追踪高效结合,我们会使用语音命令向窗体上绘制图形,并使用命令移动这些图形到光标的位置。命令类似如下:Create a yellow circle, there.Create a cyan triangle, there.Put a magenta square, there.Create a blue diamond, there.Move that . there.Put that . there.Move that . below that.Move that . west of the diamond.Put a large green circle .
8、 there.程序界面大致如下:和之前的应用程序一样,首先创建一下项目的基本结构:1. 创建一个名为KinectPutThatThere的WPF项目。3. 将主窗体的名称改为“Put That There”4. 添加一个名为CrossHairs.xaml的用户自定义控件。 CrossHair用户控件简单的以十字光标形式显示当前用户右手的位置。下面的代码显示了这个自定义控件的XAML文件。注意到对象于容器有一定的偏移使得十字光标的中心能够处于Grid的零点。Grid Height=500.5,0.5Grid.RenderTransformRotateTransform/TranslateTran
9、sform X=-25 Y=/Grid.RenderTransform#FFF4F4F522,0,20,00,22,0,21 /Grid 在应用程序的主窗体中,将根节点从grid对象改为canvas对象。Canvas对象使得将十字光标使用动画滑动到手的位置比较容易。在主窗体上添加一个CrossHairs自定义控件。在下面的代码中,我们可以看到将Canvas对象嵌套在了一个Viewbox控件中。这是一个比较老的处理不同屏幕分辨率的技巧。ViewBox控件会自动的将内容进行缩放以适应实际屏幕的大小。设置MainWindows的背景色,并将Canvas的颜色设置为黑色。然后在Canvas的底部添加两
10、个标签。一个标签用来显示SpeechRecognitionEngine将要处理的语音指令,另一个标签显示匹配正确的置信度。CrossHair自定义控件绑定了HandTop和HandLeft属性。两个标签分别绑定了HypothesizedText和Confidence属性。Window x:Class=KinectPutThatThere.MainWindow xmlns= xmlns:x=local=clr-namespace:KinectPutThatThere Title=Put That There Background=ViewboxCanvas x:Name=MainStage He
11、ight=10801920 VerticalAlignment=Bottomlocal:CrossHairs Canvas.Top=Binding HandTop Canvas.Left=Binding HandLeft /Label Foreground=White Content=Binding HypothesizedText55 FontSize=32965115 Canvas.Top=1025GreenBinding Confidence1140/Canvas/Viewbox/Window 在后台逻辑代码中,让MainWindows对象实现INofityPropertyChanged事件并添加OnPropertyChanged帮助方法。我们将创建4个属性用来为前台UI界面进行绑定。 Window, INotifyPr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1