Bildverarbeitung - welche Algorithmen um Markierung zu verfolgen

Hi,

für ein Projekt werde ich mich in das Thema Bildverarbeitung einarbeiten müssen. Der erste Schritt wird sein, mit einem Roboter, welcher mit einer Cam ausgestattet ist, einer Markierungslinie am Boden zu folgen. Also im Prinzip wird mit Klebeband eine Strecke am Boden markiert und der Roboter soll dieser Linie folgen. Die Verarbeitung und auch Steuerung wird dabei auf einem Rechner gemacht und nicht auf dem Roboter. Das ist ja doch auch wegen der Rechenleistung und dem Speicher ein wichtiges Kriterium.

Die Cam gibt uns Farbbilder, für den Fall, dass es verschiedene Algorithmen für Schwarz-Weiß- und Farbbilder gibt.

Da das Thema Bildverarbeitung doch sehr komplex ist, würde ich auf diesem Weg mal erstmal einige (für diese Aufgabenstellung) sinnvolle Algorithmen sammeln, damit ich mich dann näher mit diesen beschäftigen kann.
Ein erster, den ich gefunden habe, ist die Hough-Transformation, allerdings bin ich mir noch nicht so ganz sicher, ob dies für diesen speziellen Fall überhaupt sinnvoll ist, da dieses Verfahren probleme mit Linien hat, die parallel zu y-Achse laufen, was hier ja der Fall wäre
 
Moin,
1. was für ein Roboter ist das denn?
2. Ein 6-Achser oder ein einfacher Scara.
3. Welches Camerasystem nutzt Ihr?
4. Wertet Ihr die Bilder alleine aus, C# oder VB etc., Oder liefert die Camera die komplettinformationen?

Wenn ich das selber handeln müsste, wüsste jetzt aber auch nicht warum das so ist, auch wenn das Argument die Rechenleistung ist, da die Roboter sowas eigentlich leisten können "siehe auch Schweiztechnik bei den Autohersteller"

Also ich würde wie folgt das Versuchen zu lösen.
Aus dem Bild was die Camera liefert musst du ein Koordinatensystem erstellen bzw.
wissen welcher Pixelbereich welche Position hat. Kommt natürlich darauf an wie genau du fahren musst. Die Abstände in den du das Bild machst bzw. auswertets würde ich in abhängigkeit von der Roboter Geschwindigkeit machen.
Beim Scara bleibt denke ich die Z-Achse ja immer auf einen festen wert bzw 3-4mm über den Klebestreifen. X-Achse | Y-Achse kannst du dann selbts definieren z.B. oben links X null | Y null, oder wo es für dich am besten ist.
Das World Koordinatensystem hilft dir hier glaube ich nicht wirklich weiter.
Um Störungen oder falsche Daten der Kamera zu vermeiden solltest Du viele Farbinformationen vermeiden. heller untergrund (vielleicht weiß und der Klebestreifen).
Jetzt das Bitmap auswerten und prüfen wo sich der Streifen befindet. Zeile für Zeile auswerten und dann den Roboter die Koordinaten übergeben.
Wenn du eine gute ausleuchtung hast kannst du ja prüfen ist die Farbe dunkler als wert A und ist die breite der Farbe größer als B. Ich denke wenn Du mehrere farben hast wird es schwer die information aus dem Bild zu holen!!??

Das Auswerten kannst du auch auf den Bereich beschränken wo ein Muster entdeckt wurde +/- 100 Pixel oder so.
Oder arbeitest hier ein paar schritte vorraus und legst die daten in einem array ab...

Hoffe das hilft Dir etwas weiter...
Halt mich mal hier weiter auf dem laufenden, da ich aus dem Bereich kommen (Automationstechnik) würde mich das sehr interressieren!!!

MFG

ByteSurfer
 
Hi,

welcher Roboter es ist, sollte erstmal nicht ganz so wichtig sein, da alle Arbeiten, die in den Bereich Bildverarbeitung gehen, auf einem externen Rechner gemacht werden müssen. Es ist aber eher ein Spielzeug und nichts in Richtung Industrieroboter. Es gibt derzeit keine Möglichkeit, direkt auf dem Gerät zu programmieren. Gesteuert wird das Gerät sowieso über einen externen Rechner (über http), so dass schon einige grundlegende Teile der Steuerung in .Net umgesetzt sind.

Was für eine Cam das genau ist, kann ich nicht sagen, es soll wohl aber etwas einfaches sein, wie man es in Handys findet. Aber auch das sollte erstmal nicht ganz so wichtig sein, da ich im Programm bereits ein Bild von der Cam als JPG (BMP wird wohl auch möglich sein) bekommen kann, mit dem ich dann weiterarbeiten will.

Was meinst du mit
4. Wertet Ihr die Bilder alleine aus, C# oder VB etc., Oder liefert die Camera die komplettinformationen?
?
Also wir bekommen hier erstmal nur das Bild, alles andere wird dann in .Net umgesetzt, wobei die Sprache letztendlich auch wieder relativ egal sein müsste, da sich entsprechende Algorithmen ja in verschiedenen Sprachen umsetzen lassen.

Die Idee mit dem Koordinatensystem finde ich schonmal nicht schlecht. Wenn ich dich richtig verstehe, wird es aber auf eine Auswertung in schwarz-weiß hinauslaufen.
 
Wie siehts denn mit dem Kontrastverhältniss zwischen Boden und Klebeband aus ?
Ein schwarz-weisz Bild macht das ganze letztendlich natürlich am leichtestn.
Mein Vorschlag wäre mit einer Scanline das ganze Bild durchlaufen und Anfangs- sowie Endpunkt der Linie rausfinden. Als nächstes den Winkel der Linie zu einer Vertikalen berechnen und fertig.
Als Grafikbibliothek würde ich dir Boost empfehlen.
LG
 
Da es derzeit noch unter "Laborbedingungen" laufen wird, können die Kontraste ideal gewählt werden. An komplizierteren Bedingungen wird erst gearbeitet, wenn es unter idealen schonmal funktioniert.

Die Bibliothek werde ich mir mal ansehen, wobei ich bei der Aktion natürlich auch was lernen möchte und somit schon auch das ein oder andere Verfahren verstehen möchte.
 
was theoretisches dazu:
in der Bildverarbeitung kann man doch "einfach" das Bild als matrix darstellen, d.h. jedes Pixel ist ein matrixpunkt... je nach auflösung is das natürlich ne große matrix... aber die kann man dann splitten um schnelle algorithmen zu finden.
so kann man nun die farbinformationen rauslesen und die bestimmte farbe erkennen lassen.

ein kumpel aus dem höheren semester, die machen das gerade... um ein Bild zu invertieren, wird das bild als matrix dargestellt und davon wird dann einfach die transponierte matrix berechnet -> zack, bild invertiert.
genauso kann man dann auch RGB und son kram aulesen und analysieren.

da ich das noch nicht selber hatte, kann ich nur das wiedergeben was ich gehört habe, ich hoffe es hat irgendwas gebracht :D
 
Ich würde wie folgt vorgehen:
- Kanten im Bild rausfiltern (Sobel Operator)
- Schwarz / Weiß -> je nach MittelWert aller RGB Werte des Bildes
- einfache Linienverfolgung ( Schwarzen Punkt (unten im Bild) finden, anschließend 10 Pixel drüber den nächsten schwarzen Punkt suchen und die Steigung kx ausrechnen; zum smoothen einfach n*10 nach oben gehen und durch Mittelwert durchdividieren ..(blöd ausgedrückt) )

MfG
 
Zitat:
4. Wertet Ihr die Bilder alleine aus, C# oder VB etc., Oder liefert die Camera die komplettinformationen?

Einfach ob Dir die Kamera die Bildinformationen liefert, oder ob du ein photografiertes bild bekommst.
Hast Du ja schon beantwortet. Darauf bezogen sich dann auch die Programmsprachen...

Vorteil von Schwarz weiss ist eine klarere abgrenzung, und somit weniger Fehlverhalten. Sollte aber mit guten Rahmenbedingungen auch gut mit Farbauswertung funktionieren.

Also wenn du optimale Lichtverhältnisse hast:
1. sehr gute Ausleuchtung
2. klare hell dunkel bereiche (Kontrastverhältnisse)
kannst du den klebestreifen schon mal gut auslesen.

JPG würde ich nicht nehmen, da BMP Dir ("korrigiere mich jemand wenn ich falsch liege") die Bildinformationen genauer und detailieter liefert.

Ansonsten hier ein, zwei Stichworte :
Grayscale, Contrast Stretching unter google mal eingeben...
Hier könnt Ihr ein Farbbild in schwarz weis wandeln und den Contrast hervorheben...

Einen Winkel oder sowas brauchst du in meinen Augen nicht ausrechnen, da Du mit Koordinaten arbeitest und der roboter selbst den direkten Weg zur nächsten Position fährt.

Wo ich nur drüber nachdenke ist das Bildasuwerten ansich!?

Wertest Du immer
Bsp: ein Din4 Photo aus, läst den Roboter fahren, und dann das nächste A4 Photo usw. usw.
Oder wertest du immer die Erste Pixel Reihe vom Bild in Vertikalrichtung aus und wiederholst das ganze nach jeder Bewegung des Roboters!?

Ich selber würde mir einen Bereich festlegen den ich überwache.
z.B.Beginn des Suchmusters, und dann alle 3 mm oder so, da ich denke keine Genauigkeit von 1/100 oder 1/10 benötigt ist.
Um den ganzen mehr fluss zu geben und den Roboter Bremsfrei laufen lassen zu können merkst du dir vielleicht drei 4 positionen mehr.
z.B. immer die Mitte des Klebestreifen (9 Pixel breit = Pixel 5 die mitte) um auch Bahnen fahren zu können.

Oder Der Roboter fährt immer von beginn nach links und auf einmal kommt das Suchmuster (Klebestreifen im Bild) und nach finden dieser fährt der Robi in Position.
Kann dan auch ein Bereich in der Mitte des Bildes sein in Vertikalrichtung...

MFG

P.S. Hoffe ich konnte mich einigermaßen verständlich ausdrücken, sonst frag nochmal nach... ;-D

P.P.S.anmerkung von lone.wolf kannst du mir einfliesen lassen, nur ohne Winkel ;)
 
Zurück
Oben