【问题标题】:How to do Joint tracking in Kinect with a scaled Image如何在 Kinect 中使用缩放图像进行联合跟踪
【发布时间】:2012-11-21 14:28:24
【问题描述】:

我尝试使用 kinect 进行一些联合跟踪(只需在我的右手中放置一个椭圆),对于默认的 640x480 图像,一切正常,我以this channel9 视频为基础。 我的代码,更新为使用新的 CoordinateMapper 类在这里

 ...
CoordinateMapper cm = new CoordinateMapper(this.KinectSensorManager.KinectSensor);
ColorImagePoint handColorPoint = cm.MapSkeletonPointToColorPoint(atualSkeleton.Joints[JointType.HandRight].Position, ColorImageFormat.RgbResolution640x480Fps30);

Canvas.SetLeft(elipseHead, (handColorPoint.X) - (elipseHead.Width / 2)); // center of the ellipse in center of the joint
Canvas.SetTop(elipseHead, (handColorPoint.Y) - (elipseHead.Height / 2));

这行得通。问题是:

如何在缩放图像中进行联合跟踪,例如 540x380?

【问题讨论】:

    标签: scale kinect kinect-sdk


    【解决方案1】:

    解决方法很简单,我想出来了。

    需要做的是找到一些适用于该职位的因素。 这个因素可以通过 Kinect 的实际 ColorImageFormat 并除以所需的大小来找到,例如:

    假设我正在使用RgbResolution640x480Fps30 格式并且我的图像(ColorViewer)有 220x240。所以,让我们找出 X 的因数:

    double factorX = (640 / 220); // the factor is 2.90909090...
    

    以及 y 的因数:

    double factorY = (480/ 240); // the factor is 2...
    

    现在,我使用这个因子调整椭圆的位置。

    Canvas.SetLeft(elipseHead, (handColorPoint.X / (2.909090)) - (elipseHead.Width / 2));
    Canvas.SetTop(elipseHead, (handColorPoint.Y / (2)) - (elipseHead.Height / 2));
    

    【讨论】:

    • 注意(elipseHead.Width / 2)和(elipseHead.Height / 2)只是把椭圆的中心放在关节的中心
    【解决方案2】:

    我还没用过CoordinateMapper,现在我的 Kinect 不在前面,所以我先把它扔掉。当我再次使用 Kinect 时,我会看到更新。

    Coding4Fun Kinect Toolkit 有一个 ScaleTo 扩展作为库的一部分。这增加了获取关节并将其缩放到任何显示分辨率的能力。

    缩放函数如下所示:

    private static float Scale(int maxPixel, float maxSkeleton, float position)
    {
        float value = ((((maxPixel / maxSkeleton) / 2) * position) + (maxPixel/2));
        if(value > maxPixel)
            return maxPixel;
        if(value < 0)
            return 0;
        return value;
    }
    

    maxPixel = 宽度或高度,取决于您缩放的坐标。 maxSkeleton = 将此设置为 1。 position = 要缩放的关节的XY 坐标。

    如果你只包含上面的函数,你可以这样调用它:

    Canvas.SetLeft(e, Scale(640, 1, joint.Position.X));
    Canvas.SetTop(e, Scale(480, 1, -joint.Position.Y));
    

    ...用不同的比例替换您的 640 和 480。

    如果你包含Coding4Fun Kinect Toolkit,而不是重写代码,你可以这样称呼它:

    scaledJoin = rawJoint.ScaleTo(640, 480);
    

    ...然后插入你需要的东西。

    【讨论】:

    • 几乎工作了@Evil Closet Monkey 椭圆有点移位。我找到了解决问题的方法,并将回答我自己的问题。无论如何,谢谢。
    • 啊,我明白我把你引错了。骨架点是从深度数据中生成的,因此这些点应该与深度图像同步(我必须对其进行测试以确保 100% 的确定性)。但您看到的轻微变化是由于两个摄像头之间的视野略有不同。
    • 似乎是真的,因为有趣的 Skeleton Basics 视频的编码使用深度数据映射到骨架,然后映射到颜色。我解决了我的问题(请参阅下面的答案,您如何看待我的解决方案?)
    • 您的答案似乎很简单,而且是正确的做法。请务必接受您自己的答案,以突出我的更好路径。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-19
    • 2014-05-20
    相关资源
    最近更新 更多