我尝试使用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?
答案 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
=您要缩放的关节的X
或Y
坐标。
如果您只是包含上述功能,可以这样称呼它:
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);
...然后插入你需要的东西。