我已经在这方面做了很长一段时间了,我找不到为什么(大多数时候) HandJoint没有被跟踪。代码被调整以避免出现这种情况(这就是为什么所有的空值和空号都在那里)。我在Kinect SDKV1.8中使用了C#。
我以前从来没有在这里贴过,所以所有的评论都被接受了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Kinect;
using System.Windows;
namespace Arcade_Kinect.Kinect
{
class KinectAddons
{
public KinectSensor kinect;
public Point? punto;
public JointType hand;
public KinectAddons(bool leftHanded, KinectSensor sensor)
{
this.kinect = sensor;
if (kinect != null)
{
kinect.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(kinect_SkeletonFrameReady);
kinect.Start();
try
{
kinect.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
kinect.SkeletonStream.Enable();
try
{
kinect.DepthStream.Range = DepthRange.Near;
kinect.SkeletonStream.EnableTrackingInNearRange = true;
}
catch (InvalidOperationException)
{
kinect.DepthStream.Range = DepthRange.Default;
kinect.SkeletonStream.EnableTrackingInNearRange = false;
}
}
catch (InvalidOperationException) { }
}
if (leftHanded)
this.hand = JointType.HandLeft;
else
this.hand = JointType.HandRight;
}
void kinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
Skeleton[] skeleton = new Skeleton[0];
using (SkeletonFrame sf = e.OpenSkeletonFrame())
{
if (sf != null)
{
skeleton = new Skeleton[sf.SkeletonArrayLength];
sf.CopySkeletonDataTo(skeleton);
punto = returnPosFromHand(skeleton[0]);
}
}
}
//saves x and y of the hand
public Point? returnPosFromHand(Skeleton sk)
{
DepthImagePoint depthPoint = new DepthImagePoint();
bool notWorking = true;
try
{
if (sk.Joints[this.hand].TrackingState == JointTrackingState.Tracked)
{
notWorking = false;
depthPoint = this.kinect.CoordinateMapper.MapSkeletonPointToDepthPoint(sk.Joints[this.hand].Position, DepthImageFormat.Resolution640x480Fps30);
}
}
catch (IndexOutOfRangeException)
{
System.Console.WriteLine("Hand capture was lost" + this.hand.ToString());
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
if (notWorking)
return null;
return new Point(depthPoint.X, depthPoint.Y);
}
//returns last know value
public double? readNext()
{
if (this.punto.HasValue)
return punto.Value.X;
return null;
}
}
}发布于 2014-06-13 09:05:04
问题
你的问题是从SkeletonFrame获取你的骨骼
SkeletonFrame.OpenSkeletonFrame()总是用X对象返回数组.被跟踪的人不一定是数组中的第一个骨架。
所以你有时候会跟踪你的手。有时,跟踪的骨架是列表中的第一个(returnPosFromHand(skeleton[0]);)。
溶液
遍历框架数组,检查跟踪哪个骨架并使用该框架。你可以按Z-索引排序,也可以用传感器选择最近的一个.然后把这个骨架传递给你的函数。
https://stackoverflow.com/questions/24167984
复制相似问题