有点赶鸭子上架。。代码拼拼凑凑也不知道对不对。就这样吧。
第一步
代码主体使用的是官方给的例子,可以在这看看吧(大概,已经忘了是在哪一步下载的这个软件了,反正环境配置都可以看这个大佬的。后面不说怎么下载东西了)

第二步
打开后直接修改,使用这位大佬的代码。
/******
* 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()
{
// ... 此处省略若干示例中的代码
// 此处为需要添加的代码
//#begin
if (!this.kinectSensor.IsAvailable)
{
Thread playbackThread = new Thread(startPlayback);
playbackThread.Start();
}
//#end
}
// 此处为需要添加的代码
//#begin
public 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报错,需要在 属性-生成-允许不安全代码 打钩。
遇到的问题应该就这样了。
本文记录了C#进行Kinect开发的过程。首先参考官方例子完成环境配置,接着修改代码,引用相关内容并改成x64使文件可运行。还对代码部分参数进行解释,最后总结了开发中踩的坑,如项目创建类型、引用添加等。
4397





