c# kinect三个流之骨骼流

骨骼流与以往的色彩与深度流不同,他需要下载一个辅助类库,下载完之后还要添加这个引用,再加using 。

这个代码是在原来彩色流的基础上写的。

1.首先准备骨骼流启动函数及相应的事件

2.准备wpf界面,添加20个小圆点并标记为不同的颜色

3.连接好设备,出发事件处理函数

4.骨骼点位置坐标的缩放

5.下载类库,添加引用

6.将骨骼点坐标映射到ellipse控件的left和top属性上

7.poly表示骨架线,遍历所有骨骼点并分类储存相应的点

8.运行程序


using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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;
using Coding4Fun.Kinect.Wpf;
namespace 骨骼追踪数据的处理方法
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        KinectSensor kinectSensor;
        private byte[] pixelData;
         Skeleton[] skeletonData;
        public MainWindow()
        {
            InitializeComponent();
        }


        
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            kinectSensor = (from sensor in KinectSensor.KinectSensors
                            where sensor.Status == //寻找设备
                                KinectStatus.Connected
                            select sensor).FirstOrDefault();


            kinectSensor = KinectSensor.KinectSensors[0];
            kinectSensor.SkeletonStream.Enable();
            kinectSensor.ColorStream.Enable();


       //   kinectSensor.ColorStream.Enable(ColorImageFormat.InfraredResolution640x480Fps30);//修改即可得到红外图//启动
            kinectSensor.ColorFrameReady += kinectSensor_ColorFrameReady;//调用函数
           // kinectSensor.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated;
            kinectSensor.SkeletonFrameReady += kinectSensor_SkeletonFrameReady;
            kinectSensor.Start();






        /*    foreach (Joint joint in skeleton.Joints)
            {
                Point jointPoint = GetDisplayPosition(joint);
                switch (joint.JointType)
                {
                    case JointType.Head:
                        SetPointPosition(headPoint, joint);
                        headPolyline.Points.Add(jointPoint);
                        break;
                        ....
                }
            }
         * */
        }




        private void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)//e是一个参数,前面是一个参数名称
        {
            using (ColorImageFrame imageFrame = e.OpenColorImageFrame())//调用方法
            {
                if (imageFrame != null)
                {
                    this.pixelData = new byte[imageFrame.PixelDataLength];//定义数组
                    imageFrame.CopyPixelDataTo(this.pixelData);//将数据复制到数组中
                    this.ColorImage.Source = BitmapSource.Create(imageFrame.Width, imageFrame.Height, 96, 96,
                        PixelFormats.Bgr32, null, pixelData, imageFrame.Width * imageFrame.BytesPerPixel);//创建bit。。。
                }
            }
        }


        private void kinectSensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame())
            {
                if (skeletonFrame != null)
                {
                    skeletonData = new Skeleton[kinectSensor.SkeletonStream.FrameSkeletonArrayLength];
                    skeletonFrame.CopySkeletonDataTo(this.skeletonData);
                    Skeleton skeleton = (from s in skeletonData where s.TrackingState == SkeletonTrackingState.Tracked select s).FirstOrDefault();
                    if (skeleton != null)
                    {
                        SetAllPointPosition(skeleton);
                    }
                }
            }
           
        }
         






       // Joint headJoint = (from j in skeleton.Joints where j.JointType == JointType.Head select j).FirstOrDefault();


        //为了将20 个点更好的显示出来,对position的x与y进行缩放
        private Point GetDisplayPosition(Joint joint)
        {
            var scaledJoint = joint.ScaleTo(640, 480);
            return new Point(scaledJoint.Position.X, scaledJoint.Position.Y);
        }


        //编写一个函数,将每个骨骼点转换后的坐标值分别映射到相应的控件属性上
        private void SetPointPosition(FrameworkElement ellipse, Joint joint)
        {
            var scaledJoint = joint.ScaleTo(640, 480);
            Canvas.SetLeft(ellipse, scaledJoint.Position.X);
            Canvas.SetTop(ellipse, scaledJoint.Position.Y);
            SkeletonCanvas.Children.Add(ellipse);
        }




        //使用polyline表示骨架线
        Polyline headPolyline = new Polyline();
        Polyline handleftPolyline = new Polyline();
        Polyline handrightPolyline = new Polyline();
        Polyline footleftPolyline = new Polyline();
        Polyline footrightPolyline = new Polyline();
        private void SetAllPointPosition(Skeleton skeleton)
        {
            SkeletonCanvas.Children.Clear();
            headPolyline.Points.Clear();
            handleftPolyline.Points.Clear();
            handrightPolyline.Points.Clear();
            footleftPolyline.Points.Clear();
            footrightPolyline.Points.Clear();
            //遍历所有骨骼点,并分类储存//哪里来的所有的骨骼点的代码
            foreach (Joint joint in skeleton.Joints)
            {
                Point jointPoint = GetDisplayPosition(joint);
                switch (joint.JointType)
                {
                    case JointType.Head:
                        SetPointPosition(headPoint, joint);
                        headPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.ShoulderCenter:
                        SetPointPosition(shouldercenterPoint, joint);
                        headPolyline.Points.Add(jointPoint);
                        handleftPolyline.Points.Add(jointPoint);
                        handrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.ShoulderLeft:
                        SetPointPosition(shoulderleftPoint, joint);
                        handleftPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.ShoulderRight:
                        SetPointPosition(shoulderrightPoint, joint);
                        handrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.ElbowRight:
                        SetPointPosition(elbowrightPoint, joint);
                        handrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.ElbowLeft:
                        SetPointPosition(elbowleftPoint, joint);
                        handleftPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.WristRight:
                        SetPointPosition(wristrightPoint, joint);
                        handrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.WristLeft:
                        SetPointPosition(wristleftPoint, joint);
                        handleftPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.HandRight:
                        SetPointPosition(handrightPoint, joint);
                        handrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.HandLeft:
                        SetPointPosition(handleftPoint, joint);
                        handleftPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.Spine:
                        SetPointPosition(spinePoint, joint);
                        headPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.HipCenter:
                        SetPointPosition(hipcenterPoint, joint);
                        headPolyline.Points.Add(jointPoint);
                        footleftPolyline.Points.Add(jointPoint);
                        footrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.HipLeft:
                        SetPointPosition(hipleftPoint, joint);
                        footleftPolyline.Points.Add(jointPoint);
                        break;


                    case JointType.HipRight:
                        SetPointPosition(hiprightPoint, joint);
                        footrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.KneeRight:
                        SetPointPosition(kneerightPoint, joint);
                        footrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.KneeLeft:
                        SetPointPosition(kneeleftPoint, joint);
                        footleftPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.AnkleRight:
                        SetPointPosition(anklerightPoint, joint);
                        footrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.AnkleLeft:
                        SetPointPosition(anklerleftPoint, joint);
                        footleftPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.FootRight:
                        SetPointPosition(footrightPoint, joint);
                        footrightPolyline.Points.Add(jointPoint);
                        break;
                    case JointType.FootLeft:
                        SetPointPosition(footleftPoint, joint);
                        footleftPolyline.Points.Add(jointPoint);
                        break;
                    default:


                        break;
                }
            }




            headPolyline.Stroke = new SolidColorBrush(Colors.Blue);     //Stroke画    Brush刷   Solid固体的 实心的  Canvas帆布油画
            headPolyline.StrokeThickness = 5;
            SkeletonCanvas.Children.Add(headPolyline);


            handleftPolyline.Stroke = new SolidColorBrush(Colors.Blue);
            handleftPolyline.StrokeThickness = 5;
            SkeletonCanvas.Children.Add(handleftPolyline);


            handrightPolyline.Stroke = new SolidColorBrush(Colors.Blue);
            handrightPolyline.StrokeThickness = 5;
            SkeletonCanvas.Children.Add(handrightPolyline);


            footleftPolyline.Stroke = new SolidColorBrush(Colors.Blue);
            footleftPolyline.StrokeThickness = 5;
            SkeletonCanvas.Children.Add(footleftPolyline);


            footrightPolyline.Stroke = new SolidColorBrush(Colors.Blue);
            footrightPolyline.StrokeThickness = 5;
            SkeletonCanvas.Children.Add(footrightPolyline);
            
        }


      


        private void Windows_Unloaded(object sender, RoutedEventArgs e)
        {


            kinectSensor.Stop();
        }
    }

}





<Window x:Class="骨骼追踪数据的处理方法.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
    <Grid Loaded="Window_Loaded" >
        <Canvas Name="SkeletonCanvas" Visibility="Visible">
            <Ellipse Canvas.Left="0" Canvas.Top="0" Fill="Red" Height="10" Width="10" Name="headPoint"  />
            <Ellipse Canvas.Left="10" Canvas.Top="0" Fill="Blue" Height="10" Width="10" Name="shouldercenterPoint"  />
            <Ellipse Canvas.Left="20" Canvas.Top="0" Fill="Orange" Height="10" Width="10" Name="shoulderrightPoint" />
            <Ellipse Fill="Green" Height="10" Width="10" Name="handrightPoint" Canvas.Left="30" Canvas.Top="0" />
            <Ellipse Fill="Gray" Height="10" Width="10" Name="wristrightPoint" Canvas.Left="40" Canvas.Top="0" />
            <Ellipse Fill="LightBlue" Height="10" Width="10" Name="elbowrightPoint" Canvas.Left="50" Canvas.Top="0" />
            <Ellipse Fill="Black" Height="10" Width="10" Name="handleftPoint" Canvas.Left="60" Canvas.Top="0" />
            <Ellipse Fill="Yellow" Height="10" Width="10" Name="wristleftPoint" Canvas.Left="70" Canvas.Top="0" />
            <Ellipse Fill="YellowGreen" Height="10" Width="10" Name="elbowleftPoint" Canvas.Left="80" Canvas.Top="0" />
            <Ellipse Fill="LawnGreen" Height="10" Width="10" Name="shoulderleftPoint" Canvas.Left="90" Canvas.Top="0" />
            <Ellipse Fill="Brown" Height="10" Width="10" Name="spinePoint" Canvas.Left="100" Canvas.Top="0" />
            <Ellipse Fill="BlueViolet" Height="10" Width="10" Name="hipcenterPoint" Canvas.Left="110" Canvas.Top="0" />
            <Ellipse Fill="Chocolate" Height="10" Width="10" Name="hipleftPoint" Canvas.Left="120" Canvas.Top="0" />
            <Ellipse Fill="DarkBlue" Height="10" Width="10" Name="hiprightPoint" Canvas.Left="130" Canvas.Top="0" />
            <Ellipse Fill="DarkGray" Height="10" Width="10" Name="kneerightPoint" Canvas.Left="140" Canvas.Top="0" />
            <Ellipse Fill="GreenYellow" Height="10" Width="10" Name="kneeleftPoint" Canvas.Left="150" Canvas.Top="0" />
            <Ellipse Fill="HotPink" Height="10" Width="10" Name="anklerightPoint" Canvas.Left="160" Canvas.Top="0" />
            <Ellipse Fill="LightPink" Height="10" Width="10" Name="anklerleftPoint" Canvas.Left="170" Canvas.Top="0" />
            <Ellipse Fill="LightYellow" Height="10" Width="10" Name="footrightPoint" Canvas.Left="180" Canvas.Top="0" />
            <Ellipse Fill="OrangeRed" Height="10" Width="10" Name="footleftPoint" Canvas.Left="190" Canvas.Top="0"  />
            <Image Canvas.Left="303" Height="150" Canvas.Top="161" Width="200" Name="image1" Stretch="Fill" />
            <Image Height="500" Width="500" Name="ColorImage"/>
        </Canvas>
       
    </Grid>
</Window>



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值