locked
骨骼跟踪,未将对象引用设置到对象实例 RRS feed

  • 问题

  • 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;

    namespace 挥手识别
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            Skeleton[] skeletons;
            Skeleton k;
            KinectSensor _kinect;
            public MainWindow()
            {
                InitializeComponent();
            }
            public void StartKinect()
            {
                if (KinectSensor.KinectSensors.Count>0)
                {
                    _kinect = KinectSensor.KinectSensors[0];
                    if (_kinect.Status == KinectStatus.Connected)
                    {

                        _kinect.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
                        _kinect.SkeletonStream.Enable();


                        _kinect.ColorFrameReady += _kinect_ColorFrameReady;
                        _kinect.SkeletonFrameReady += _kinect_SkeletonFrameReady;


                        _kinect.Start();


                    }
                    else
                    {
                        MessageBox.Show("请链接KINECT");
                    }

                }

            }

            public void LeftHandUp()
            {
                MessageBox.Show("左手上举");                 //挥动左手弹窗提示
            }
            public void RightHandUp()                          //挥动右手弹窗提示
            {
                MessageBox.Show("右手上举");
            }

            void _kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
            {
                bool isSkeletonReady = false;
                using (SkeletonFrame frame =e.OpenSkeletonFrame())
                {
                    skeletons = new Skeleton[frame.SkeletonArrayLength];
                    frame.CopySkeletonDataTo(skeletons);
                    isSkeletonReady = true;

                }

                if (isSkeletonReady)
                {
                    Skeleton currentskeleton = (from s in skeletons
                                                where s.TrackingState == SkeletonTrackingState.Tracked    //追踪骨骼存入skeletons中
                                                select s).FirstOrDefault();
                    if (currentskeleton != null)
                    {

                        Joint LeftHand = k.Joints[JointType.HandLeft];
                        Joint RightHand = k.Joints[JointType.HandRight];
                        Joint ShoulderLeft = k.Joints[JointType.ShoulderLeft];
                        Joint ShoulderRight = k.Joints[JointType.ShoulderRight];

                        if (LeftHand.Position.Y > ShoulderLeft.Position.Y)
                        {
                            RightHandUp();
                        }
                        if (RightHand.Position.Y > ShoulderRight.Position.Y)
                        {
                            RightHandUp();
                        }
                    }

                }
             
            }

            void _kinect_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
            {
               using (ColorImageFrame frame = e.OpenColorImageFrame())
               {
                   Byte[] pixels = new Byte[frame.PixelDataLength];
                   frame.CopyPixelDataTo(pixels);
                   Camera.Source = WriteableBitmap.Create(frame.Width, frame.Height, 96, 96, PixelFormats.Bgr32, null, pixels, frame.Width * 4);

               }
            }

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

    小弟接触C#和KINECT刚刚一个月,很多地方都不明白,请指教
    2014年3月21日 3:49

答案

  • Hi,从你的代码来看,”Skeleton k;“这个变量一直没有初始化就在_kinect_SkeletonFrameReady函数里面被使用了,所以会产生”未将对象引用设置到对象实例“错误,请在正确的地方完成Skeleton的初始化即可。
    • 已标记为答案 yangecnu 2014年4月11日 15:37
    2014年3月21日 10:51
  • 楼上说的对,变量k没有被初始化。

    Skeleton currentskeleton = (from s in skeletons
                                                where s.TrackingState == SkeletonTrackingState.Tracked    
                                                select s).FirstOrDefault();//追踪骨骼存入skeletons中

    这句话,应该将查询的结果直接赋值给k即可。

    k= (from s in skeletons
                                                where s.TrackingState == SkeletonTrackingState.Tracked    
                                                select s).FirstOrDefault();//追踪骨骼存入skeletons中

    判断的时候判断k!=null

    • 已建议为答案 yangecnu 2014年3月25日 3:16
    • 已标记为答案 yangecnu 2014年4月11日 15:38
    2014年3月25日 3:16

全部回复

  • Hi,从你的代码来看,”Skeleton k;“这个变量一直没有初始化就在_kinect_SkeletonFrameReady函数里面被使用了,所以会产生”未将对象引用设置到对象实例“错误,请在正确的地方完成Skeleton的初始化即可。
    • 已标记为答案 yangecnu 2014年4月11日 15:37
    2014年3月21日 10:51
  • 楼上说的对,变量k没有被初始化。

    Skeleton currentskeleton = (from s in skeletons
                                                where s.TrackingState == SkeletonTrackingState.Tracked    
                                                select s).FirstOrDefault();//追踪骨骼存入skeletons中

    这句话,应该将查询的结果直接赋值给k即可。

    k= (from s in skeletons
                                                where s.TrackingState == SkeletonTrackingState.Tracked    
                                                select s).FirstOrDefault();//追踪骨骼存入skeletons中

    判断的时候判断k!=null

    • 已建议为答案 yangecnu 2014年3月25日 3:16
    • 已标记为答案 yangecnu 2014年4月11日 15:38
    2014年3月25日 3:16