Kinect测量身高


直接上代码:
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;
using System.Runtime.InteropServices;

namespace WpfApplication3
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        [DllImport("User32.dll")]
        public static extern void LockWorkStation();
        private KinectSensor _kinect;
        private short[] PixelData;
        readonly List<double> PreviousDepthAvgValueList = new List<double>();
        private const double DepthAvgDiffThreadhold = 300;
        private const int PrevDepthAvgListLength = 100;

        public MainWindow()
        {
            InitializeComponent();
        }
        private void startKinect()
        {
            if (KinectSensor.KinectSensors.Count > 0)
            {
                _kinect = KinectSensor.KinectSensors[0];
                //MessageBox.Show("kinect 目前的状态为:" + _kinect.Status);

                _kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
                _kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
                _kinect.SkeletonStream.Enable();

                _kinect.DepthFrameReady +=
                    new EventHandler<DepthImageFrameReadyEventArgs>(_kinect_DepthFrameReady);
                //_kinect.AllFramesReady +=
                //    new EventHandler<AllFramesReadyEventArgs>(_kinect_AllFramesReady);
                _kinect.SkeletonFrameReady +=
                    new EventHandler<SkeletonFrameReadyEventArgs>(_kinect_SkeletonFrameReady);
                //_kinect.DepthStream.Range = DepthRange.Near;
                _kinect.Start();
            }//if
            else
            {
                MessageBox.Show("没有任何Kinect设备");
            }
        }
        private void stopKinect()
        {
            if (_kinect != null)
            {
                if (_kinect.Status == KinectStatus.Connected)
                {
                    _kinect.Stop();
                }

            }//null
        }//stopp
        void _kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
        {
            using (SkeletonFrame Sframe = e.OpenSkeletonFrame())
            {
                if (Sframe == null)
                    return;
                Skeleton s = GetClosetSkeleton(Sframe);
                if (s == null)
                    return;
                if (s.ClippedEdges == FrameEdges.None)
                    return;
                SkeletonPoint head = s.Joints[JointType.Head].Position;
                SkeletonPoint centerShoulder = s.Joints[JointType.ShoulderCenter].Position;
                SkeletonPoint leftFoot = s.Joints[JointType.FootLeft].Position;
                float height = Math.Abs(head.Y - leftFoot.Y);
                float heightEx = Math.Abs(head.Y - centerShoulder.Y) + 0.1f;
                float realHeight = height + heightEx;
                mylabel.Content = realHeight.ToString();

            }//susing 
        }
        const int MaxSkeletonTrackingCount = 6;
        private Skeleton[] allSkeletons = new Skeleton[MaxSkeletonTrackingCount];
        Skeleton GetClosetSkeleton(SkeletonFrame frame)
        {
            frame.CopySkeletonDataTo(allSkeletons);
            Skeleton closetSkeleton = (from s in allSkeletons
                                       where s.TrackingState == SkeletonTrackingState.Tracked
                                       && s.Joints[JointType.Head].TrackingState == JointTrackingState.Tracked
                                       select s).OrderBy(s => s.Joints[JointType.Head].Position.Z).FirstOrDefault();
            return closetSkeleton;
        }
        void _kinect_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e)
        {
            bool receivedData = false;
            using (DepthImageFrame DFrame = e.OpenDepthImageFrame())
            {
                if (DFrame != null)
                {
                    PixelData = new short[DFrame.PixelDataLength];
                    DFrame.CopyPixelDataTo(PixelData);
                    var depthAvg = PixelData.Average(pixel => pixel);
                    PreviousDepthAvgValueList.Add(depthAvg);
                    var avgOfdepthAvgList = PreviousDepthAvgValueList.Average(value => value);

                    if (PreviousDepthAvgValueList.Count > PrevDepthAvgListLength)
                        PreviousDepthAvgValueList.RemoveAt(0);
                    labelDepthAvg.Content = depthAvg.ToString();
                    lablelAvgOfhistory.Content = avgOfdepthAvgList.ToString();
                    if (PreviousDepthAvgValueList.Count == PrevDepthAvgListLength
                        &&
                        (Math.Abs(avgOfdepthAvgList - depthAvg) > DepthAvgDiffThreadhold))
                    {
                        //mylabel.Content = "true";
                        PreviousDepthAvgValueList.Clear();
                    }//if
                    else
                    {
                        //mylabel.Content = "false";
                    }
                    receivedData = true;
                }//null
            }//using 
            if (receivedData)
            {
                BitmapSource source = BitmapSource.Create(
                    640, 480, 96, 96,
                    PixelFormats.Gray16, null, PixelData, 640 * 2);
                image1.Source = source;
            }//
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            startKinect();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            stopKinect();
        }
    }//class 
}//namespace ;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值