Guten Tag,
ich interessiere mich momentan für die Bildverarbeitung auf einem
AVR-uC.
Ich habe noch kein konkretes Projekt, möchte mich interessehalber aber
mal damit beschäftigen.
Nur finde ich im Internet keine Tutorials oder Artikel die mir wirklich
weiterhelfen.
Wenn ich zum Beispiel eine Kamera an einem AVR anschliesse (mal
unabhängig von der Rechenleistung): Wie kann ich aus dieser Kamera ein
brauchbares Bild erzeugen und weiterverarbeiten bzw. an einen PC
übermitteln?
Mir fehlt da komplett der Ansatz zu dem Thema Bildverarbeitung.
Der Hintergrund besteht darin, dass ich gerne mal ein Projekt hochziehen
möchte wo aktiv die Kamera als "Sensor" genutzt wird um z.B. mit der
Umgebung zu interagieren.
Wie und wo muss ich da anfangen um langsam aber sicher in die Richtung
gehen zu können?
Vielen Dank schonmal
Gruß
Hans schrieb:> Wie kann ich aus dieser Kamera
Welche Kamera?
> Wie und wo muss ich da anfangenAVR und Bildverarbeitung ist eine extrem ungünstige Kombination, weil du
allein zum Speichern eines Bildes viel RAM brauchst. Und weil so viele
Daten schnell nacheinander anfallen. "Viel" und "schnell" passt nicht zu
"kByte" und "12MHz"...
Lothar Miller schrieb:> Hans schrieb:>> Wie kann ich aus dieser Kamera> Welche Kamera?
Soll erstmal ein gedankenspiel sein. Konkrete Hardware habe ich noch
nicht, da ich mich erst in das Thema einlesen möchte.
>> Wie und wo muss ich da anfangen> AVR und Bildverarbeitung ist eine extrem ungünstige Kombination, weil du> allein zum Speichern eines Bildes viel RAM brauchst. Und weil so viele> Daten schnell nacheinander anfallen. "Viel" und "schnell" passt nicht zu> "kByte" und "12MHz"...
Soll also heißen, wenn es um Bildverarbeitung geht ( Dazu soll auch das
Thema mit dem interagieren mit der Umwelt gehören, evtl.
gesichtserkennung -SPÄTER) muss ein Leistungstärker Prozessor her.
Also eher in Richtung ARM?
Grundsätzlich interessiert mich grade die allgemeine Vorgehensweise. Mal
angenommen ich habe einen leistungsstarken uC mit viel Speicher und
einer Kamera.
Wie fang ich an? Wo kann ich mich schlau lesen?
Hans schrieb:> Soll also heißen, wenn es um Bildverarbeitung geht ( Dazu soll auch das> Thema mit dem interagieren mit der Umwelt gehören, evtl.> gesichtserkennung -SPÄTER) muss ein Leistungstärker Prozessor her.> Also eher in Richtung ARM?
Klingt nach einer Anwendung für RasPI.
> Wie fang ich an? Wo kann ich mich schlau lesen?
In der zugehörigen Doku:
Raspberry Pi Einführung
Das ganze KANN man mit einem völlig hochgezüchteten µC lösen - aber
niemand würde es so tun, da es genau dafür Microprozessoren gibt, die
auf vergleichsweise gigantische Ressourcen zugreifen können - und
wesentlich billiger sind, als ein hochspezialisierter Mikrocontroller,
der eigentlich STEUERN soll und nicht VERARBEITEN - deshalb auch der
Name Microcontroller für alles zum Steuern, Microprozessor für alles zum
verarbeiten der erhobenen Daten.
Bildverarbeitung geht im günstigsten Fall mit einem Raspberry pi und
einer Kamera. Oder jedem anderen Gerät, das sowohl eine Kamera, als auch
RAM, als auch Prozessorleistung hat.
Hans schrieb:> Wie fang ich an? Wo kann ich mich schlau lesen?
Was hast du denn bisher so mit Controllern gemacht? Für mich hört sich
deine Frage so an, als wolltest du von Null auf Hundert durchstarten. Wo
soll man da anfangen? Es gibt haufenweise Literatur zu Bildverarbeitung,
aber da wird selten auf Eigenheiten von Microcontrollern eingegangen.
Das ist grundsätzliches Werkzeug welches man erstmal beherrschen muss.
Wenn du schon Probleme hast dir vorzustellen wie du Rohdaten von einer
Kamera in den Controller bekommst dann solltest du erstmal ne Stufe
tiefer einsteigen.
Also wie ist denn dein Wissenstand bisher?
Hans schrieb:> Wie fang ich an? Wo kann ich mich schlau lesen?
Z.B. im Sourcecode von V4L (Video4Linux). Ein Kameratreiber bildet die
Hardware auf ein einheitliches Modell ab und spricht den Chip auf der
Kamera direkt an.
Dann wüsstest du, was es mit der Ansteuerung auf sich hat. Wenn du
allerdings einen Raspberry oder ein ähnliches Linuxboard nähmest, musst
du dich um so etwas nicht mehr kümmern und kannst direkt mit
Bildverarbeitung weitermachen.
Cyblord ---- schrieb:> Hans schrieb:>> Wie fang ich an? Wo kann ich mich schlau lesen?>> Was hast du denn bisher so mit Controllern gemacht? Für mich hört sich> deine Frage so an, als wolltest du von Null auf Hundert durchstarten. Wo> soll man da anfangen? Es gibt haufenweise Literatur zu Bildverarbeitung,> aber da wird selten auf Eigenheiten von Microcontrollern eingegangen.> Das ist grundsätzliches Werkzeug welches man erstmal beherrschen muss.> Wenn du schon Probleme hast dir vorzustellen wie du Rohdaten von einer> Kamera in den Controller bekommst dann solltest du erstmal ne Stufe> tiefer einsteigen.>> Also wie ist denn dein Wissenstand bisher?
Erfahrungen mit Microcontrollern habe ich bereits- allerdings bin ich
bisher nie über AVRs hinweggekommen. Bei mir hat es angefangen wie bei
jedem anderen (mit blinkenden LEDs) und ich habe mittlerweile das ein
oder andere Gerät oder Steuerung erfolgreich in Betrieb genommen.
Mein Problem wird eher nicht darin bestehen die Rohdaten aus der Kamera
auszulesen, sondern eher diese zu verarbeiten.
Ich möchte gerne (irgendwann) dazu kommen eine kleine Gesichtserkennung
oder ähnliches zu basteln. Also etwas was bewusst reagiert auf ein
Ereignis vor der Kamera.
Nur fehlt mir das kleine Stück Faden womit ich anfangen kann.
Mir fehlt ganz konkret das Wissen der Verarbeitung. Also :
- Wie erstelle ih aus den Rohdaten der Kamera ein Bild (Für den Anfang
reicht z.B. ein jpg)
- Wie komme ich von diesem Schritt weiter in Richtung z.B.
Gesichtserkennung.
- Und natürlich die Hardware. Soll heißen: Kann ich das ganze mit einem
Leistungsstarken ARM lösen oder sollte ich da wirklich auf Minicomputer
mit Betriebssystem zurückgreifen.
Wie gesagt ich stehe da echt auf dem Schlauch. Ein Tutorial welches
diese Nummer beschreibt habe ich auch noch nicht gefunden.
Vielen Dank für die Hilfe ;-)
> - Und natürlich die Hardware. Soll heißen: Kann ich das ganze mit einem> Leistungsstarken ARM lösen oder sollte ich da wirklich auf Minicomputer> mit Betriebssystem zurückgreifen.
Leistungsstarker ARM JA! (oder anderer Prozessor)
Minicomputer mit Betriebssystem JA!
Also kein ODER, sondern ein UND.
Hans schrieb:> Mein Problem wird eher nicht darin bestehen die Rohdaten aus der Kamera> auszulesen
doch. Genau da werden deine Probleme erst mal anfangen.
> sondern eher diese zu verarbeiten.> Ich möchte gerne (irgendwann) dazu kommen eine kleine Gesichtserkennung> oder ähnliches zu basteln. Also etwas was bewusst reagiert auf ein> Ereignis vor der Kamera.
Das konkrete Problem ist zwar nicht trivial, aber ein Bild ist im
Speicher auch nur ein Array von Bytes, wobei 1 Byte normalerweise für
einen Helligkeitswert steht.
> - Wie erstelle ih aus den Rohdaten der Kamera ein Bild (Für den Anfang> reicht z.B. ein jpg)
Erst mal musst du die Rohdaten haben. und genau da beginnt auf einem AVR
das erste Problem. Du hast nicht den Speicher um ein Bild, das du von
der Kamera holst, zwischenspeichern zu können.
und für den Anfang willst du kein JPG speichern. Das ist nämlich
ausgesprochen kompliziert aus den Rohdaten ein JPG zu erzeugen.
>> - Wie komme ich von diesem Schritt weiter in Richtung z.B.> Gesichtserkennung.
Gar nicht. Man arbeitet bei der Bildverarbeitung nicht mit JPG Daten im
Speicher. JPG ist ein Dateiformat, das darauf ausgelegt ist, kleine
Dateien zu ergeben. Um mit diesen Daten irgendwas anfangen zu können,
muss man erst mal das JPG wieder in die Rohdaten entpacken.
Stell dir meinetwegen eine Analogie zu einem Zip-File vor (das JPG
entspricht dem Zip). In diesem zip-File hast du ein File reingegeben,
welches Text enthält. Du willst nun nicht eine Textänderung dadurch
machen, dass du das Zip-File direkt manipulierst. Das wäre nämlich
ausgesprochen schwierig. Statt dessen willst du das Zip-File entpacken,
das erhaltene Text-File ändern und dann das veränderte Text-File wieder
in ein Zip-Archiv packen. Genauso macht man Bildverarbeitung, wenn man
JPG hat. Du wirst einen Teufel tun und direkt am JPG arbeiten. Denn das
ist ausgesprochen schwierig, wenn nicht sogar unmöglich.
Der Rest ist:
* arbeiten mit Arrays
* anwenden von Algorithmen auf diese Arrays
Karl Heinz schrieb:> wobei 1 Byte normalerweise für einen Helligkeitswert steht.
Detaillierter: für den Helligkeitswert einer der drei Farben eines
Pixels...
Moin,
Ueblicherweise haben dafuer geeignete Prozessoren auch irgendeine Art
Hardwarebeschleunigung/DMA, damit nicht der Prozessor die gesamten Daten
der Kamera permanent durch die Gegend schaufeln muss.
D.h. es gibt irgendein HW-Interface, z.B. MIPI-CSI oder sowas, da haengt
der Kamerasensor dran und es erfolgt automatisch und (fast) ohne Zutun
der CPU ein Transfer der Bilddaten ins RAM des Prozessors. Das sind dann
Rohdaten, z.B. direkt die R,G und B Werte von Pixeln.
Gruss
WK
Ulrich F. schrieb:> Z.B.: 800 X 600 X 3 macht fast 1,5 Megabyte an Rohdaten im Speicher.> Welcher AVR hat soviel RAM?
ist das denn nötig, U.Radig hatte es in einem Webserver mal mit einer
RS232 Cam gemacht auf dem ATmega32
http://www.ulrichradig.de/home/index.php/software/avr-webserver-software
ich habe ja den Pollin NETIO Webserver nun zu ATmega 1284p erweitert
128k flash und 16k Ram
Karl Heinz schrieb:> Gar nicht. Man arbeitet bei der Bildverarbeitung nicht mit JPG Daten im> Speicher. JPG ist ein Dateiformat, das darauf ausgelegt ist, kleine> Dateien zu ergeben. Um mit diesen Daten irgendwas anfangen zu können,> muss man erst mal das JPG wieder in die Rohdaten entpacken.> Stell dir meinetwegen eine Analogie zu einem Zip-File vor (das JPG> entspricht dem Zip). In diesem zip-File hast du ein File reingegeben,> welches Text enthält. Du willst nun nicht eine Textänderung dadurch> machen, dass du das Zip-File direkt manipulierst. Das wäre nämlich> ausgesprochen schwierig. Statt dessen willst du das Zip-File entpacken,> das erhaltene Text-File ändern und dann das veränderte Text-File wieder> in ein Zip-Archiv packen. Genauso macht man Bildverarbeitung, wenn man> JPG hat. Du wirst einen Teufel tun und direkt am JPG arbeiten. Denn das> ist ausgesprochen schwierig, wenn nicht sogar unmöglich.>> Der Rest ist:> * arbeiten mit Arrays> * anwenden von Algorithmen auf diese Arrays
Sehr gut.. das ist schonmal das erste was ich gelernt habe.
Da besteht nämlich das Problem.. ich habe noch keinen Plan wie die
Bildverarbeitung auf den Ebenen überhaupt funktioniert. Und suche
deshalb passende Literatur. Danke schonmal für die Hinweise.
Also verstehe ich den groben Verlauf richtig?
Ein Mikroprozessor am besten mit Betriebssystem verarbeitet die
aufgenommenen Bilddaten und gibt je nach ausgewertem die entsprechenden
Befehle an ein uC der dementsprechend steuert?
Joachim B. schrieb:> Ulrich F. schrieb:>> Z.B.: 800 X 600 X 3 macht fast 1,5 Megabyte an Rohdaten im Speicher.>> Welcher AVR hat soviel RAM?>> ist das denn nötig, U.Radig hatte es in einem Webserver mal mit einer> RS232 Cam gemacht auf dem ATmega32>> http://www.ulrichradig.de/home/index.php/software/avr-webserver-software>> ich habe ja den Pollin NETIO Webserver nun zu ATmega 1284p erweitert>> 128k flash und 16k Ram
Geringere Auflösung.
ca 120 Bilder pro Stunde
Er schleifts nur durch und muss dafür schon Klimmzüge machen.
Er muss es in 27 Stückchen hacken.
Mustererkennung ist so nicht möglich.
Bewegungserkennung erst recht nicht.
(min 2 Buffer)
Ulrich F. schrieb:> Geringere Auflösung.> ca 120 Bilder pro Stunde> Er schleifts nur durch und muss dafür schon Klimmzüge machen.> Er muss es in 27 Stückchen hacken.> Mustererkennung ist so nicht möglich.>> Bewegungserkennung erst recht nicht.> (min 2 Buffer)
schon klar nur wo hast du solche Anforderung gelesen?
Hans schrieb:> Ich habe noch kein konkretes Projekt, möchte mich interessehalber aber> mal damit beschäftigen.>> Nur finde ich im Internet keine Tutorials oder Artikel die mir wirklich> weiterhelfen.>> Wenn ich zum Beispiel eine Kamera an einem AVR anschliesse (mal> unabhängig von der Rechenleistung)
und dann wird sofort gesagt geht nicht.......
hier war die Frage nach wie und AVR und da habe ich den Weg gezeigt,
mehr nicht.
Nicht alles was mit dem ARV laufen soll geht nicht
Nicht alles was mit dem AVR laufen soll ist sinnvoll
aber unmöglich ist fast nichts, ausser eine Drehtür zuknallen.......
> hier war die Frage nach wie und AVR und da habe ich den Weg gezeigt,> mehr nicht.
"Gesichtserkennung" steht im Anforderungskatalog!
Wie soll das gehen, wenn noch nicht mal das Gesicht in den Speicher
passt?
Erinnert mich irgendwie an den Kinderspruch:
"Woran erkennt man, dass ein Elefant im Kühlschrank war?"
An den Fußspuren in der Butter.
Hans schrieb:> Wie und wo muss ich da anfangen um langsam aber sicher in die Richtung> gehen zu können?
sicher nicht mit openCV und Gesichtserkennung...
OpenCV bietet erst einmal einen komfortablen Weg, um die Daten von der
Kamera in ein Fließkomma/Integer-Feld zu bekommen und dieses dann auch
relativ bequem auf den Bildschirm zu bekommen. Das ist der Anfang.
Hans schrieb:> Ein Mikroprozessor am besten mit Betriebssystem verarbeitet die> aufgenommenen Bilddaten und gibt je nach ausgewertem die entsprechenden> Befehle an ein uC der dementsprechend steuert?
Kann man so machen - an meine Messmaschinen wurde z.B. manchmal eine
Bildverarbeitung einer darauf spezialisierten Firma angebaut, die die
Kanten von Werkzeugen erfasst hat und die Koordinaten-Werte an meine
Steuerung übermittelt. Das ergab sich so aus der Entwicklung. Aber wenn
du sowas "am Stück" entwickelst, brauchst du eigentlich keinen zweiten
Prozessor, denn das wird wohl so sein, dass die Bildverarbeitung 99% der
Leistung braucht und die Steuerungsaufgabe 1%, das muss man nicht
auslagern. Aber wenn es dir leichter fällt und du ein 2-Prozessorsystem
sauber implementieren kannst, es schadet auch nicht.
Ob dann die Bildverarbeitung ein Slave des Steuerungssystem ist oder
umgekehrt, darüber kannst du dann lange philosophieren.
Georg
Hans schrieb:> - Wie komme ich von diesem Schritt weiter in Richtung z.B.> Gesichtserkennung.
Eine mögliche Vorgehensweise wäre
1) für die "Face-Detection", also um zu bestimmen wo auf dem Kamerabild
sich ein Gesicht befindet (wenn überhaupt eins da ist): Viola/Jones,
http://citeseer.ist.psu.edu/viewdoc/summary?doi=10.1.1.10.6807&rank=8
2) für die "Face-Recognition", also um einem gefundenen Gesicht einen
Namen zuzuordnen: Eigengesichter,
https://de.wikipedia.org/wiki/Eigengesichter
Stand der Technik ist das zwar nicht, aber dafür sind diese Verfahren
verhältnismäßig einfach zu implementieren, auch ohne Vorkenntnisse in
dem Bereich.
Wenn du wirklich praktisch was machen möchtest, würde ich dir auch
empfehlen dich erst mal Schritt für Schritt der Sache zu nähern.
Das kann eine Webcam in Verbindung mit OpenCV oder Matlab/Octave sein.
In wie weit du dann auf fertige Libs zugreifen möchtest oder als selbst
machen willst kannst du dann selber entscheiden.
Auf solch einem kleinen System wie einem AVR ist es ein schwieriges (es
gab auch schon Leute die haben ein Linux laufen lassen auf so einen
Controller) bis unmögliches unterfangen. Eher sinnlos. Alleine schon vom
RAM und der Updaterate.
Wenn Du dann das ganze Verständnis aufgebaut hast, deine ganzen
Algorithmen funktionieren und getestet sind, dann kannst du dir
überlegen wie du das ganze auf ein Embedded System portiert.
Denn dann hast du auch selbst das Wissen einzuschätzen was deine
Plattform für Performance, Ressourcen und Peripherien benötigt.
Hans schrieb:> ich interessiere mich momentan für die Bildverarbeitung auf einem> AVR-uC.
Wirkliche Bildverarbeitung kannst du mit AVR schlicht knicken. Viel zu
langsam und viel zu wenig RAM.
Das heißt aber nicht, daß man nicht auch an den AVR eine Kamera
ankoppeln könnte und sogar Bildverarbeitung (wenn auch in sehr, sehr
bescheidenen Ausmaßen) damit möglich wäre.
Sowas wie die Erkennung und Auswertung des Bildes einer vertikalen
Laserlinie z.B. ist realisierbar. Das habe ich selber schonmal gemacht:
Gnubbels auf einer leicht gekrümmten Oberfläche auf diesem Weg erfaßt,
während ich das Objekt per Schrittmotor bewegt habe, und dann die
Meßdaten als DMC interpretiert und decodiert, so daß am Ende der Inhalt
des DMC als ASCII-String aus dem UART fiel.
> Wenn ich zum Beispiel eine Kamera an einem AVR anschliesse (mal> unabhängig von der Rechenleistung): Wie kann ich aus dieser Kamera ein> brauchbares Bild erzeugen und weiterverarbeiten bzw. an einen PC> übermitteln?
Das erste Problem ist, überhaupt eine Kamera zu finden, die du an den
AVR koppeln kannst. Ich habe damals ein billiges analoges Kameramodul
benutzt, das geht noch am einfachsten an einen AVR zu koppeln.
Damals(TM) gab es solche Module noch in SW und mit abschaltbarer
Belichtungsautomatik, heute leider nicht mehr.
Der Vorteil der analogen Anbindung: Du kannst die ersten Schritte der
Bildverarbeitung (Datenreduktion und Merkmalsextraktion) bei bestimmten
Anwendungen wie eben dieser Sache mit der Laserlinie sozusagen
auslassen. In Wirklichkeit steuerst du natürlich einfach den analogen
Kram so, daß der diese Schritte für dich tut. Bei deinem µC kommt dann
nur noch an, was er wirklich verarbeiten kann und soll.
> Mir fehlt da komplett der Ansatz zu dem Thema Bildverarbeitung.
Damit schätzt du dich wohl noch etwas zu gut ein. Dir sind
offensichtlich nicht mal die Grundlagen der digitalen Bild-
Repräsentation klar, sonst wärest du niemals auf die Idee verfallen,
einen AVR zur Bildverarbeitung verwenden zu wollen...
Also fang' erstmal damit an: Wie werden Videobilder eigentlich digital
repräsentiert? Was kann ich daraus über Speicher- und Rechenzeitbedarf
lernen?
Schon das ist ein durchaus nicht kleines Feld, was zu beackern ist,
bevor man auch nur daran denken kann, mit diesen Repräsentationen dann
im Sinne eine echten Bildverarbeitung zu hantieren...