2

Kinect for windows(sdk 1.5)を使用するプロジェクトでKinectColorViewerを使用しようとしています。kinectエクスプローラーの例では、KinectColorViewerコンポーネントにバインドされたKinectSensorManagerコンポーネントがありました。xamlファイルには次のものがあります。

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

他のプロジェクトで同じコンセプトを再現するのに苦労しています。Microsoft.Kinect.ToolkitのKinectSensorChooser、KinectSensorChooserUI、およびMirosoft.Sampels.Kinect.wpfviewersKinectColorViewerを使用しました。colorViewerのKinectSensorManagerを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を使用した人はいますか?私たちが素晴らしいだろうと考えて...

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

しかし、私はまだカラーストリームを取得していません。

4

1 に答える 1

4

バインディングステートメントが正しくありません。「KinectSensorChooser.Kinect」は、KinectSensorChooserによって選択されたハードウェア(つまり、Kinect)への参照です。KinectSensorManagerではありません。

例が示すのと同じ方法で、KinectSensorManagerにバインドする必要があります。あなたがやろうとしている特別なことで、それを別の方法でバインドすることにつながるものはありますか?

メインクラスは次のようなものから始める必要があります。

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

次に、例に示すように、ビューからマネージャーにバインドできます。

コンストラクターに以下を追加して、DataContextも設定する必要があります。DataContext= this;

于 2012-09-26T21:15:51.530 に答える