Speicherbedarf Pixel vs. Polygon?

Shark88

Mitglied
Hallo zusammen,

ich plane gerade ein Java Programm mit Processing mit Kinect-Unterstützung. Ich habe ich in die Kinect-Integration mittels SimpleOpenNI bereits eingearbeitet und bräuchte einmal ein paar erfahrene Meinungen zu folgender Sachlage:

Als Ausgangsarray habe ich ein Arry mit allen Pixel der Kinectkamera in der Aufläsung 640x480. Dieses Array enthält die Pixelinformationen des Users vor der Kamera. Ich möchte nun diese Information zum einen Speichern um die Bewegungen später wiedergeben zu können, zum anderen wird Text angezeigt, indem der User als farbige Buchstaben hervorgehoben werden soll.
Jetzt stellt sich mir die grundlegende Frage, ob ich die Pixel behalten soll oder ob ich die Silhouette in ein Polygon umwandeln sollte, das ich dann vielleicht effizienter Speichern kann?

Mein Anzeigefenster hat außerdem eine höhere Auflösung, sodass ich die Silhouette noch skalieren müsste, bzw gleiche ich momentan die Pixel ab und kontrolliere an welchen Stellen später ein Buchstabe steht und ändere von diesem die Farbe.

Vielleicht ließe sich das ja geschickter mit Polygonen erledigen?
Hier wird z.b. das ganze mittels Polygonen umgesetzt: Kinect Physics Tutorial for Processing

Mit was sollte ich vor allem in Hinblick auf die Aufzeichnung der Bewegung eher anfangen?

Vielen Dank schonmal für eure Hilfe!
 
Ohne wirklich inhaltlich was dazu sagen zu können: 640x480x4byte = 1.2MB. Selbst wenn es 100 so viel ist, könnte es sein, dass man die Daten nicht mehr im Speicher findet, weil es so wenige sind 😉 Was ich sagen will: Die Entscheidung sollte (hier bzw. allgemein bei solchen Größenordnungen) nicht vom Speicherbedarf abhängig gemacht werden, sondern davon, was für den Anwendungsfall das bessere ist.
 
Kann es sein, dass die Farbinformationen in den Pixeln Tiefenangaben des gescannten Körpers darstellen (z.B. rote ganz weit hinten und blaue ganzweit vorne)? Wenn du diese verwirfst, enfällt zukünftig die Möglichkeit, Entfernungen auszuwerten. Wenn die ohnehin nicht wichtig sind, ist's egal, aber wenn, dann mach zumindest ein LPO (Low Polygon Object) draus.
 
Vielen Dank für eure Anregungen!

Ich bin in der Sache etwas weitergekommen, sodass zumindest scho einmal die Echtzeitgrafik vernünftig läuft. Ich habe jetzt für jeden User eine eigene Map als Array mit 640x480 Werten. Das Array ist nur mit 0 und 1 gefüllt, an den 1er Stellen ist entsprechend der User. Da auch mehrere User aufgezeichnet werden sollen, habe ich potenziell mehrere solcher Arrays. Bei 25-30 Frames pro Sekunde und 3 Usern fallen da schon eine ganze Menge an Daten an.
Sicherlich gibt es einen effizienteren Weg als jeweils das komplette Array zu speichern. Mit den Pixelangaben komme ich bei der Ausgabe allerdings ganz gut zurecht, sodass ich es nicht erst in ein Polygon umwandeln wollte.

Ich benutze die SimpleOpenNI Libary für Processing, diese kann zwar die Kinect Daten aufzeichnen, allerdings gibt es noch Probleme mit dem abspielen, die .oni Files lassen sich einfach nicht mehr einlesen...

@javaman13 Danke dir für den Link, das schaue ich mir gerne mal an! Englisch ist kein Problem.
 
Hat noch jemand eine Idee wie ich die Datenmengen sinnvoll verarbeiten könnte um sie effizient auf die Festplatte zu schreiben?
1,2MB pro Frame und pro User sind doch etwas zu hoch.

@javaman13 Den Code kann ich dir gerne mal zur Verfügung stellen, sobald ich fertig bin.
 
Nimm statt 640 * 480 Bytes für 0 und 1 (boolean) die Klasse BitSet mit einer Kapazität von 640 * 480 Bits. Leider kannst du höchstwahrscheinlich in deinem Fall "BitSet.valueOf(byte[] array)" nicht verwenden, sondern müsstest es per Hand überführen:
Java:
BitSet set = new BitSet(myDataArray.length);
for(int b = 0; b < myDataArray.length; b++) {
  set.set(b, myDataArray[b] != 0);
}
Im übrigen komme ich bei 640 * 480 Byte Daten auf nur mehr 300kB. Verwendest du für diese 0en und 1en auch noch int? Naja, selbst aus diesen macht die Überführung oben nur mehr 38416 Bytes (ca. 37,5kB).
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Zurück
Oben