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

本文记录了C#进行Kinect开发的过程。首先参考官方例子完成环境配置,接着修改代码,引用相关内容并改成x64使文件可运行。还对代码部分参数进行解释,最后总结了开发中踩的坑,如项目创建类型、引用添加等。

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

第一步

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

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()
        {
            // ... 此处省略若干示例中的代码

            // 此处为需要添加的代码
            //#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报错,需要在 属性-生成-允许不安全代码 打钩。

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

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值