【问题标题】:Drawing rectangle around skeleton using kinect使用kinect在骨架周围绘制矩形
【发布时间】:2012-08-28 03:10:45
【问题描述】:

我想知道如何使用 SDK v1.5 在骨架周围绘制一个矩形

我想要做的是,当一个手势被识别时,一个红色的矩形应该出现在骨架周围。

任何帮助将不胜感激。

问候,

艾哈迈德

【问题讨论】:

标签: c# kinect


【解决方案1】:

此代码不会立即运行,它旨在提供要使用的算法和方法。

SkeletonPoint maxX = joints[0].Position, minX = joints[0].Position;
SkeletonPoint maxY = joints[0].Position, minY = joints[0].Position;
for(joint in joints){
    if(joint.Position.x>maxX) maxX = joint.Position;
    if(joint.Position.x<minX) minX = joint.Position;
    if(joint.Position.y>maxY) maxY = joint.Position;
    if(joint.Position.y<minY) minY = joint.Position;
}

// Adding a margin, because the articulations are not always placed
// at the extremities. Can adjust to get a better look.
float margin = .10f // 10 cm margin.
maxX.X += margin;
maxY.Y += margin;
minX.X -= margin;
minY.Y -= margin;

// Now we need to convert it to the video stream space.
DepthImagePoint maxXd = depthImageFrame.MapFromSkeletonPoint(maxX);
ColorImagePoint maxXc = depthImageFrame.MapToColorImagePoint(maxXd);
// **
// Same for other coordinates.
// **

// The buffer b will contains the current image, in bitmap format
// (without header). You may use colorImageFrame.Format to get more
// details on its encoding.
byte[] b = new byte[PixelDataLength];
colorImageFrame.CopyPixelDataTo(b);

// Then transform the buffer b into whatever you want,
// and draw the rect [[maxXc,maxYc],[minXc,minYc]] over it
// before rendering.

这样可以获得最外层的关节,而不仅仅是可能是最外层的关节。

字节数组的转换方式由你自己决定,取决于你的渲染方法。

【讨论】:

  • +1 表示最小/最大 x/y,但我也认为他正在寻找如何实际绘制矩形
  • @Outlaw 这意味着需要进行一些转换才能将位置映射到视频流中的某个位置。我认为this 会很有用。如果我有时间,会尝试将其包含在我的答案中。
【解决方案2】:

假设您使用的是 Kinect SDK,这相对容易。我正在使用画布并获取头部、脚部、臀部和手部的坐标,因此我知道要围绕什么绘制框,然后在每一侧添加更多像素。我正在使用算法:

|(兴奋 + 25) - (脚 - 25)| * |(右手x + 25) - (左手x - 25)|

获取盒子高度。 我正在使用 ||在这种情况下为绝对值

然后,一旦您放置了画布(和关节),您就可以使用以下方法获取它们的坐标:

Canvas.GetTop(element / 2);
Canvas.GetLeft(element / 2); // /2 so that we get the center

然后你可以使用我的算法来找到制作盒子的大小,并且由于元素是用它们的左上角放置的,你可以使用 heady + a bit 的坐标来放置它,而右边手 x + 一点点作为 X。你可以使用它来放置它

Canvas.SetTop(ycoord, box);
Canvas.SetLeft(xcoord, box);

我添加了一点,所以物体和盒子之间有一点空间。
希望这会有所帮助。
当我完成所有代码后,我会发布它

【讨论】:

  • 可能会出现一些问题,例如,手并不总是身体的最外层(在某些位置,可能是肘部)。
  • 这也是未命中边距的原因:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
  • 2018-02-13
相关资源
最近更新 更多