C# 使用Kinect v2 c wpf绘制线条

C# 使用Kinect v2 c wpf绘制线条,c#,wpf,canvas,kinect,lines,C#,Wpf,Canvas,Kinect,Lines,我试图用我的KINECT v2右手尖位置在画布上画线。我从这一行代码中得到我的右手尖位置 CameraSpacePoint handtipPosition = handtip.Position; ColorSpacePoint handtipPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(handtipPosition); 这是我画线的代码片段,我定义了另一个点,将X1和Y1坐标输入到我的线中 ColorSpacePoin

我试图用我的KINECT v2右手尖位置在画布上画线。我从这一行代码中得到我的右手尖位置

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在开始时没有值,如果我将X和Y的PreviousPoint值固定为0,在我的画布上,我从一个固定点0,0画线,因为只有X2和Y2跟随我的手的位置


请帮助我纠正这种情况,感谢您的建议和帮助。

我假设用于划线的代码位于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);
  }
}
显然,这是psuedo代码,这是我在没有更多实际代码的情况下所能做的最好的代码。这将阻止您获取null对象,并且由于事件处理程序中的值没有被覆盖,因此这些值应该正确更新以绘制线

这些文章也可能有助于:


我还不清楚到底是什么问题。然而,根据你对另一个答案的评论,我从一小时前的评论中做出的猜测似乎是正确的。在这种情况下,类似的方法应该适合您:

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。在事件处理程序中,仅当该值不是空值(即已接收到初始点)时,才会添加一行。在任何一种情况下,当前点都会替换上一个点的当前值,以便下次调用事件处理程序时可以使用该值

请注意,我假设ColorSpacePoint实际上是一种值类型,即结构。我从您显示的错误消息中推断出这一点,它应该只来自值类型。但如果它是引用类型,即类,则不需要将字段声明为可为null的类型,因为引用类型已经可以为null。在这种情况下,您可以将该字段声明为ColorSpacePoint PreviousPoint,然后直接使用该字段,例如line.X1=PreviousPoint.X;而不是先将其复制到本地


实际上,您不需要严格地首先将其复制到本地…您可以使用例如PreviousPoint.Value.X,但由于您要访问多个字段,为了清晰起见,我喜欢将其移动到本地变量,并减少对可为空类型的访问。

从您发布的少量代码中,错误是正确的:您在初始化之前声明了一个局部变量PreviousPoint,然后尝试使用它。如果没有一个好的解决方案,您就不清楚需要修复什么。如果你想要一个上一个点,你需要把变量放在一个持续时间更长的地方,例如一个实例字段,初始化它一次,然后在你收到两个不同的点之前不要画一条线。我不明白这个问题与Kinect有什么关系;从Kinect API获得积分似乎与实际问题无关。我只想初始化上一个点的值一次,因为在开始时它没有值。但在事件处理程序触发后,kinect传感器将提供关节位置,最终填充上一点。在那之前,我只想实例化它一次,这样我就不会得到一个空对象错误。这是一个很好的答案,代码位于Kinect的事件处理程序中,在该事件处理程序中获取身体框架并输入关节位置。您已经理解了我的问题,我相信您的解决方案应该可以正常工作,但我将前三行代码放在了“公共部分类主窗口:窗口”下,以实例化上一点{private ColorSpacePoint PreviousPoint;PreviousPoint.X=0;PreviousPoint.Y=0;//后面跟着其他事件处理程序和成员变量声明,我再次收到一个错误,在类结构或接口成员中说无效的标记“=”。@Sda:您收到编译器错误,因为答案的作者没有编写有效的C code.您可以使用自己的C语言知识将上述无效代码翻译成可以编译的代码,也可以希望并等待作者修改答案。是的,对不起,我对C语言还相当陌生,我还在学习,非常感谢建设性的反馈,我现在正在查找错误以修复它。我确实理解建议的解决方案在无人参与的情况下,它是完全有意义的,目前正在尝试实现它并绕过错误。谢谢@Peter。非常感谢Peter!这解决了问题!很抱歉没有提供足够的信息,我正在使用wpf,是的,ColorSpacePoint是一个结构,具有从传感器输入的x和y值。这解决了insta我正在解决这个问题,现在允许我在画布上画画
正在努力获得正确的坐标。非常感谢,非常感谢你抽出时间来做详细的解释。这对我很有帮助@没人,谢谢。很高兴你发现这个答案很有帮助。现在我对你想问的问题有了更好的了解,我建议你回去编辑你的文章,这样代码示例就可以提供更好的细节。特别值得注意的是,您需要显示在提问时使用的整个事件处理程序方法,并清楚地显示PreviousPoint变量声明的上下文,而不是将代码拆分为两个单独的部分,而不使用方法签名本身。这将大大有助于使问题更加清楚。