kinect - 在SDK1.5中使用KinectColorViewer

标签 kinect kinect-sdk

我正在尝试在使用 Kinect for windows (sdk 1.5) 的项目中使用 KinectColorViewer。在 kinect 资源管理器示例中,KinectColorViewer 组件具有绑定(bind)的 KinectSensorManager 组件。在 xaml 文件中,我们有:

<kt:KinectColorViewer x:Name="ColorViewer" KinectSensorManager="{Binding KinectSensorManager}" CollectFrameRate="True" RetainImageOnSensorChange="True" />

我在其他项目中重现相同的概念时遇到很多麻烦。我使用了 Microsoft.Kinect.Toolkit 的 KinectSensorChooser、KinectSensorChooserUI 和 Mirosoft.Sampels.Kinect.wpfviewers KinectColorViewer。尝试将 colorViewer 的 KinectSensorManager 绑定(bind)到 UI 元素,然后进行操作。

<my:KinectColorViewer Width="200" Height="200" HorizontalAlignment="Left" Margin="198,12,0,0" Name="kinectColorViewer1" VerticalAlignment="Top" KinectSensorManager="{Binding ElementName=kinectSensorChooserUI1, Path=KinectSensorChooser.Kinect}" />

两次尝试均未成功。有人使用过新 SDK 中的 ColorViwer、DepthViwer 和 SkeletonViewer 吗?认为我们会很棒...

为了绑定(bind)KinectSensorManager,我在后端添加了以下代码:

public partial class MainWindow : Window
{
  public KinectSensorManager KinectSensorManager { get; set;}
  private void WindowLoaded(object sender, RoutedEventArgs e)
{
  KinectSensorManager = new KinectSensorManager();

  KinectSensorManager.KinectSensorChanged += new EventHandler<KinectSensorManagerEventArgs<KinectSensor>>(KinectSensorManager_KinectSensorChanged);

        // Look through all sensors and start the first connected one.
        // This requires that a Kinect is connected at the time of app startup.
        foreach (var potentialSensor in KinectSensor.KinectSensors)
        {
            if (potentialSensor.Status == KinectStatus.Connected)
            {
                this.sensor = potentialSensor;
                break;
            }
        }

        if (null != this.sensor)
        {
            // Turn on the skeleton stream to receive skeleton frames

            this.sensor.SkeletonStream.Enable();
            this.sensor.DepthStream.Enable();
            this.sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
            this.sensor.AllFramesReady += new System.EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
            this.sensor.SkeletonFrameReady += this.SensorSkeletonFrameReady;

            // Start the sensor!
            try
            {
                this.sensor.Start();
            }
            catch (IOException)
            {
                this.sensor = null;
            }

            var kinectSensorBinding = new Binding("KinectSensor") { Source = this.sensor };
            BindingOperations.SetBinding(this.KinectSensorManager, KinectSensorManager.KinectSensorProperty, kinectSensorBinding);

        }

        if (null == this.sensor)
        {
            this.statusBarText.Text = Properties.Resources.NoKinectReady;
        }

    }

和 Xaml 文件:

<kt:KinectColorViewer Width="191" Height="83" Grid.Column="3" KinectSensorManager="{Binding KinectSensorManager}" HorizontalAlignment="Left" Margin="17,236,0,0" Name="kinectColorViewer1" VerticalAlignment="Top" />

但我仍然没有得到任何颜色流。

最佳答案

您的绑定(bind)声明不正确。 “KinectSensorChooser.Kinect”是对 KinectSensorChooser 选择的硬件(即 Kinect)的引用 - 它不是 KinectSensorManager。

您应该按照示例所示的方式绑定(bind)到 KinectSensorManager。您是否正在尝试做一些特殊的事情来导致您以不同的方式绑定(bind)它?

你的主类应该这样开始:

// automatically finds a Kinect for you
private readonly KinectSensorChooser sensorChooser = new KinectSensorChooser();

// the bindable sensor property
public KinectSensorManager KinectSensorManager { get; private set; }

public MainViewModel()
{
    if (IsInDesignMode) {
        // load design mode only content
    }
    else
    {
        // initialize the Kinect sensor manager
        KinectSensorManager = new KinectSensorManager();
        KinectSensorManager.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.KinectSensorManager,
            KinectSensorManager.KinectSensorProperty,
            kinectSensorBinding);
    }
}

#region Kinect Discovery & Setup

private void KinectSensorChanged(object sender,
    KinectSensorManagerEventArgs<KinectSensor> args)
{
    if (null != args.OldValue)  
        UninitializeKinectServices(args.OldValue);

    if (null != args.NewValue)
        InitializeKinectServices(KinectSensorManager, 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.

    // configure the color stream
    kinectSensorManager.ColorFormat = 
        ColorImageFormat.RgbResolution640x480Fps30;
    kinectSensorManager.ColorStreamEnabled = true;

    // configure the depth stream
    kinectSensorManager.DepthStreamEnabled = true;

    kinectSensorManager.TransformSmoothParameters = 
        new TransformSmoothParameters
        {
            Smoothing = 0.5f,
            Correction = 0.5f,
            Prediction = 0.5f,
            JitterRadius = 0.05f,
            MaxDeviationRadius = 0.04f
        };

    // configure the skeleton stream
    sensor.SkeletonFrameReady += OnSkeletonFrameReady;
    kinectSensorManager.SkeletonStreamEnabled = true;
}

// Kinect enabled apps should uninitialize all Kinect services that were initialized in InitializeKinectServices() here.
private void UninitializeKinectServices(KinectSensor sensor)
{
    sensor.SkeletonFrameReady -= this.OnSkeletonFrameReady;
}

#endregion Kinect Discovery & Setup

然后,您可以从 View 绑定(bind)到管理器,如示例所示。

您还需要通过将以下内容放入构造函数中来设置 DataContext: 数据上下文 = this;

关于kinect - 在SDK1.5中使用KinectColorViewer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12609858/

相关文章:

c# - 在一台 PC 上使用多个 Kinect v2

c# - 如何将 Kinect 上的手波绑定(bind)到按键

c# - 微软 Kinect + Telldus Tellstick

java - 边界框无法正常工作 -/withkinect

wpf - 在颜色位置获取深度,Kinect SDK

c++ - Kinect for Windows v2 深度到彩色图像未对齐

c# - 如何在 C# wpf Kinect SDK 2.0 中获取滚动查看器中的缩放值?

c++ - Qt Creator - 设置架构标志

c# - Kinect 中的握把控制

image - Kinect:从 RGB 坐标转换为深度坐标