簡體   English   中英

使用 Kinect v2 c# wpf 繪制線條

[英]Drawing Lines Using Kinect v2 c# wpf

我正在嘗試使用我的 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 的 previousPoint 值和Y 到 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);
  }
}

顯然,這是偽代碼,這是我在沒有更多實際代碼的情況下所能做的最好的事情。 這應該可以防止您獲取空對象,並且由於值不會在事件處理程序中被覆蓋,因此值應該正確更新以繪制線條。

這些文章也可能有幫助:

理解-kinect-坐標映射/

kinect-painting-c-wpf-sdk-kinect

我仍然不清楚這里的確切問題是什么。 但是,根據您對另一個答案的評論,我一小時前的評論中的猜測似乎是正確的。 在那種情況下,這樣的事情應該適合你:

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 在事件處理程序中,僅當該值不是仍然為 null 時才添加一行,即已經接收到初始點。 無論哪種情況,當前點都會替換PreviousPoint的當前值,以便下次調用事件處理程序時可以使用該值。

請注意,我假設ColorSpacePoint實際上是一種值類型(即struct )。 我從您顯示的錯誤消息中推斷出這一點,它應該只來自值類型。 但是如果它是一個引用類型(即一個class ),那么你不需要將該字段聲明為“可空”類型,因為引用類型已經可以為空。 在這種情況下,您可以將該字段聲明為ColorSpacePoint PreviousPoint ,然后直接使用該字段(例如line.X1 = PreviousPoint.X; ),而不是先將其復制到本地。

(實際上,無論如何,您並不嚴格需要首先將其復制到本地……您可以只使用例如PreviousPoint.Value.X ,但是因為您正在訪問多個字段,為了清楚起見,我喜歡將其移動到本地變量並減少對可空類型的訪問)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM