c# kinect提取exf文件的骨骼位置数据

有点赶鸭子上架。。代码拼拼凑凑也不知道对不对。就这样吧。

第一步

代码主体使用的是官方给的例子,可以在这看看吧(大概,已经忘了是在哪一步下载的这个软件了,反正环境配置都可以看这个大佬的。后面不说怎么下载东西了)

Kinect开发学习笔记之(三)Kinect开发环境配置

在这里插入图片描述

第二步

打开后直接修改,使用这位大佬的代码。

Kinect 数据录制与回放

/******* PlaybackClip.cs*/using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Kinect.Tools;namespace Microsoft.Samples.Kinect.DepthBasics//我是骨架位置提取,这里需要改成Microsoft.Samples.Kinect.BodyBasics
{class PlaybackHelper{public static void PlaybackClip(string filePath, uint loopCount){using (KStudioClient client = KStudio.CreateClient()){client.ConnectToService();using (KStudioPlayback playback = client.CreatePlayback(filePath)){playback.LoopCount = loopCount;playback.Start();while (playback.State == KStudioPlaybackState.Playing){Thread.Sleep(500);}if (playback.State == KStudioPlaybackState.Error){throw new InvalidOperationException("Error: Playback failed!");}}client.DisconnectFromService();}}}
}

例子虽然不一样,但是方法都是通用的,加的位置是一样的,代码也没啥变化。

/**** MainWindow.xaml.cs*/namespace Microsoft.Samples.Kinect.DepthBasics
{public partial class MainWindow : Window, INotifyPropertyChanged{// ... 此处省略若干示例中的代码public MainWindow(){// ... 此处省略若干示例中的代码// 此处为需要添加的代码//#beginif (!this.kinectSensor.IsAvailable){Thread playbackThread = new Thread(startPlayback);playbackThread.Start();}//#end}// 此处为需要添加的代码//#beginpublic static void startPlayback(){PlaybackHelper.PlaybackClip("${此处填写 xef 的路径}", 10);}//#end// ... 此处省略若干示例中的代码}
}

这时候官方文档应该是没有问题的。但是大佬的代码会有一堆问题。这时候在引用里面把与之相关的全部勾上就行:
在这里插入图片描述
在这里插入图片描述

注意,需要改成x64,否则无法运行在这里插入图片描述
修改方法:
在这里插入图片描述
在这里插入图片描述
这时候文件已经可以运行起来了,可以运行exf文件,读取到骨骼动画。

第三步

//MainWindow.xaml.cs
private void Reader_FrameArrived(object sender, BodyFrameArrivedEventArgs e){if (dataReceived){using (DrawingContext dc = this.drawingGroup.Open()){foreach (Body body in this.bodies){Pen drawPen = this.bodyColors[penIndex++];if (body.IsTracked){this.DrawBody(joints, jointPoints, dc, drawPen);this.Timeposition(joints);//这个位置添加一个this.DrawHand(body.HandLeftState, jointPoints[JointType.HandLeft], dc);this.DrawHand(body.HandRightState, jointPoints[JointType.HandRight], dc);}}}}}
private void Timeposition(IReadOnlyDictionary<JointType, Joint> joints)//得到关节数据{Joint joint0 = joints[JointType.ShoulderRight];//获取某个指定关节System.IO.File.AppendAllText(@"D:\ztest\111.txt", joint0.Position.Y.ToString("f3") + "  ");//把右肩膀关节的y轴输出到txt。}

解释

Joint joint0 = joints[JointType.ShoulderRight];

这里的shoulderRight可以替换成其他位置在这里插入图片描述
在这里插入图片描述

joint0.Position.Y.ToString("f3")

Y指的是Y轴,当然也有X,Z轴,看需要来。因为是float类型,输出到txt文件强制转换一下。

得到结果

在这里插入图片描述

总结

应该是这样吧,完全不会c#。搞了2天,自己就写了4行代码……也是无语。有问题就有问题吧,反正剩下不是我的事儿了。

其他,研究这个的时候踩的坑

1.自己创建项目时:创建C#的 WPF应用(.NET Framework) 项目。
2.需要 添加kinect引用
3.编译器改为 x64
4.用别人代码时,第一行 namespace Microsoft.Samples.Kinect.BodyBasics 需要根据自己项目命名改。
5.用别人代码时,Properties.Resources.RunningStatusText 最后这个有问题,可能因为对方使用的是官方文件resources.designer.cs文件(在项目的properties文件夹中)。推荐在SDK中找到对应的文件将其复制过去。复制过程中,有地方需要修改成自己的项目名。

global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.Samples.Kinect.BodyBasics.Properties.Resources", typeof(Resources).Assembly);

6.unsafe报错,需要在 属性-生成-允许不安全代码 打钩。

遇到的问题应该就这样了。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部