Nebirosh
02.05.2005, 12:55
Grundlegend geht es bei diesem Projekt um high speed Bildsequenzen ( alle 5 ms ein Bild ).
Das gesammte Projekt ist im medizinisch - technischen Bereich angesiedlt hat aber viel mit Objekterkennung und Auswertung von 3D Koordinaten auf einem Linuxsystem zu tun.
Leider haben weder mein " Auftraggeber " noch ich das Geld uns die entsprechenden CMOS BIldsensoren als Massenwahre in den Keller zu legen, daher der Gedanke die Hauptoberflächen Algorithmen etc zunächst mit Hilfe von Webcams zu erstellen und zu testen.
Da die "erkennenden Algorithmen " auf maschinenbasis implementiert sind bleiben leider nur wenige Bildformate übrig die im sog. lossless Format vorliegen und einigermaßen dokumentiert sind. Ich habe mich zunächst auf das .PNG Format eingeschossen.
Leider sind alle angebotenen libs oder sourcecodes für die Darstellung auf dem Monitor ausgelegt, lassen sich auch nicht derart umschreiben, so das eine Ausgabe in einer Datei erfolgt.
Die Grundstrukturen einer PNG Datei sowie die Verwendung findenden Kompriemierungsalgorithmen ( Huffman Code etc. ) sind mir hinlänglich bekannt.
Mein derzeit größtes Problem besteht in der Wiederherstellung des Binärbaumes um dann bitweise über das von Huffman beschriebene Verfahren die einzelnen Werte darstellen zu können.
Wenn jemand hierzu Informationen oder bereits Kenntnisse hat, bitte lasst mich nicht dumm sterben.
Nun aber noch etwas zur Objekterkennung. Da die Kameras fest montiert sind wird der Hintergrund auf jedem Bild der Sequenz annähernd gleich sein ( Tests haben ergeben das bei einem Graustufenbild mit 255 Abstufungen die Abweichung bei gleicher Beleuchtung maximal 3 beträgt ) Der erste Schritt besteht nun darin zwei aufeinanderfolgende Bilder in zwei Puffer zu laden. Der Puffer ist nichts anderes als ein zweidimensionales Array in der Form [640]*[480] bei einem Bild mit den Dimensionen 640*480. Da sich beide Werte schlecht bis garnicht durch 3 teilen lassen wird eine 4*4 Matrix beutzt und die Pixelwerte hineingeschrieben. Somit besteht jedes Bild aus 160 * 120, 4*4 Feldern. ( die Gründe warum das Bild nochmal in die 4*4 Felder zerlegt wird führe ich später aus ) Nun wird aus jedem 4*4 Feld der Mittelwert gebildet und in einem 160*120 großen Feld hinterlegt. Dies geschieht analog zum nachfolgen Bild der Sequenz. Ein einfacher Verglech ( hierbei wird natürlich die Abweichung berücksichtigt ) ob es sich um ein statisches oder dynamisches Feld handelt folgt. Ist der Inhalt statisch werden die Werte auf 0 gesetzt, andernfalls behält das Feld seine ursprünglichen Werte. Das grobe Umfeld um das bewegte Objekt wird somit schwarz. Sollte sich dies mehr als 3 mal in drei aufeinanderfolgenden Bildern wiederholen wird in den nächsten 3 Bildern sofort dieser Bereich auf 0 gesetzt, und erst beim 4 und 5 Bild erneut überprüft ( daher der Umweg über die 4*4 Matrix, da eine Sequenz aus bis zu 60000 einzelnen Bildern bestehen kann ). Die Felder != 0 werden in einem weiteren Schritt genauer geprüft in dem aus der 4*4 Matrix 4 2*2 Felder erstellt werden die nach dem gleichen Prinzip geprüft werden. Durch diese sozusagen iterative Annäherung wird, da nicht jedes Feld in jedem Bild grundsätzlich geprüft werden muss der doch erhebliche Aufwand an Rechenleistung doch um ein vielfaches reduziert.
Theoretisch ließe sich dieses Verfahren auch auf Microprozessorbasis aufbauen ( allerdings dürfte bei einer Kameraleistung von 200 fps die Latenz mit der das System reagieren kann erheblich sein )
Das gesammte Projekt ist im medizinisch - technischen Bereich angesiedlt hat aber viel mit Objekterkennung und Auswertung von 3D Koordinaten auf einem Linuxsystem zu tun.
Leider haben weder mein " Auftraggeber " noch ich das Geld uns die entsprechenden CMOS BIldsensoren als Massenwahre in den Keller zu legen, daher der Gedanke die Hauptoberflächen Algorithmen etc zunächst mit Hilfe von Webcams zu erstellen und zu testen.
Da die "erkennenden Algorithmen " auf maschinenbasis implementiert sind bleiben leider nur wenige Bildformate übrig die im sog. lossless Format vorliegen und einigermaßen dokumentiert sind. Ich habe mich zunächst auf das .PNG Format eingeschossen.
Leider sind alle angebotenen libs oder sourcecodes für die Darstellung auf dem Monitor ausgelegt, lassen sich auch nicht derart umschreiben, so das eine Ausgabe in einer Datei erfolgt.
Die Grundstrukturen einer PNG Datei sowie die Verwendung findenden Kompriemierungsalgorithmen ( Huffman Code etc. ) sind mir hinlänglich bekannt.
Mein derzeit größtes Problem besteht in der Wiederherstellung des Binärbaumes um dann bitweise über das von Huffman beschriebene Verfahren die einzelnen Werte darstellen zu können.
Wenn jemand hierzu Informationen oder bereits Kenntnisse hat, bitte lasst mich nicht dumm sterben.
Nun aber noch etwas zur Objekterkennung. Da die Kameras fest montiert sind wird der Hintergrund auf jedem Bild der Sequenz annähernd gleich sein ( Tests haben ergeben das bei einem Graustufenbild mit 255 Abstufungen die Abweichung bei gleicher Beleuchtung maximal 3 beträgt ) Der erste Schritt besteht nun darin zwei aufeinanderfolgende Bilder in zwei Puffer zu laden. Der Puffer ist nichts anderes als ein zweidimensionales Array in der Form [640]*[480] bei einem Bild mit den Dimensionen 640*480. Da sich beide Werte schlecht bis garnicht durch 3 teilen lassen wird eine 4*4 Matrix beutzt und die Pixelwerte hineingeschrieben. Somit besteht jedes Bild aus 160 * 120, 4*4 Feldern. ( die Gründe warum das Bild nochmal in die 4*4 Felder zerlegt wird führe ich später aus ) Nun wird aus jedem 4*4 Feld der Mittelwert gebildet und in einem 160*120 großen Feld hinterlegt. Dies geschieht analog zum nachfolgen Bild der Sequenz. Ein einfacher Verglech ( hierbei wird natürlich die Abweichung berücksichtigt ) ob es sich um ein statisches oder dynamisches Feld handelt folgt. Ist der Inhalt statisch werden die Werte auf 0 gesetzt, andernfalls behält das Feld seine ursprünglichen Werte. Das grobe Umfeld um das bewegte Objekt wird somit schwarz. Sollte sich dies mehr als 3 mal in drei aufeinanderfolgenden Bildern wiederholen wird in den nächsten 3 Bildern sofort dieser Bereich auf 0 gesetzt, und erst beim 4 und 5 Bild erneut überprüft ( daher der Umweg über die 4*4 Matrix, da eine Sequenz aus bis zu 60000 einzelnen Bildern bestehen kann ). Die Felder != 0 werden in einem weiteren Schritt genauer geprüft in dem aus der 4*4 Matrix 4 2*2 Felder erstellt werden die nach dem gleichen Prinzip geprüft werden. Durch diese sozusagen iterative Annäherung wird, da nicht jedes Feld in jedem Bild grundsätzlich geprüft werden muss der doch erhebliche Aufwand an Rechenleistung doch um ein vielfaches reduziert.
Theoretisch ließe sich dieses Verfahren auch auf Microprozessorbasis aufbauen ( allerdings dürfte bei einer Kameraleistung von 200 fps die Latenz mit der das System reagieren kann erheblich sein )