我正在尝试使用我的KINECT v2右侧Handtip位置在画布上绘制线条。我从这行代码中获得了右手尖端位置。
CameraSpacePoint handtipPosition = handtip.Position;
ColorSpacePoint handtipPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(handtipPosition);
这是我用于绘制线条的代码片段,我已经定义了另一个点来将X1和Y1坐标提供给我的行
ColorSpacePoint PreviousPoint;
line.X1 = PreviousPoint.X; // ERROR 'Use of possibly Unassigned field X'
line.Y1 = PreviousPoint.Y; // ERROR 'Use of possibly Unassigned field Y'
line.X2 = handtipPoint.X;
line.Y2 = handtipPoint.Y;
PreviousPoint = handtipPoint;
canvas.Children.Add(line);
但是当我使用PreviousPoint为我的X1和Y1参数分配坐标时,我得到错误'使用可能未分配的字段X'(我猜测是因为PreviousPoint在开头没有值)并且如果我修复previousPoint值对于X和Y为0,在我的画布上我从固定点(0,0)绘制线条,因为只有X2和Y2跟随我的手位置。
请帮助我纠正这种情况,感谢任何建议和帮助。
答案 0 :(得分:0)
我假设绘制线条的代码位于KINECT的事件处理程序中?如果是这样,只需在全局范围内实例化PreviousPoint对象。
public class whatever {
private ColorSpacePoint PreviousPoint;
// set the initial values, so you don't get a uninstantiated object error.
PreviousPoint.X = 0;
PreviousPoint.Y = 0;
Private Void EventHandlerForMovingKinect(args e) {
// If there is some sort of event handler that fires each time your move the kinect or whatever, we can put the rest of the code here.
line.Y1 = PreviousPoint.Y;
line.X2 = handtipPoint.X;
line.Y2 = handtipPoint.Y;
PreviousPoint = handtipPoint;
canvas.Children.Add(line);
}
}
显然这是伪代码,如果没有更多的实际代码,这是我能做的最好的代码。这样可以防止您获取null对象,并且由于值不会在事件处理程序中被覆盖,因此值应该正确更新以绘制行。
这些文章也可能有所帮助:
答案 1 :(得分:0)
我仍然不清楚这里究竟是什么问题。但是,根据您对其他答案的评论,似乎我一小时前从我的评论中猜测可能会出现问题。在这种情况下,这样的事情对你有用:
class Form1 : Form // making assumption your code is in a Form
{
ColorSpacePoint? PreviousPoint;
// I have no idea what the actual event handler is supposed to look like.
// This is just a wild guess based on the little bit of code you posted.
void KinectEventHandler(object sender, KinectEventArgs handtip)
{
CameraSpacePoint handtipPosition = handtip.Position;
ColorSpacePoint handtipPoint = _sensor.CoordinateMapper
.MapCameraPointToColorSpace(handtipPosition);
if (PreviousPoint != null)
{
ColorSpacePoint previousPointValue = (ColorSpacePoint)PreviousPoint;
line.X1 = previousPointValue.X;
line.Y1 = previousPointValue.Y;
line.X2 = handtipPoint.X;
line.Y2 = handtipPoint.Y;
canvas.Children.Add(line);
}
PreviousPoint = handtipPoint;
}
}
以上声明了一个"可空的"事件处理程序方法之外的ColorSpacePoint
的实例。它默认初始化为null
。在事件处理程序中,仅当此值不为空时才添加一行,即已经接收到初始点。在任何一种情况下,当前点都会替换PreviousPoint
的当前值,以便下次调用事件处理程序时可以使用该值。
请注意,我假设ColorSpacePoint
实际上是值类型(即struct
)。我从您显示的错误消息中推断出这一点,该错误消息应仅来自值类型。但如果它是引用类型(即class
),那么您不需要将该字段声明为"可以为空的" type,因为引用类型已经可以为空。在这种情况下,您可以将字段声明为ColorSpacePoint PreviousPoint
,然后直接使用该字段(例如line.X1 = PreviousPoint.X;
),而不是先将其复制到本地。
(实际上,你绝对不需要首先将它复制到本地......你可以使用例如PreviousPoint.Value.X
,但因为你正在访问多个字段,我想把它移到一个局部变量,为了清晰起见,减少对可空类型的访问。)