2016-03-21 14 views
-2

Ich versuche, Linien auf Leinwand mit meinen KINECT v2 rechten Handtipp Positionen zu zeichnen. Ich bekomme von dieser Codezeile meine rechten Tipppositionen.Zeichnen von Linien mit Kinect v2 C# wpf

CameraSpacePoint handtipPosition = handtip.Position; 
ColorSpacePoint handtipPoint = _sensor.CoordinateMapper.MapCameraPointToColorSpace(handtipPosition); 

Und dies ist mein Code-Schnipsel für die Linien zeichnen, habe ich einen weiteren Punkt definiert X1 und Y1 zu füttern, um meine Linie Koordinaten als so

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); 

aber wenn ich PreviousPoint verwenden für Koordinaten zuweisen Meine X1 und Y1 Parameter Ich bekomme den Fehler 'Verwendung von möglicherweise nicht zugewiesenen Feld X' (Was ich rate ist Ursache PreviousPoint hat keinen Wert am Anfang) und wenn ich previousPoint Werte für X und Y auf 0, auf meiner Leinwand ich zeichne Linien von einem festen Punkt (0,0), da nur X2 und Y2 meinen Handpositionen folgen.

Bitte helfen Sie mir, diese Situation zu korrigieren, schätzen Sie alle Vorschläge und Hilfe.

+0

Von dem kleinen Code, den Sie gepostet haben, ist der Fehler richtig: Sie haben eine lokale Variable 'PreviousPoint' deklariert und dann versucht, sie zu verwenden, bevor Sie sie initialisiert haben. Ohne eine gute [mcve] ist es nicht wirklich klar, was Sie reparieren müssen. Wenn Sie einen vorherigen Punkt möchten, müssen Sie die Variable an einen längeren Ort (z. B. ein Instanzfeld) setzen, sie initialisieren _once_ und dann keine Linie zeichnen, bis Sie zwei verschiedene Punkte erhalten haben. Ich sehe nicht, wie diese Frage überhaupt etwas mit Kinect zu tun hat; dass Sie Punkte von der Kinect API erhalten, scheint tangential zur eigentlichen Frage zu sein. –

+0

Ich möchte den vorherigen Punktwert nur einmal initialisieren, weil er am Anfang keinen Wert hat. Nach dem Zünden des Event-Handlers füttert der Kinect-Sensor Gelenkpositionen, die eventuell den vorherigen Punkt füllen. Bis dahin möchte ich es nur instanziieren, nur einmal, damit ich keinen Null-Objektfehler bekomme. – Sda

Antwort

0

Es ist immer noch nicht klar, was mir das genaue Problem hier ist. Basierend auf Ihrem Kommentar zu der anderen Antwort, scheint es, als ob meine Vermutung von meinem Kommentar vor einer Stunde auf dem Papier stehen könnte. In diesem Fall, so etwas wie dies sollte für Sie arbeiten:

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;       
    } 
} 

Die oben erklärt eine „nullable“ Instanz von ColorSpacePoint, außerhalb der Event-Handler-Methode. Es wird standardmäßig auf null initialisiert. In der Ereignisbehandlungsroutine wird nur dann eine Zeile hinzugefügt, wenn dieser Wert nicht immer Null ist, d. H. Ein Anfangspunkt wurde bereits empfangen. In beiden Fällen ersetzt der aktuelle Punkt den aktuellen Wert PreviousPoint, sodass dieser Wert beim nächsten Aufruf des Ereignishandlers verwendet werden kann.

Beachten Sie, dass ich annehme, ColorSpacePoint ist in der Tat ein Werttyp (d. H. Ein struct). Ich folge aus der angezeigten Fehlermeldung, die nur von Werttypen kommen soll. Wenn es sich jedoch um einen Referenztyp handelt (z. B. class), müssen Sie das Feld nicht als "Nullwert" deklarieren, da Referenztypen bereits Nullwerte enthalten können. In diesem Fall können Sie das Feld als ColorSpacePoint PreviousPoint deklarieren und dieses Feld dann direkt verwenden (z. B. line.X1 = PreviousPoint.X;), anstatt es zuerst in eine lokale Kopie zu kopieren.

(Eigentlich müssen Sie es nicht wirklich zu einem lokalen zuerst irgendwie kopieren ... Sie könnten einfach zB PreviousPoint.Value.X verwenden, aber weil Sie auf mehrere Felder zugreifen, möchte ich es auf eine lokale Variable für Klarheit verschieben und um den Zugriff auf den NULL-fähigen Typ zu reduzieren).

+0

Vielen Dank Peter! Das hat das Problem gelöst! Es tut mir leid, dass ich keine ausreichenden Informationen zur Verfügung gestellt habe, ich verwende wpf und ja ColorSpacePoint ist eine Struktur mit x- und y-Werten, die vom Sensor eingespeist werden. Dies löste das Problem der Instanziierung und erlaubt mir nun, auf meiner Leinwand zu zeichnen. Ich arbeite jetzt daran, die Koordinaten richtig zu machen. Vielen Dank, ich freue mich, dass Sie sich für die ausführliche Erklärung Zeit genommen haben. War sehr hilfreich! @Nobody, vielen Dank auch – Sda

+0

Froh, dass Sie die Antwort hilfreich gefunden haben. Nun, da ich eine bessere Vorstellung von dem habe, was Sie fragen wollten :), schlage ich vor, dass Sie zurückgehen und Ihren Beitrag bearbeiten, damit das Codebeispiel bessere Details liefert. Besonders erwähnenswert wäre, dass Sie die gesamte Event-Handler-Methode, die Sie hatten, wenn Sie die Frage gestellt haben, und den Kontext der Deklaration der 'PreviousPoint' -Variable deutlich zeigen, anstatt den Code in zwei separate Teile aufzuteilen, ohne den Methodensignatur selbst. Das würde viel dazu beitragen, die Frage klarer zu machen. –

0

Ich nehme an, der Code zum Zeichnen der Linien befindet sich in einem Event-Handler für den KINECT? Ist dies der Fall, instanziieren Sie das PreviousPoint-Objekt im globalen Gültigkeitsbereich.

Offensichtlich ist dies psuedo-Code, der das Beste ist, was ich ohne mehr von Ihrem tatsächlichen Code tun kann. Dies sollte verhindern, dass Sie das Null-Objekt erhalten, und da die Werte im Ereignishandler nicht überschrieben werden, sollten die Werte zum Zeichnen der Zeilen ordnungsgemäß aktualisiert werden.

können diese Artikel auch helfen:

understanding-kinect-coordinate-mapping/

kinect-painting-c-wpf-sdk-kinect

+0

Das ist eine sehr gut gemachte Antwort, der Code ist in einem Event-Handler für Kinect, wo die Körperrahmen übernommen werden und gemeinsame Positionen eingezogen werden. Sie haben mein Problem verstanden und ich bin zuversichtlich, dass Ihre Lösung funktionieren sollte, aber ich lege die ersten drei Zeilen, um Previouspoint als solche zu instanziieren 'public partially class MainWindow: Fenster { private ColorSpacePoint PreviousPoint; PreviousPoint.X = 0; PreviousPoint.Y = 0; ' // Gefolgt von anderen Event-Handlern und Membervariablendeklarationen Ich erhalte erneut einen Fehler, ungültiges Token '=' in der Klasse struct oder interface member zu sagen. – Sda

+0

@Sda: Sie erhalten Compiler-Fehler, weil der Autor der Antwort nicht bemüht, gültigen C# -Code zu schreiben. Sie können entweder Ihr eigenes C# -Knowledge verwenden, um den obigen ungültigen Code in etwas zu übersetzen, das kompilieren würde, oder hoffen und warten, bis der Autor die Antwort revidiert hat. –

+0

Ja, tut mir leid, ich bin ziemlich neu in C# und ich lerne immer noch, konstruktives Feedback ist willkommen, ich suche jetzt den Fehler, um ihn zu beheben. Ich verstehe die vorgeschlagene Lösung von Nobody und es macht durchaus Sinn, derzeit versucht es zu implementieren und den Fehler zu umgehen. Danke @Peter. – Sda