如何将 kinect 骨架移动到另一个位置

2024-01-07

我正在研究一种扩展方法,将一个骨架移动到 kinect 现场操作系统视图中的所需位置。

我的代码接收要移动的骨骼和目标位置,我计算接收到的骨骼臀部中心与目标位置之间的距离以找到how much to move,然后在联合中应用该因子进行迭代。我的代码实际上看起来像这样。

public static Skeleton MoveTo(this Skeleton skToBeMoved, Vector4 destiny)
    {
        Joint newJoint = new Joint();

        ///Based on the HipCenter (i dont know if it is reliable, seems it is.)
        float howMuchMoveToX = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.X - destiny.X);
        float howMuchMoveToY = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.Y - destiny.Y);
        float howMuchMoveToZ = Math.Abs(skToBeMoved.Joints[JointType.HipCenter].Position.Z - destiny.Z);
        float howMuchToMultiply = 1;

        // Iterate in the 20 Joints
        foreach (JointType item in Enum.GetValues(typeof(JointType)))
        {
            newJoint = skToBeMoved.Joints[item];

            // This adjust, try to keeps the skToBeMoved in the desired position
            if (newJoint.Position.X < 0)
                howMuchToMultiply = 1; // if the point is in a negative position, carry it to a "more positive" position
            else
                howMuchToMultiply = -1; // if the point is in a positive position, carry it to a "more negative" position

            // applying the new values to the joint
            SkeletonPoint pos = new SkeletonPoint()
            {
                X = newJoint.Position.X + (howMuchMoveToX * howMuchToMultiply),
                Y = newJoint.Position.Y, // * (float)whatToMultiplyY,
                Z = newJoint.Position.Z, // * (float)whatToMultiplyZ
            };

            newJoint.Position = pos;
            skToBeMoved.Joints[item] = newJoint;

            //if (skToBeMoved.Joints[JointType.HipCenter].Position.X < 0)
            //{
            //    if (item == JointType.HandLeft)
            //    {
            //        if (skToBeMoved.Joints[item].Position.X > 0)
            //        {

            //        }
            //    }
            //}
        }

        return skToBeMoved;
    }

实际上,只考虑X位置。

现在,问题是:

如果我站在消极的位置,并将手移到积极的位置,就会出现奇怪的行为,看看这张图片

要重现此行为,您可以使用此代码

using (SkeletonFrame frame = e.OpenSkeletonFrame())
        {
            if (frame == null)
                return new Skeleton();

            if (skeletons == null || skeletons.Length != frame.SkeletonArrayLength)
            {
                skeletons = new Skeleton[frame.SkeletonArrayLength];
            }
            frame.CopySkeletonDataTo(skeletons);

            Skeleton skeletonToTest = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();

            Vector4 newPosition = new Vector4();
            newPosition.X = -0.03412333f;
            newPosition.Y = 0.0407479f;
            newPosition.Z = 1.927342f;
            newPosition.W = 0; // ignored

            skeletonToTest.MoveTo(newPosition);
        }

我知道,这是简单的数学,但我无法弄清楚为什么会发生这种情况。 任何帮助将不胜感激。


问题解决了。这是代码

public static Skeleton MoveTo(this Skeleton skToBeMoved, Vector4 destiny)
    {
        Joint newJoint = new Joint();

        ///Based on the HipCenter (i dont know if it is reliable, seems it is.)
        float howMuchMoveToX = (skToBeMoved.Joints[JointType.HipCenter].Position.X - destiny.X) * -1;
        float howMuchMoveToY = (skToBeMoved.Joints[JointType.HipCenter].Position.Y - destiny.Y) * -1;
        float howMuchMoveToZ = (skToBeMoved.Joints[JointType.HipCenter].Position.Z - destiny.Z) * -1;

        // Iterate in the 20 Joints
        foreach (JointType item in Enum.GetValues(typeof(JointType)))
        {
            newJoint = skToBeMoved.Joints[item];

            // applying the new values to the joint
            SkeletonPoint pos = new SkeletonPoint()
            {
                X = (float)(newJoint.Position.X + (howMuchMoveToX)),
                Y = (float)(newJoint.Position.Y + (howMuchMoveToY)),
                Z = (float)(newJoint.Position.Z + (howMuchMoveToZ))
            };

            newJoint.Position = pos;
            skToBeMoved.Joints[item] = newJoint;
        }

        return skToBeMoved;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 kinect 骨架移动到另一个位置 的相关文章

  • kinect2.0视角范围和距离远近

    本文章由cartzhang编写 转载请注明出处 所有权利保留 文章链接 http blog csdn net cartzhang article details 44588097 作者 cartzhang Kinect 摄像头范围介绍和玩家
  • XboxOne的kinect在Unity上的开发——开始界面

    好的 欢迎大家来看这个系列的第二部分的内容 这一次呢 我们就直接进入主题 开发切水果游戏本身 这次的切水果的demo呢 我们选择使用ugui来制作 因为ugui相对于NGUI的各种优势 让我们选择了ugui 关于这些呢 大家可以参考我的另一
  • 不一样的视角,不一样的Kinect for Windows 2.0

    随着科技的发展 智能硬件已经越来越多的出现在我们的生活当中 侦探片中的无线内耳耳机已经变成了蓝牙耳机 而 少数派报告 中手势操作的荧幕界面也已变成现实 对人机交互有很高要求的开发者来讲 于7月正式发售的Kinect for Windows
  • 为什么 kinect 颜色和深度无法正确对齐?

    我已经研究这个问题很长一段时间了 并且我的创造力已经结束 所以希望其他人可以帮助我指明正确的方向 我一直在使用 Kinect 并尝试将数据捕获到 MATLAB 幸运的是 有很多方法可以做到这一点 我目前正在使用http www mathwo
  • 使用来自多个点的多个图像构建 3D 模型 (kinect)

    如果从不同角度收集各种图像和深度数据 是否可以构建静止物体的 3D 模型 我的想法是有一种圆形传送带 其中将放置 kinect 并且传送带同时要在 3D 空间中重建的真实物体位于中间 此后传送带围绕图像旋转一圈 并捕获大量图像 可能每秒 1
  • Kinect SDK用于手指检测?

    我是新加坡南洋理工大学 NTU 的学生 目前正在开发一个使用Kinect SDK的项目 我的问题是 任何人都知道如何使用 Kinect SDK 开发一个程序来检测手指 或指尖 甚至可能知道一些可能的参考代码 不管怎样 我也尝试在google
  • Kinect SDK 1.7中的移交按钮事件

    我正在使用 Kinect SDK 1 7 创建一个 WPF 应用程序 我需要计算用户将手放在按钮上的次数 不是按下 只是放在上面 我发现只有一个事件负责在 XAML 中按下按钮
  • 访问 wpf c# 应用程序中其他类中 XAML 的按钮和复选框的值

    我正在开发 WPF Kinect 项目 它是 Windows Kinect 的开发人员工具包示例之一 称为 Kinect Explorer 您可以从 Kinect 开发者工具包 SDK 1 5 版下载它 在 kinectwindow xam
  • 平滑鼠标移动

    我正在开发一个软件 根据我从 kinect 的深度图像获得的某些坐标来移动鼠标 但我有 30 帧 秒 图像 秒 并且这些坐标随着每一帧而变化 因此鼠标不断移动 我的问题是 有没有办法让鼠标的移动平滑 是的 您可以使用一些参数开始跟踪 以使移
  • 使用 Kinect 和 EMGU(OpenCV 包装器)进行机器人定位

    我正在开发小型 WPF 桌面应用程序来跟踪机器人 我的办公桌上有一个 Windows 版 Kinect 我能够执行基本功能并运行深度摄像头流和 RGB 摄像头流 我需要的是跟踪地板上的机器人 但我不知道从哪里开始 我发现我应该使用 EMGU
  • 将点云的坐标转换为点云库中的另一个坐标,从而使地平面成为X-O-Y平面?

    我有一个来自 kinect fusion 的点云 并使用点云库来分割地平面 ax by c z d 0 成功 我在地平面的 pcl ModelCoefficients 中得到了 a b c d 现在我需要将笛卡尔坐标转换为新的笛卡尔坐标 使
  • 从给定深度图像生成点云-matlab Computer Vision System Toolbox

    我是matlab初学者 我购买了Computer Vision System Toolbox 我收到了 400 张深度图像 PNG 图像 我想为每个图像创建一个点云 我查看了Computer Vision System Toolbox的文档
  • 如何将 kinect 骨架移动到另一个位置

    我正在研究一种扩展方法 将一个骨架移动到 kinect 现场操作系统视图中的所需位置 我的代码接收要移动的骨骼和目标位置 我计算接收到的骨骼臀部中心与目标位置之间的距离以找到how much to move 然后在联合中应用该因子进行迭代
  • 让 Kinect SDK 在 C++ 中与 Visual Studio 2010 配合使用

    我一直在遵循微软为使用 c 设置 Kinect SDK 所做的指南 他们创建的步骤如下 在源代码中包含 windows h 要使用 NUI API 请包含 MSR NuiApi h 位置 Program Files Microsoft Re
  • kinect C# 从保存的数据中绘制和移动骨架

    我想要做的是从保存的数据中绘制骨架并为其设置动画 就像我们可以对传感器流所做的那样 所以我有每个关节的 x y 和 z 值 我搜索了很多 但找不到任何可以帮助我的东西 我可以将数据转换为关节集合 将其与骨架关联 但是然后呢 我不知道如何将骨
  • 如何从kinect fracetrack获取网格?

    如何获取 kinect 面部追踪网格 这是网格 https i stack imgur com aPtJt jpg https i stack imgur com aPtJt jpg 我尝试了多种方法 但无法使其发挥作用 e g http
  • 如何?从 kinect 数据为 Three.js 示例 webgl_kinect 创建 webm 视频

    http mrdoob github com Three js examples webgl kinect html http mrdoob github com three js examples webgl kinect html 如何
  • 如何使用 Java 访问 Kinect?

    我目前正在学习计算机视觉课程 对于我的期末项目 我将制作一款与 Kinect 交互的小游戏 现在我想用 Java 制作这个游戏 因为我以前从未真正尝试过制作游戏 而且我对这种语言非常满意 但我似乎找不到一种方法来访问深度数据 我只需要将其打
  • 如何使用 Kinect 追踪一个人 (trackingID)

    我想跟踪第一个人 并使用这个人的右手在我制作的应用程序中导航 我可以接管光标 现在我只想跟踪一个人 因此 基本上 当一个人在程序中导航时 有人走在他身后或与这个人一起看 如果他们移动 kinect 不应该识别其他任何人 我怎样才能实现这个
  • 使用顶点缓冲区对象 (VBO) 渲染 Kinect 点云

    我正在尝试制作一个动态点云可视化工具 使用 Kinect 传感器每帧更新这些点 为了抓取帧 我使用 OpenCV 和 GLUT 来显示 OpenCV API 对于点 xyz 位置返回 640 x 480 float 对于 rgb 颜色数据返

随机推荐