如何使用缩放图像在Kinect中进行联合跟踪

时间:2012-11-21 14:28:24

标签: scale kinect kinect-sdk

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

 ...
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?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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&amp; 480具有不同的比例。

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

scaledJoin = rawJoint.ScaleTo(640, 480);

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