Let*_*oir 9 c# wpf tracking gesture-recognition kinect
我想跟踪第一个人,并使用此人的右手导航我制作的应用程序.
我可以接管光标,现在我只想跟踪一个人.所以基本上当一个人在节目中导航,并且有人走在他身后或正在寻找这个人时,如果他们移动,那么kinect就不应该认出其他人.
我怎么能实现这一点,我知道它与trackingId什么有关呢?:■
foreach (SkeletonData s in allSkeletons.Skeletons)
{
if (s.TrackingState == SkeletonTrackingState.Tracked)
{
if (s.TrackingID == 0)
{
foreach (Joint joint in s.Joints)
{
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
每个被跟踪的人都有一个玩家索引.只需忽略其他索引的玩家.
播放器索引是深度流图像中数据的一部分.你必须提取它:
int playerIdx = depthFrame16[i16] & 0x07;
Run Code Online (Sandbox Code Playgroud)
要获取此信息,您必须正确初始化Kinect运行时:
_kinectNui.Initialize(RuntimeOptions.UseDepthAndPlayerIndex | ....
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参见此处:http: //www.codeproject.com/KB/dotnet/KinectGettingStarted.aspx
我完全推荐MS的视频教程:http://research.microsoft.com/apps/video/? id = 152249
如果您查看SDK附带的ShapeGameDemo,您可以看到他们是如何做到的.(他们只使用数组中的skeletion索引):
int playerId = 0;
foreach (SkeletonData data in skeletonFrame.Skeletons) {
if (SkeletonTrackingState.Tracked == data.TrackingState) {
Player player;
if (players.ContainsKey(playerId))
player = players[playerId];
else
player = new Player(playerId);
}
playerId++;
}
Run Code Online (Sandbox Code Playgroud)
简化您可以做的事情(使用您的代码):
int myPlayerIndex = 0; //probably 0 since you are the first person entered the kinect scope
int playerId = 0;
foreach (SkeletonData s in allSkeletons.Skeletons) {
if(playerId != myPlayerIndex)
continue;
if (s.TrackingState == SkeletonTrackingState.Tracked) {
foreach (Joint joint in s.Joints)
{
}
}
playerId++;
}
Run Code Online (Sandbox Code Playgroud)
在这里解决问题的一个类似的问题在一个MS论坛解释它:http: //social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/d821df8d-39ca-44e3-81e7-c907d94acfca
| 归档时间: |
|
| 查看次数: |
6756 次 |
| 最近记录: |