我是Kinect和VS Development的新手,我使用的是Windows Kinect Quickstart Series,但不幸的是,它适用于Kinect SDK v1.00。
我卡在了KinectColorView的使用上,我不能继续(我已经使用Googlin了2天了)。我也在StackOverflow上发现了这个非常相似的问题:Using KinectColorViewer in SDK1.5但无法解决我的问题。我知道我很亲密,但我需要帮助。
问题是:我无法让我的KinectColorViewer工作。
我将它添加到XAML设计器中,但似乎我无法将其绑定到SensorManager。 这是我的XAML代码:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WpfViewers="clr-namespace:Microsoft.Samples.Kinect.WpfViewers;assembly=Microsoft.Samples.Kinect.WpfViewers" xmlns:Toolkit="clr-namespace:Microsoft.Kinect.Toolkit;assembly=Microsoft.Kinect.Toolkit" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" x:Class="KinectSetupDev.MainWindow"
Title="MainWindow" Height="768" Width="1024" Loaded="Window_Loaded_1" Closed="Window_Closed_1">
<Grid HorizontalAlignment="Left" Height="736" VerticalAlignment="Top" Width="1012" Margin="2,2,0,0">
<TextBlock x:Name="tbMessages" HorizontalAlignment="Left" Height="60" Margin="10,662,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="992"/>
<WpfViewers:KinectColorViewer x:Name="KinectColorViewer" KinectSensorManager="{Binding KinectSensorManager}" HorizontalAlignment="Left" Height="240" Margin="608,27,0,0" VerticalAlignment="Top" Width="320" BorderThickness="1" BorderBrush="Black"/>
</Grid>
</Window>
没有关于XAML代码的报告,除了我必须添加块
"KinectSensorManager="{Binding KinectSensorManager}"
通过编写KinectColorViewer项目中的,因为我无法通过XAML设计器的GUI找到解决方法(所以我对它的可行性有一些疑问)。
这是我的代码隐藏(我几乎完全复制了问题:Using KinectColorViewer in SDK1.5所以我无法理解为什么它不起作用!! )
namespace KinectSetupDev
{
public partial class MainWindow : Window
{
// Automatically finds a Kinect for you.
private readonly KinectSensorChooser sensorChooser = new KinectSensorChooser();
public KinectSensorManager KinectSensorManager01 { get; private set; }
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private void Window_Loaded_1(object sender, RoutedEventArgs e)
{
// Initialize the Kinect sensor manager.
KinectSensorManager01 = new KinectSensorManager();
KinectSensorManager01.KinectSensorChanged += this.KinectSensorChanged;
// Locate an available sensor.
sensorChooser.Start();
// Bind chooser's sensor value to the local sensor manager.
var kinectSensorBinding = new Binding("Kinect") { Source = this.sensorChooser };
BindingOperations.SetBinding(this.KinectSensorManager01, KinectSensorManager.KinectSensorProperty, kinectSensorBinding);
}
private void Window_Closed_1(object sender, EventArgs e)
{
UninitializeKinectServices(KinectSensorManager01.KinectSensor);
}
#region Kinect Discovery & Setup
private void KinectSensorChanged(object sender, KinectSensorManagerEventArgs<KinectSensor> args)
{
if (null != args.OldValue)
UninitializeKinectServices(args.OldValue);
if (null != args.NewValue)
InitializeKinectServices(KinectSensorManager01, args.NewValue);
}
// Kinect enabled apps should customize which Kinect services it initializes here.
private void InitializeKinectServices(KinectSensorManager kinectSensorManager, KinectSensor sensor)
{
// Application should enable all streams first.
kinectSensorManager.ColorStreamEnabled = true;
kinectSensorManager.DepthStreamEnabled = true;
kinectSensorManager.SkeletonStreamEnabled = true;
// Start the sensor!
try
{
sensor.Start();
sensorChooser.Kinect.ElevationAngle = 10;
tbMessages.Text = "Kinect Started";
}
catch (System.IO.IOException)
{
sensor = null;
tbMessages.Text = "Kinect Not Started" + "\r";
}
}
// Kinect enabled apps should uninitialize all Kinect services that were initialized in InitializeKinectServices() here.
private void UninitializeKinectServices(KinectSensor sensor)
{
if (sensor != null)
{
if (sensor.IsRunning)
{
sensorChooser.Kinect.ElevationAngle = 0;
sensor.Stop();
sensor.AudioSource.Stop();
}
}
}
#endregion Kinect Discovery & Setup
}
}
我尝试在构造函数中添加行DataContext = this;
,但它不起作用。
应用程序运行,我的Kinect启动但KinectColorViewer没有显示任何内容。
此外,任何人都可以区分 sensor.SkeletonStream.Enable();
和 kinectSensorManager.SkeletonStreamEnabled = true;
??
答案 0 :(得分:3)
在您的XAML中绑定到KinectSensorManager
,该KinectSensorManager01
不存在。您在代码中将其称为sensor.SkeletonStream.Enabled()
,因此您需要在XAML中正确反映它。
这可能会解决它。但我看到的另一件事是你至少以3种不同的方式访问传感器。这就是你的第二个问题。
你正在对kinectSensorManager.SkeletonStreamEnabled = true
和KinectSensorManager
做同样的事情,你只是以不同的方式去做。 InitializeKinectServer
是一个围绕Kinect硬件的数据模型,它可以为您管理许多平凡的小事。如果您打算使用它(我个人一直都在这样做),那么您应该始终使用它来访问硬件。这将确保您的参考永远不会失去同步。
因此,在您的sensor.Start()
函数中,您不希望使用sensorChooser.Kinect.ElevationAngle
和KinectSensorManager
。您希望使用相应的<Window x:Class="SimpleKinectStart.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewer="clr-namespace:Microsoft.Samples.Kinect.WpfViewers;assembly=Microsoft.Samples.Kinect.WpfViewers"
Title="MainWindow" Height="350" Width="525">
<Grid>
<viewer:KinectColorViewer KinectSensorManager="{Binding KinectSensorManager}" />
</Grid>
</Window>
来电。
这是一个快速而又脏的应用程序,只显示KinectColorChooser:
MainWindow.xaml
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using Microsoft.Kinect;
using Microsoft.Kinect.Toolkit;
using Microsoft.Samples.Kinect.WpfViewers;
namespace SimpleKinectStart
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private readonly KinectSensorChooser _sensorChooser = new KinectSensorChooser();
public MainWindow()
{
InitializeComponent();
DataContext = this;
if (DesignerProperties.GetIsInDesignMode(this))
{
// do something special, only for design mode
}
else
{
KinectSensorManager = new KinectSensorManager();
KinectSensorManager.KinectSensorChanged += OnKinectSensorChanged;
_sensorChooser.Start();
if (_sensorChooser.Kinect == null)
{
MessageBox.Show("Unable to detect an available Kinect Sensor");
Application.Current.Shutdown();
}
// Bind the KinectSensor from the sensorChooser to the KinectSensor on the KinectSensorManager
var kinectSensorBinding = new Binding("Kinect") { Source = _sensorChooser };
BindingOperations.SetBinding(this.KinectSensorManager, KinectSensorManager.KinectSensorProperty, kinectSensorBinding);
}
}
#region Kinect Discovery & Setup
private void OnKinectSensorChanged(object sender, KinectSensorManagerEventArgs<KinectSensor> args)
{
if (null != args.OldValue)
UninitializeKinectServices(args.OldValue);
if (null != args.NewValue)
InitializeKinectServices(KinectSensorManager, args.NewValue);
}
/// <summary>
/// Initialize Kinect based services.
/// </summary>
/// <param name="kinectSensorManager"></param>
/// <param name="sensor"></param>
private void InitializeKinectServices(KinectSensorManager kinectSensorManager, KinectSensor sensor)
{
// configure the color stream
kinectSensorManager.ColorFormat = ColorImageFormat.RgbResolution640x480Fps30;
kinectSensorManager.ColorStreamEnabled = true;
// configure the depth stream
kinectSensorManager.DepthStreamEnabled = true;
kinectSensorManager.TransformSmoothParameters =
new TransformSmoothParameters
{
// as the smoothing value is increased responsiveness to the raw data
// decreases; therefore, increased smoothing leads to increased latency.
Smoothing = 0.5f,
// higher value corrects toward the raw data more quickly,
// a lower value corrects more slowly and appears smoother.
Correction = 0.5f,
// number of frames to predict into the future.
Prediction = 0.5f,
// determines how aggressively to remove jitter from the raw data.
JitterRadius = 0.05f,
// maximum radius (in meters) that filtered positions can deviate from raw data.
MaxDeviationRadius = 0.04f
};
// configure the skeleton stream
kinectSensorManager.SkeletonStreamEnabled = true;
// enable the sensor
kinectSensorManager.KinectSensorEnabled = true;
}
/// <summary>
/// Uninitialize all Kinect services that were initialized in InitializeKinectServices.
/// </summary>
/// <param name="sensor"></param>
private void UninitializeKinectServices(KinectSensor sensor)
{
// do what needs to be done
}
#endregion Kinect Discovery & Setup
#region Properties
public KinectSensorManager KinectSensorManager { get; private set; }
#endregion Properties
}
}
MainWindow.xaml.cs
KinectSensorManager
使用kinectSensorManager.ElevationAngle
时,您总是希望尽可能使用传感器管理器提供的包装。因此,您希望在init函数中使用KinectSensorManager.ElevationAngle
,或在其他地方使用UninitializeKinectServices
(注意本地调用与全局调用之间的差异)。这允许传感器管理器尝试执行您所要求的操作,并在需要时优雅地失败。
在KinectSensorChooser
功能中,您只能直接处理传感器。当您点击此功能时,null
选择了新的Kinect或丢失了它并将传感器设置为KinectSensorManager
。您正在处理此函数中的旧传感器值,清理曾经链接到它的服务。您对null
的任何引用都将是新传感器或{{1}}引用。
答案 1 :(得分:0)
我手动添加了Path属性,它适用于我:
<WpfViewers:KinectColorViewer HorizontalAlignment="Left" Height="221" Margin="75,84,0,0" VerticalAlignment="Top" Width="372" Kinect="{Binding ElementName=kinectSensorChooser1, Mode=OneWay,Path=Kinect}"/>