[英]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);
}
}
顯然,這是偽代碼,這是我在沒有更多實際代碼的情況下所能做的最好的事情。 這應該可以防止您獲取空對象,並且由於值不會在事件處理程序中被覆蓋,因此值應該正確更新以繪制線條。
這些文章也可能有幫助:
我仍然不清楚這里的確切問題是什么。 但是,根據您對另一個答案的評論,我一小時前的評論中的猜測似乎是正確的。 在那種情況下,這樣的事情應該適合你:
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.