2

私は Kinect と VS 開発に不慣れで、Windows Kinect クイックスタート シリーズを使用していましたが、残念ながら Kinect SDK v1.00 用でした。

KinectColorView の使用法に行き詰まってしまい、先に進めません (2 日間ググってみました)。この非常によく似た質問も見つかりました: Using KinectColorViewer in SDK1.5 here on StackOverflow ですが、私の問題を解決できませんでした。近くにいることは知っていますが、助けが必要です。

問題は、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}"

XAML デザイナーの GUI でこれを行う方法を見つけることができなかったので、KinectColorViewer アイテムに書き込みます (そのため、その実行可能性について疑問があります)。

これが私のコードビハインドです(私は質問によってほぼ完全にコピーしました:SDK1.5でKinectColorViewerを使用しているので、なぜそれが機能しないのか理解できません!!

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; ??

4

2 に答える 2

3

XAMLKinectSensorManagerでは、存在しない にバインドします。コード内で呼び出しているKinectSensorManager01ため、XAML に適切に反映する必要があります。

それはおそらくそれを修正します。しかし、私が見るもう 1 つのことは、少なくとも 3 つの異なる方法でセンサーにアクセスしていることです。これはあなたの2番目の質問になります。

sensor.SkeletonStream.Enabled()とで同じことをしていkinectSensorManager.SkeletonStreamEnabled = trueますが、別の方法で行っているだけです。はKinectSensorManager、多くのありふれた小さなことを管理する Kinect ハードウェアにラップされたデータ モデルです。それを使用する場合 (個人的には常に使用しています)、ハードウェアへのアクセスには常に使用する必要があります。これにより、参照が同期しなくなることがなくなります。

したがって、関数ではandInitializeKinectServerを使用したくありません。対応する呼び出しを使用したい。sensor.Start()sensorChooser.Kinect.ElevationAngleKinectSensorManager

以下は、KinectColorChooser だけを表示する簡単で汚いアプリケーションです。

MainWindow.xaml

<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>

MainWindow.xaml.cs

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
    }
}

KinectSensorManagerを使用するときは、可能な場合は常にセンサー マネージャーによって提供されるラッパーを使用する必要があります。kinectSensorManager.ElevationAngleそのため、init 関数または他の場所で使用することをお勧めしますKinectSensorManager.ElevationAngle(ローカル呼び出しとグローバル呼び出しの違いに注意してください)。これにより、センサー マネージャーは、要求されたとおりに試行し、必要に応じて正常に失敗することができます。

関数ではUninitializeKinectServices、センサーを直接扱うだけです。この機能をKinectSensorChooser押すと、新しい Kinect を選択したか、それを失ってセンサーを に設定しましたnull。この関数で古いセンサー値を処理し、かつてリンクされていたサービスをクリーンアップします。作成する参照はすべてKinectSensorManager、新しいセンサーまたはnull参照のいずれかになります。

于 2012-11-06T19:27:37.383 に答える
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}"/>
于 2012-11-11T18:54:32.720 に答える