2

我试图用 kinect 做一些联合跟踪(只是在我的右手里放一个椭圆)对于默认的 640x480 图像一切正常,我以这个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?

4

2 回答 2

3

解决这个问题的方法很简单,我搞定了。

需要做的是找到一些适用于该职位的因素。这个因素可以通过 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));
于 2012-11-21T20:29:38.423 回答
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=要缩放的关节的X或坐标。Y

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

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);

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

于 2012-11-21T17:53:14.377 回答