积极答复者
骨骼跟踪,未将对象引用设置到对象实例

问题
-
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)
小弟接触C#和KINECT刚刚一个月,很多地方都不明白,请指教
{
StartKinect();
}
}
}2014年3月21日 3:49
答案
-
楼上说的对,变量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
2014年3月25日 3:16
全部回复
-
楼上说的对,变量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
2014年3月25日 3:16