Bilddaten, Pixel und Koordinaten in Python 3.2 auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pynoo
User
Beiträge: 8
Registriert: Freitag 27. Mai 2011, 17:21

Hallo. Ich bin noch Neuling in Python.

Ich versuche ein GNU Motion Tracking Programm/Plug-in für Blender zu schreiben.

Dazu ist es allerdings notwendig Farbwerte und Pixelkoordinaten aus einem Bild auszulesen. Ich habe schon von PIL gehört. Das funktioniert aber unter Python 3.2 nicht.

Prinzipiell ist das Programm 'relativ' schnell geschrieben selbst mit meinen jetzigen Kenntnissen. Dass das ganze aber beim Auslesen der Bilder schon scheitert ist frustrierend. Gibt es einen work-around? Im zweifel reicht auch binäres auslesen dann bräuchte ich aber auch Infos zum Aufbau des entsprechenden Bildformates.
pynoo
User
Beiträge: 8
Registriert: Freitag 27. Mai 2011, 17:21

So hier ist ein kleines Update:
Das Problem ist eigentlich schon damit gelöst:

AText=""
for c in DatenText: AText += '%02X'%ord(c)
print("Bild Besteht aus:\n"+AText)

Ich freue mich aber über jede Idee die besser ist!

Zwischenzeiitlich wollte ich das ganze in bin-Daten umzuwandeln.
Bei einem Test dafür bekomme ich aber immer diesen Fehler. Sollte das nicht eigentlich funktioniren?

print (binascii.crc32("hello world"))

Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
print (binascii.crc32("hello world"))
TypeError: 'str' does not support the buffer interface
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

'crc32' erwartet bytes als Wert, Du schickst allerdings einen string.

Code: Alles auswählen

print(binascii.crc32(b'hello world'))
müsste funktionieren.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Noch als Nachtrag, weshalb Du ab Python 3.x bei der Übergabe eines strings an crc32 ein 'b' vor den string setzen musst:
Text vs data instead of unicode vs 8bit

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Drache
User
Beiträge: 51
Registriert: Montag 29. November 2010, 21:51
Wohnort: Berlin
Kontaktdaten:

Hallo pynoo,

auch wenn ich dir wahrscheinlich nicht sehr viel helfen kann,
so interessiert mich Blender und deine Idee eines Bewegungs-Sensors anhand von
realen Bildern/Filmen sehr.
Wäre dir für ein paar Infos dankbar.

Viel Erfolg
Drache
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Blender hat doch interne Bibliotheken zum auslesen der Bilder und diese sollten mit der Python API verknüpft sein. Du musst dir die entsprechende API Dokumentation von Blender raussuchen. In 2.5x zB. kann man einfach ein Bild per "bpy.ops.image.open" bzw. "bpy.types.BlendDataImages.load" öffnen und das resultierende "bpy.types.Image", sollte dann die blanko Daten besitzen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
pynoo
User
Beiträge: 8
Registriert: Freitag 27. Mai 2011, 17:21

Danke ich werde mir das mal anschauen. Aber mich durch die Blender API zu wühlen ist fast so als würde ich noch eine Sprache lernen. Wenn das funktioniert und es möglich ist könnte ich sogar versuchen direkt ein bzw. zwei Viedos vom Squenzer auszulesen. Fragt sich nur wie schell alles am Ende läuft aber ich denke mal positiv.

Danke nochmal für die Antworten!
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ja, ich weiß, aber das sollte einen nicht aufhalten :wink:
Es gibt auch eine ImageSequence und MovieSequence. Damit habe ich aber noch nicht gearbeitet, musst halt mal zusehen welche Daten du brauchst. Es ist aber auf jeden Fall machbar :D
Eventuell kann man dir im Blenderforum noch etwas konkreter helfen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
pynoo
User
Beiträge: 8
Registriert: Freitag 27. Mai 2011, 17:21

Da ich bisher im Blenderforum keine Aantwort bekommen habe habe ich die ASCii- Ausleseversion meines Programmes für Bilddaten weiterverfolgt. Im Grunde ist das Programm schon fast fertig. Allerdings bin ich auf ein bis zwei andere Porobleme gestoßen:

1. Ich brauche ein freies Bilddatenformat für die Bildsequenz (glaube ich zumindest)
2. Und das ist das richtige Problem. Ich habe versucht tga-Daten hexadezimal auszulesen aber es scheint als würden schwarze pixel immer ein byte größer sein. D.h. da wo Schwarz sein sollte steht sowas hier:5C 78 30 30. Außerden weis ich nicht ob es Lizenzfrei ist. PNG-Daten produzieren auch ohne Kompression noch eigenartigere Fehler:

return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 254: character maps to <undefined>

Meinde Fragen sind also wie folgt:
1. Gibt es ein freies Bildformat, dass sich besser eignet?
oder
2. Eine elegante Möglichkeit alle diese Stellen im Hex-string durch einen Wert wie 00 00 00 zu ersetzen oder überhaupt eine elegantere Möglichkeit
Ich würde ja versuchen mit einem Loop alle Vorkommnisse zu verändern aber ich fürchte das die Geschwindigkeit am Ende stark reduzieren könnte.
BlackJack

@pynoo: Was meinst Du mit ”ASCii- Ausleseversion”? Der Fehler bei PNG deutet darauf hin, dass Du versuchst Binärdateien als Text zu verarbeiten!? Das geht natürlich nicht. Schreibst Du das Laden und dekodieren von Bilddateien in Python selber? Ist Dir die Komplexität des TGA- oder PNG-Formates bewusst? Also das beide in verschiedenen Bit-Tiefen, mit oder ohne Alpha-Kanal vorkommen können? Und das TGA-Bilder auch ”upside down” und RLE-Komprimiert gespeichert sein können? Und PNG Bilder in ”Häppchen” aufteilt, die komprimiert und mit verschiedenen, verlustfrei umkehrbaren Filtern behandelt worden sein können!?
pynoo
User
Beiträge: 8
Registriert: Freitag 27. Mai 2011, 17:21

Nein dessen bin ich mir nicht bewusst deswegen frage ich ja. Bin Anfänger sag ich doch.

Das Hexadezimale auslesen funktioniert ja bei tga (wenn es in ASCII ist) Kopf und Ende müssen natürlich teilweise abgeschitten werden sollten also auch gleich lang sein. Komprimiert und upside down darf das ganze auch natürlich auch nicht sein. Das kann man aber mit anderer Sofware erreichen.
Das es mit png wohl nicht funktioniert habe ich auch schon gemerkt.

Ich will die Daten ja auch nicht verändern sondern einzig und allein eine Möglichkeit haben, mit der ich Farbe und Position lesen kann. Wenn man die Größe der Bilder kennt und sie in einer fortlaufenden Struktur aufgebaut sind, kann man die Position leicht errechnen. Und irgenwie müssen es ja sämtliche Bildverarbeitungsprogramme mit Pipettenwerkzeugen ja auch können.

Ich brauche auch keine hohe Farbtiefe ich will ja nur die Positionen von Markierungen ausgeben und Suche ein Format in das ich die Bilder konvertieren kann. Ein Format welches die denkbar einfachste, unverändertste Form, die man sich für die Bildspeicherung vorstellen kann, nutzt, also fortlaufende rgb-Farbwerte mit je 255 Faben. Ich bin mir eigentlich sicher, dass es so etwas geben muss.
BlackJack

@pynoo: Was bitte ist ”hexadezimales auslesen” bei TGA? Und was ist ein TGA ”in ASCII”? TGA ist ein Binärformat, das kann man nicht als Textdatei verarbeiten.

Der Pipette in Bildverarbeitungswerkzeugen ist es völlig egal in welchem Format die Bilddaten mal vorlagen bevor sie in das Programm geladen wurden. Kein vernünftiges Programm operiert bei so etwas auf einem externen Bildformat.

Denkbar einfachstes Format dürften die Netpbm-Formate sein, also für RGB-Bilder dann `ppm`\s. Aber Achtung: Der Header hat eine variable Länge und das solltest Du auch berücksichtigen!

Letztlich verstehe ich aber nicht warum Du nicht die Werkzeuge verwendest, die Blender schon anbietet.
pynoo
User
Beiträge: 8
Registriert: Freitag 27. Mai 2011, 17:21

Verzeihung habe ich verwechselt. Png kann verschiednen codiert werden PGM/PPM/PPM ging dort als ASCII oder binär. Ich bin mir bisher noch nicht bewusst gewesen was das bedeutete. Eigentlich ist es auch egal ob binär oder ascii kann man ja beides umwandeln. Es ist eben nur ein Problem, wenn das wechselt und man es nicht merkt. :(

Hexadezimales auslesen?...: Naja ein Hexadezimaler String ist schön übersichtlich. Bevor das falsch verstanden wird, ich meine damit den String der die Hexadezimalen Werte repäsentiert.

Ich habe duchaus vor die Blender-Tools zu verwenden. Es fällt mir aber deutlich einfacher das Programm für Blender umzuschreiben, wenn ich schon ein Beipielprogramm geschrieben habe. Außerdem muss ich auch dort erst einen Weg finden der nuzbar und sinnvoll ist.

Wieso ist das mit der Pipette so abwegig es wäre auch durchaus möglich Punkte anhand einer Bildausgabe zu finden? Und wer sagt, dass mein Programm vernünfitg ist? :wink:

Danke ich schaue mir die Netpbm-Formate mal an.
BlackJack

@pynoo: Eine Zeichenkette die Bytewerte als hexadezimale Zahlen darstellt ist zwar etwas übersichtlicher als zum Beispiel die `repr()`-Darstellung von Byteketten, aber das ist ja nur etwas für den Menschen. Wenn man mit den Bytewerten arbeiten möchte, sollte man das nicht auf der Ebene von einer Zeichenkettendarstellung der Werte tun, sondern mit den passenden Datentypen, also zum Beispiel `bytes`/`bytearray` in Python 3.x oder `str` in Python 2.x.

Unter einer ”Bildausgabe” stelle ich mir eher die Darstellung eines Bildes auf einem Ausgabegerät wie Monitor oder Drucker vor. Das ist etwas anderes als ein Dateiformat, welches ein Bild enthält. Es ist abwegig, dass das Pipetten-Werkzeug einer Bildverarbeitung direkt auf Bilddateien arbeitet, weil man es dann a) für zig verschiedene Bildformate implementieren müsste, statt nur für drei bis vier interne Datenstrukturen und es b) bei einigen Bildformaten recht kompliziert und ineffizient ist diese Daten direkt aus der Datei zu holen. Im schlechtesten Fall müsste man für das ermitteln der Farben an einer Position die kompletten Bilddaten dekodieren/dekomprimieren.

Viel sinnvoller ist es das laden, dekodieren, dekomprimieren der Bilddaten in eine interne, einfache Datenstruktur, von Operationen auf den Daten zu trennen. Dann ist es für die Operationen selbst nicht mehr wichtig in welchem Format die Daten mal in einer Datei vorlagen.
Antworten