簡體   English   中英

WPF應用程序非常慢-Kinect SDK 1.7

[英]WPF application very slow - Kinect SDK 1.7

我有一個Kinect的簡單應用程序,但它似乎消耗了大量資源。 它正常工作1-2分鍾,然后滯后變得難以忍受。

這是我的配置:

英特爾酷睿i3 CPU M330 2.13 GHz

4 GB內存

ATI Radeon HD 4570

這是應用程序窗口的代碼:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;

    }

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {

        this.WindowState = System.Windows.WindowState.Maximized;
    }

    private void StopKinect(KinectSensor sensor)
    {
        if (sensor != null)
        {
            if (sensor.IsRunning)
            {
                //stop sensor 
                sensor.Stop();

                //stop audio if not null
                if (sensor.AudioSource != null)
                {
                    sensor.AudioSource.Stop();
                }


            }
        }
    }

    private void Window_Closing_1(object sender, System.ComponentModel.CancelEventArgs e)
    {
        StopKinect(Generics.GlobalKinectSensorChooser.Kinect);
    }
}

這是主菜單(第一個屏幕)的代碼:

public partial class MainMenu : Page
{
    #region "Kinect"
    private KinectSensorChooser sensorChooser;
    #endregion

    public MainMenu()
    {
        this.InitializeComponent();
        if (Generics.GlobalKinectSensorChooser == null)
        {
            // initialize the sensor chooser and UI
            this.sensorChooser = new KinectSensorChooser();
            this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged;
            this.sensorChooserUi.KinectSensorChooser = this.sensorChooser;
            this.sensorChooser.Start();
            Generics.GlobalKinectSensorChooser = this.sensorChooser;
        }
        else
        {   // initialize the sensor chooser and UI 
            this.sensorChooser = new KinectSensorChooser();
            this.sensorChooser = Generics.GlobalKinectSensorChooser;
            this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged;
            this.sensorChooserUi.KinectSensorChooser = sensorChooser;
        }

        // Bind the sensor chooser's current sensor to the KinectRegion
        var regionSensorBinding = new Binding("Kinect") { Source = this.sensorChooser };
        BindingOperations.SetBinding(this.kinectRegion, KinectRegion.KinectSensorProperty, regionSensorBinding);

    }

    private void SensorChooserOnKinectChanged(object sender, KinectChangedEventArgs args)
    {
        bool error = false;
        if (args.OldSensor != null)
        {
            try
            {
                args.OldSensor.DepthStream.Range = DepthRange.Default;
                args.OldSensor.SkeletonStream.EnableTrackingInNearRange = false;
                args.OldSensor.DepthStream.Disable();
                args.OldSensor.SkeletonStream.Disable();

                args.OldSensor.ColorStream.Disable();
            }
            catch (InvalidOperationException)
            {
                // KinectSensor might enter an invalid state while enabling/disabling streams or stream features.
                // E.g.: sensor might be abruptly unplugged.
                error = true;
            }
        }

        if (args.NewSensor != null)
        {
            try
            {
                args.NewSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
                args.NewSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
                args.NewSensor.SkeletonStream.Enable();
            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (!error)
            kinectRegion.KinectSensor = args.NewSensor;
    }

    private void Screen1ButtonOnClick(object sender, RoutedEventArgs e)
    {
        this.sensorChooser.KinectChanged -= SensorChooserOnKinectChanged;
        (Application.Current.MainWindow.FindName("_mainFrame") as Frame).Source = new Uri("Depth.xaml", UriKind.Relative);
    }     
}

屏幕1的代碼如下:

public partial class Depth : Page
{
    #region "Kinect"
    private KinectSensorChooser sensorChooser;
    #endregion

    const float MaxDepthDistance = 4095; // max value returned
    const float MinDepthDistance = 850; // min value returned
    const float MaxDepthDistanceOffset = MaxDepthDistance - MinDepthDistance;

    public Depth()
    {

        this.InitializeComponent();
        // initialize the sensor chooser and UI
        this.sensorChooser = new KinectSensorChooser();
        //Assign the sensor chooser with the sensor chooser from the mainwindow. 
        //We are reusing the sensorchoosing declared in the first window that can in contact with kinect
        this.sensorChooser = Generics.GlobalKinectSensorChooser;
        //subscribe to the sensorChooserOnKinectChanged event
        this.sensorChooser.KinectChanged += SensorChooserOnKinectChanged;
        //Assign Kinect Sensorchooser to the sensorchooser we got from our static class
        this.sensorChooserUi.KinectSensorChooser = sensorChooser;
        // Bind the sensor chooser's current sensor to the KinectRegion
        var regionSensorBinding = new Binding("Kinect") { Source = this.sensorChooser };
        BindingOperations.SetBinding(this.kinectRegion, KinectRegion.KinectSensorProperty, regionSensorBinding);
    }

    private void SensorChooserOnKinectChanged(object sender, KinectChangedEventArgs args)
    {
        bool error = false;
        if (args.OldSensor != null)
        {
            try
            {
                args.OldSensor.DepthStream.Range = DepthRange.Default;
                args.OldSensor.SkeletonStream.EnableTrackingInNearRange = false;
                args.OldSensor.DepthStream.Disable();
                args.OldSensor.SkeletonStream.Disable();

                args.OldSensor.ColorStream.Disable();
            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (args.NewSensor != null)
        {
            try
            {
                args.NewSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
                args.NewSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
                args.NewSensor.SkeletonStream.Enable();

            }
            catch (InvalidOperationException)
            {
                error = true;
            }
        }

        if (!error)
            kinectRegion.KinectSensor = args.NewSensor;
    }


    private void MenuButtonOnClick(object sender, RoutedEventArgs e)
    {
        //Unsubscribe to the sensorchooser's  event SensorChooseronkinectChanged
        this.sensorChooser.KinectChanged -= SensorChooserOnKinectChanged;
        (Application.Current.MainWindow.FindName("_mainFrame") as Frame).Source = new Uri("MainScreen.xaml", UriKind.Relative);
    }
}

還有更多屏幕,我選擇了此屏幕,並在其中使用WpfViewers的KinectDepthViewer。 該屏幕具有最差的延遲,應用程序幾乎立即無法使用。 我僅有按鈕的其他屏幕開始時沒有滯后,但使用2-3分鍾后便會滯后。

我不知道我在初始化時做錯了什么。 我希望有人能提供一些建議。 我讀過,即使在較弱的配置下,人們也不會遇到開發問題,所以我希望不是因為這個原因。

謝謝!

您的圖形適配器建議您使用的是筆記本計算機。 盡管您的代碼中可能有一些需要改進的地方,但我確實認為問題出在您的硬件上。 具有您列出的規格的筆記本電腦在運行CPU時將遇到麻煩,而您要嘗試使用Kinect時會遇到麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM