将x,y,z坐标打印到WPF中的数据网格? [英] Printing out x, y, z coordinates to a datagrid in WPF?

查看:95
本文介绍了将x,y,z坐标打印到WPF中的数据网格?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 


我想知道如何将关节x,y,z坐标打印到WPF应用程序中的数据网格。或者数据网格甚至是我"收集"的最佳方式。数据?我有一个班级"坐标"和一个mainwindow.xaml已经将datagrid添加到
主窗口。当我的mainwindow.xaml.cs已经有videostream和skeletonstrem时,将它作为一个单独的类是否很好,或者我应该将它实现到主窗口?这是我的mainwindow.xaml.cs和coordinates.cs: 



Coordinates.cs


使用System;

使用System.Collections.Generic;

使用System.Linq;

使用System.Text;

使用Microsoft.Kinect;





名称空间FysioKinect1

{

   班级坐标

    {

$


        private Skeleton [] skeletons = null;

        public float LeftKnee {get;组; }¥b $ b        public float RightKnee {get;组; }


$
private void SensorSkeletonFrameReady(object sender,SkeletonFrameReadyEventArgs e)

        {

            //访问骨架框架
           使用(SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())

            {

                if(skeletonFrame!= null)

                {

                    if(this.skeletons == null)

                    {

                        //分配骷髅数组

                        this.skeletons = new Skeleton [skeletonFrame.SkeletonArrayLength];

                    }




                    //从此框架复制骨架

                    skeletonFrame.CopySkeletonDataTo(this.skeletons);



$
                    //查找第一个跟踪的骨架,如果有的话,
                   骨架骨架= this.skeletons.Where(S => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();





                    if(skeleton!= null)

                    {

                        //获得左膝关节;如果被跟踪,请打印其位置

                       关节j = skeleton.Joints [JointType.KneeLeft];

                       关节k = skeleton.Joints [JointType.KneeRight];



$
                        if(j.TrackingState == JointTrackingState.Tracked)

                        {

                            //当然我不能将它打印到控制台,但这是一个有效的控制台应用程序。

                            //Console.WriteLine("Left knee:" + j.Position.X +"," + j.Position.Y +"," + j.Position.Z);

                        }¥b $ b                        if(k.TrackingState == JointTrackingState.Tracked)

                        {

                            //Console.WriteLine("Right knee:" + k.Position.X +"," + k.Position.Y +"," + k.Position.Z);

                        }¥b $ b                    }¥b $ b                }¥b $ b            }¥b $ b        }¥b $ b    }
}




Mainwindow.xaml.cs


使用System;

使用System.Collections.Generic;

使用System.Linq;

使用System.Text ;

使用System.Windows;

使用System.Windows.Controls;

使用System.Windows.Data;

使用System.Windows.Documents;

使用System.Windows.Input;

使用System.Windows.Media;

使用System。 Windows.Media.Imaging;

使用System.Windows.Navigation;

使用System.Windows.Shapes;

使用Microsoft.Kinect; < br $>



名称空间KinectExample1

{

  &NBSP; ///< summary>

  &NBSP; /// MainWindow.xaml的交互逻辑

  &NBSP; ///< / summary>

  &NBSP; public partial class MainWindow:Window

  &NBSP; {

  &NBSP; &NBSP; &NBSP; public MainWindow()

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; InitializeComponent();

  &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; bool closing = false;

  &NBSP; &NBSP; &NBSP; const int skeletonCount = 6;

  &NBSP; &NBSP; &NBSP; Skeleton [] allSkeletons = new Skeleton [skeletonCount];



$
  &NBSP; &NBSP; &NBSP; private void Window_Loaded(object sender,RoutedEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; kinectSensorChooser1.KinectSensorChanged + = new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged);

  &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; void kinectSensorChooser1_KinectSensorChanged(object sender,DependencyPropertyChangedEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; KinectSensor oldSensor =(KinectSensor)e.OldValue;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; StopKinect(oldSensor);



$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; KinectSensor newSensor =(KinectSensor)e.NewValue;




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; var parameters = new TransformSmoothParameters

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;平滑= 0.3f,

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;更正= 0.0f,

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;预测= 0.0f,

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; JitterRadius = 1.0f,

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; MaxDeviationRadius = 0.5f

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; newSensor.AllFramesReady + =新的EventHandler< AllFramesReadyEventArgs>(_ sensor_AllFramesReady);





&NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; newSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; newSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; newSensor.SkeletonStream.Enable();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; //newSensor.SkeletonStream.Enable(parameters);



$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;试试
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; newSensor.Start();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; catch(System.IO.IOException)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; kinectSensorChooser1.AppConflictOccurred();



$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; void _sensor_AllFramesReady(object sender,AllFramesReadyEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(closing)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;返回;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; Skeleton first = GetFirstSkeleton(e);



$
  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(first == null)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;返回;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }




}


  &NBSP; &NBSP; &NBSP; public Skeleton GetFirstSkeleton(AllFramesReadyEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;使用(SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame())

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(skeletonFrameData == null)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;返回null;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; skeletonFrameData.CopySkeletonDataTo(allSkeletons);



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;骨架第一=(从s中allSkeletons

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;其中s.TrackingState == SkeletonTrackingState.Tracked

&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP;&NBSP ;选择s).FirstOrDefault();



  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;先退货;

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }




  &NBSP; &NBSP; &NBSP; void StopKinect(KinectSensor传感器)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; if(sensor!= null)

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; sensor.Stop();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; sensor.AudioSource.Stop();

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; &NBSP;   

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void Window_Closing(object sender,System.ComponentModel.CancelEventArgs e)

  &NBSP; &NBSP; &NBSP; {

  &NBSP; &NBSP; &NBSP; &NBSP; &NBSP; StopKinect(kinectSensorChooser1.Kinect);

  &NBSP; &NBSP; &NBSP; }


  &NBSP; &NBSP; &NBSP; private void dataGrid1_SelectionChanged(object sender,SelectionChangedEventArgs e)

  &NBSP; &NBSP; &NBSP; {

$


  &NBSP; &NBSP; &NBSP; }¥b $ b  &NBSP; }
}



提前致谢!












解决方案

< blockquote>

您的问题更适合WPF或XAML数据绑定论坛。就Kinect SDK而言,如果您从各种Skeleton类中获取数据,那么您正在寻找的功能将特定于您选择的编程
语言/环境。你看过BindingList类了吗?


BindingList< T>班级$
http://msdn.microsoft.com/en-us/library /ms132679.aspx


您可以将数据转储到调试控制台,文本框,文件,数据库等任何位置。我认为更关键的问题是您为什么要这样做或者数据需要什么?如果你想"保存"要分析的数据,更适用的位置
可能是文件或数据库。这些是其他论坛的主题,但您需要考虑的事项。


Hi, 

I´m wondering how i could print out a joints x, y, z coordinates to a datagrid in a WPF application. Or is a datagrid even the best way for me to "collect" the data? i have a class "coordinates" and a mainwindow.xaml and already added the datagrid to the mainwindow. Is it good to have it as a separate class when my mainwindow.xaml.cs already has videostream and skeletonstrem, or should i implement it into the mainwindow? Here´s my mainwindow.xaml.cs and coordinates.cs: 

Coordinates.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Kinect;


namespace FysioKinect1
{
    class Coordinates
    {


        private Skeleton[] skeletons = null;
        public float LeftKnee { get; set; }
        public float RightKnee { get; set; }


private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            // Access the skeleton frame
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    if (this.skeletons == null)
                    {
                        // Allocate array of skeletons
                        this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength];
                    }


                    // Copy skeletons from this frame
                    skeletonFrame.CopySkeletonDataTo(this.skeletons);


                    // Find first tracked skeleton, if any
                    Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();


                    if (skeleton != null)
                    {
                        // Obtain the left knee joint; if tracked, print its position
                        Joint j = skeleton.Joints[JointType.KneeLeft];
                        Joint k = skeleton.Joints[JointType.KneeRight];


                        if (j.TrackingState == JointTrackingState.Tracked)
                        {
                            // ofcourse i cant print it out to console, but this is a working console app.
                            //Console.WriteLine("Left knee: " + j.Position.X + ", " + j.Position.Y + ", " + j.Position.Z);
                        }
                        if (k.TrackingState == JointTrackingState.Tracked)
                        {
                            //Console.WriteLine("Right knee: " + k.Position.X + ", " + k.Position.Y + ", " + k.Position.Z);
                        }
                    }
                }
            }
        }
    }
}


Mainwindow.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Kinect;


namespace KinectExample1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }


        bool closing = false;
        const int skeletonCount = 6;
        Skeleton[] allSkeletons = new Skeleton[skeletonCount];


        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            kinectSensorChooser1.KinectSensorChanged += new DependencyPropertyChangedEventHandler(kinectSensorChooser1_KinectSensorChanged);
        }


        void kinectSensorChooser1_KinectSensorChanged(object sender, DependencyPropertyChangedEventArgs e)
        {
            KinectSensor oldSensor = (KinectSensor)e.OldValue;
            StopKinect(oldSensor);


            KinectSensor newSensor = (KinectSensor)e.NewValue;


            var parameters = new TransformSmoothParameters
            {
                Smoothing = 0.3f,
                Correction = 0.0f,
                Prediction = 0.0f,
                JitterRadius = 1.0f,
                MaxDeviationRadius = 0.5f
            };


            newSensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(_sensor_AllFramesReady);


            newSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
            newSensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
            newSensor.SkeletonStream.Enable();
            //newSensor.SkeletonStream.Enable(parameters);


            try
            {
                newSensor.Start();
            }
            catch (System.IO.IOException)
            {
                kinectSensorChooser1.AppConflictOccurred();


            }
        }


        void _sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
        {
            if (closing)
            {
                return;
            }


            Skeleton first = GetFirstSkeleton(e);


            if (first == null)
            {
                return;
            }


}

        public Skeleton GetFirstSkeleton(AllFramesReadyEventArgs e)
        {
            using (SkeletonFrame skeletonFrameData = e.OpenSkeletonFrame())
            {
                if (skeletonFrameData == null)
                {
                    return null;
                }

                skeletonFrameData.CopySkeletonDataTo(allSkeletons);

                Skeleton first = (from s in allSkeletons
                                  where s.TrackingState == SkeletonTrackingState.Tracked
                                  select s).FirstOrDefault();

                return first;
            }
        }


        void StopKinect(KinectSensor sensor)
        {
            if (sensor != null)
            {
                sensor.Stop();
                sensor.AudioSource.Stop();
                    
            }
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            StopKinect(kinectSensorChooser1.Kinect);
        }

        private void dataGrid1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {


        }
    }
}

Thanks in advance!

解决方案

Your question would be better suited for a WPF or XAML data binding forum. As far as the Kinect SDK goes, if you are getting the data from the various Skeleton classes, then the functionality you are looking for is going to be specific to your programming language/environment of choice. Have you looked at the BindingList class?

BindingList<T> Class
http://msdn.microsoft.com/en-us/library/ms132679.aspx

You can dump the data anywhere debug console, textbox, file, database, etc. I think a more crucial question is what is why you are doing this or what is the need for the data? If you are trying to "save" the data for analysis, a more applicable location might be a file or database. These are topics for other forums but something to consider for what you are trying to do.


这篇关于将x,y,z坐标打印到WPF中的数据网格?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆