Kinect SDK 1.6和Joint.ScaleTo方法

时间:2012-11-09 17:30:33

标签: wpf kinect kinect-sdk

我正在使用Kinect SDK 1.6,我正在关注 Windows Kinect快速入门系列 Skeleton Tracking Funamentals 教程,可用here

即使这些教程是针对SDK 1.0制作的,一切都很顺利,直到我按照说明将我的手的位置映射到自定义大小的窗口(例如1280x720)。< / p>

Dan Fernandez正在使用以下代码行来实现此目标

    private void ScalePosition(FrameworkElement element, Joint joint)
    {
        // Convert the value to X/Y;
        Joint scaledJoint = joint.ScaleTo(1280, 720);

        ....
    }    

嗯,方法ScaleTo不是自定义函数,它应该在Kinect SDK中提供,但根据我的编辑器,没有这样的方法。我无法找到它,我认为它可能已被移动/重命名/自SDK 1.0以来的任何内容。

只是为了确保一切正常,这是我的using列表,其他人(Skeleton tracking等)正在工作,所以我真的无法弄明白

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using Microsoft.Kinect;
using Microsoft.Kinect.Toolkit;
using Microsoft.Samples.Kinect.WpfViewers;

我可以根据要求提供有关我的代码的更多详细信息。

4 个答案:

答案 0 :(得分:8)

如果你对Coding4Fun有正确的引用,你实际上只是错过了这个:

using Coding4Fun.Kinect.Wpf;

在代码的开头。

答案 1 :(得分:5)

如果您需要ScaleTo()

,可以将此SDK与最新的Microsoft SDK结合使用

http://c4fkinect.codeplex.com/

它是开源的,所以您也可以使用他们的代码并拥有自己的ScaleTo()

请记住添加正确的using指令:

using Coding4Fun.Kinect.Wpf;

how to scale joints using the new Kinect SDK in C#

答案 2 :(得分:2)

Scaling是Coding4Fun库的一部分,可在此处获得: http://c4fkinect.codeplex.com/

或者,您可以编写自己的缩放。

像这样的东西会创建一个右手跟踪的“命中框”,以右肩为中心,并将其缩放到主屏幕的分辨率。

double xScaled = (rightHand.Position.X - leftShoulder.Position.X) / ((rightShoulder.Position.X - leftShoulder.Position.X) * 2) * SystemParameters.PrimaryScreenWidth;
double yScaled = (rightHand.Position.Y - head.Position.Y) / (rightHip.Position.Y - head.Position.Y) * SystemParameters.PrimaryScreenHeight;

以下是将Kinect坐标缩放到屏幕分辨率的函数的另一个示例:

private static double ScaleY(Joint joint)
{
    double y = ((SystemParameters.PrimaryScreenHeight / 0.4) * -joint.Position.Y) + (SystemParameters.PrimaryScreenHeight / 2);
    return y;
}

private static void ScaleXY(Joint shoulderCenter, bool rightHand, Joint joint, out int scaledX, out int scaledY)
{
    double screenWidth = SystemParameters.PrimaryScreenWidth;

    double x = 0;
    double y = ScaleY(joint);

    // if rightHand then place shouldCenter on left of screen
    // else place shouldCenter on right of screen
    if (rightHand)
    {
        x = (joint.Position.X - shoulderCenter.Position.X) * screenWidth * 2;
    }
    else
    {
        x = screenWidth - ((shoulderCenter.Position.X - joint.Position.X) * (screenWidth * 2));
    }


    if (x < 0)
    {
        x = 0;
    }
    else if (x > screenWidth - 5)
    {
        x = screenWidth - 5;
    }

    if (y < 0)
    {
        y = 0;
    }

    scaledX = (int)x;
    scaledY = (int)y;
}

答案 3 :(得分:0)

you can fix the error using this dll file


http://c4fkinect.codeplex.com/releases/view/76271