Hallo,
ich arbeite momentan als Werksstudent für eine Firma in Zülpich und meine Aufgabe ist es, mit der Bibliothek OpenCV eine Farbstreifenerkennung auf einem Reifenprofil zu erkennen.
Dazu auch direkt mal ein Beispielbild im Anhang (10% verkleinert, sonst wäre das Bild zu groß).
Nun mal zu meiner Aufgabe:
Auf dem Reifenprofil kann man als Mensch ganz klar und deutlich die farbigen Streifen erkennen, nun ist es meine Aufgabe das ganze digital zu erkennen.
Da ich hier zunächst erstmal nur als Werksstudent arbeite, und ich in der Bildverarbeitung noch wirklich null Ahnung habe, fällt mir das ganze sehr schwer. Ich habe schon viel recherchiert und mich zumindest ein wenig schlauer gemacht wie man das ganze Problem angehen könnte.
Dabei dachte ich zuerst, ich könnte den Canny Kantenfilter auf das Bild anwenden um so, die farbigen Kanten, welche sich ja doch schon erheblich vom dunklen bis schwarzen Ton des Reifens abhebt.
Dies hat leider nicht sehr gut funktioniert, es wurden zu viele Kanten gefunden die dem Reifenprofil selbst entsprechen, deswegen habe ich mich um entschieden und mir gedacht, dass es vielleicht besser ist, nach den Farben direkt zu suchen.
Ich habe eine Liste von Farben, die auf den Reifenprofilen vorkommen können (sind ca. 10-12 Stück bis jetzt).
Darunter Rot, Grün, Blau, Gelb, Cyan, Weiß, Braun, Lila, Orange und noch'n paar.
Ich habe mir von meinem Ansprechpartner hier sagen lassen, dass ich mit dem HSV Farbmodell arbeiten soll, da dies die Arbeit erheblich erleichtern würde.
Deshalb hab ich dann das Bild mit OpenCV geladen, und mit
Nun habe ich ein Objekt vom Typ
Bis jetzt habe ich dann mühselig Farbwerte von-bis rausgesucht und mit der Funktion
Danach hab ich die Funktion
Das hat auch viel besser funktioniert als mit dem Kantenfilter.
Das Problem ist nur, wenn man sich das Bild im Anhang mal anschaut und ganz nah ranzoomt, kann man erkennen, dass die Farbstreifen Pixel nicht durchgehend z.B. grün sind. Es sind auch schwarze Pixel darin bzw. dunkle Pixel, weshalb die Linienerkennung nur teilweise gut funktioniert. Er findet dann den grünen Farbstreifen nicht als eine Linie, sondern als viele verschiedene Linien.
Ich hab mir dann erstmal gedacht, gut solange er generell grün oder was auch immer eine Farbe, gefunden hat, ists ja gut. Ich kenn die Position der Linie und weiß, um welche Farbe es sich handelt.
Nun gibt es nur leider auch den Fall, dass zwei grüne Linien sehr nah untereinander liegen, was natürlich bedeutet, das die zweite Linie auch im selben
Ich muss also innerhalb dieser Vec4i Liste zwischen beiden Linien unterscheiden können, und da die Breite der Linien, je nach Sprühdichte unterschiedlich sein kann, wird das ganze sehr schwer zu erkennen.
Also überlege ich auch hier noch, ist es der richtige Ansatz nach den Farben zu suchen oder gibt es vielleicht doch noch eine ganz andere bessere Möglichkeit?
Mein Ziel ist es, dass ich jetzt erstmal eine Textdatei habe, wo in jeder Zeile eine Farbe drin steht, diese Textdatei auszulesen und in der Reihenfolge wie sie in der Textdatei untereinander stehen, müssen die Farben auf dem Reifen vorkommen. Sobald eine Farbe schon nicht gefunden wurde oder die Reihenfolge nicht übereinstimmt, kann abgebrochen werden.
Ich hoffe ich habe mich deutlich genug ausgedrückt und wäre für Lösungsvorschläge dankbar.
Sorry für den langen Text, aber ich muss ja irgendwie zum Ausdruck bringen was mein Vorhaben ist, ich hoffe nur, dass der lange Text nicht die meisten schon abschreckt.
Edit: Ich habe noch ein zweites Bild (img.png) angehangen. Das Bild ist einmal vertikal gespiegelt deshalb nicht wundern, aber es ist erstellt worden vom ersten Anhang. Rausgefiltert wurde dort jetzt die Farbe grün und so sieht das Binary Image danach aus. Darauf wende ich dann
Mit mehrere Linien von einer Linie meine ich, der Algorithmus erkennt den Streifen auch nicht als eine Linie sondern mehrere. Mehrere in X Richtung wäre nicht das Problem, da er aber die Linien immer nur mit 1px Breite erkennt, macht er, weil der Farbstreifen dicker als 1px ist, mehrere untereinander. Das bedeutet die Linien, die eigentlich zu einer grünen Linie gehören, haben unterschiedliche y Werte. Diese müsste ich dann zusammenfassen, was, wenn es nur eine grüne Linie wäre kein Problem wäre, ich könnte die Linien iterieren und deren y Werte einfach auf einen durchschnittlichen y Wert aller y Werte setzen. Da es aber in diesem Fall z.B. zwei grüne Linien gibt, sind die Y werte von den Linien natürlich unterschiedlich und am ende würde ich 2 Linien im vector haben wollen.
Danke im Voraus
Mit freundlichen Grüßen
seh
ich arbeite momentan als Werksstudent für eine Firma in Zülpich und meine Aufgabe ist es, mit der Bibliothek OpenCV eine Farbstreifenerkennung auf einem Reifenprofil zu erkennen.
Dazu auch direkt mal ein Beispielbild im Anhang (10% verkleinert, sonst wäre das Bild zu groß).
Nun mal zu meiner Aufgabe:
Auf dem Reifenprofil kann man als Mensch ganz klar und deutlich die farbigen Streifen erkennen, nun ist es meine Aufgabe das ganze digital zu erkennen.
Da ich hier zunächst erstmal nur als Werksstudent arbeite, und ich in der Bildverarbeitung noch wirklich null Ahnung habe, fällt mir das ganze sehr schwer. Ich habe schon viel recherchiert und mich zumindest ein wenig schlauer gemacht wie man das ganze Problem angehen könnte.
Dabei dachte ich zuerst, ich könnte den Canny Kantenfilter auf das Bild anwenden um so, die farbigen Kanten, welche sich ja doch schon erheblich vom dunklen bis schwarzen Ton des Reifens abhebt.
Dies hat leider nicht sehr gut funktioniert, es wurden zu viele Kanten gefunden die dem Reifenprofil selbst entsprechen, deswegen habe ich mich um entschieden und mir gedacht, dass es vielleicht besser ist, nach den Farben direkt zu suchen.
Ich habe eine Liste von Farben, die auf den Reifenprofilen vorkommen können (sind ca. 10-12 Stück bis jetzt).
Darunter Rot, Grün, Blau, Gelb, Cyan, Weiß, Braun, Lila, Orange und noch'n paar.
Ich habe mir von meinem Ansprechpartner hier sagen lassen, dass ich mit dem HSV Farbmodell arbeiten soll, da dies die Arbeit erheblich erleichtern würde.
Deshalb hab ich dann das Bild mit OpenCV geladen, und mit
cvtColor()
das Bild erstmal in das HSV Modell konvertiert.Nun habe ich ein Objekt vom Typ
Mat
welches mir mit den verschiedenen Indizes 0, 1, 2 den jeweiligen Channel H, S oder V liefert.Bis jetzt habe ich dann mühselig Farbwerte von-bis rausgesucht und mit der Funktion
inRange()
die Farben rausgefiltert.Danach hab ich die Funktion
HoughLinesP()
auf das Bild angewandt, welche mir dann einen vector<Vec4i>
zurückliefert mit den gefundenen Linien.Das hat auch viel besser funktioniert als mit dem Kantenfilter.
Das Problem ist nur, wenn man sich das Bild im Anhang mal anschaut und ganz nah ranzoomt, kann man erkennen, dass die Farbstreifen Pixel nicht durchgehend z.B. grün sind. Es sind auch schwarze Pixel darin bzw. dunkle Pixel, weshalb die Linienerkennung nur teilweise gut funktioniert. Er findet dann den grünen Farbstreifen nicht als eine Linie, sondern als viele verschiedene Linien.
Ich hab mir dann erstmal gedacht, gut solange er generell grün oder was auch immer eine Farbe, gefunden hat, ists ja gut. Ich kenn die Position der Linie und weiß, um welche Farbe es sich handelt.
Nun gibt es nur leider auch den Fall, dass zwei grüne Linien sehr nah untereinander liegen, was natürlich bedeutet, das die zweite Linie auch im selben
vector<Vec4i>
liegt.Ich muss also innerhalb dieser Vec4i Liste zwischen beiden Linien unterscheiden können, und da die Breite der Linien, je nach Sprühdichte unterschiedlich sein kann, wird das ganze sehr schwer zu erkennen.
Also überlege ich auch hier noch, ist es der richtige Ansatz nach den Farben zu suchen oder gibt es vielleicht doch noch eine ganz andere bessere Möglichkeit?
Mein Ziel ist es, dass ich jetzt erstmal eine Textdatei habe, wo in jeder Zeile eine Farbe drin steht, diese Textdatei auszulesen und in der Reihenfolge wie sie in der Textdatei untereinander stehen, müssen die Farben auf dem Reifen vorkommen. Sobald eine Farbe schon nicht gefunden wurde oder die Reihenfolge nicht übereinstimmt, kann abgebrochen werden.
Ich hoffe ich habe mich deutlich genug ausgedrückt und wäre für Lösungsvorschläge dankbar.
Sorry für den langen Text, aber ich muss ja irgendwie zum Ausdruck bringen was mein Vorhaben ist, ich hoffe nur, dass der lange Text nicht die meisten schon abschreckt.
Edit: Ich habe noch ein zweites Bild (img.png) angehangen. Das Bild ist einmal vertikal gespiegelt deshalb nicht wundern, aber es ist erstellt worden vom ersten Anhang. Rausgefiltert wurde dort jetzt die Farbe grün und so sieht das Binary Image danach aus. Darauf wende ich dann
HoughLinesP
und dort findet er halt mehrere Linien auf einer Linie, packt aber alle in den vector<Vec4i>
rein.Mit mehrere Linien von einer Linie meine ich, der Algorithmus erkennt den Streifen auch nicht als eine Linie sondern mehrere. Mehrere in X Richtung wäre nicht das Problem, da er aber die Linien immer nur mit 1px Breite erkennt, macht er, weil der Farbstreifen dicker als 1px ist, mehrere untereinander. Das bedeutet die Linien, die eigentlich zu einer grünen Linie gehören, haben unterschiedliche y Werte. Diese müsste ich dann zusammenfassen, was, wenn es nur eine grüne Linie wäre kein Problem wäre, ich könnte die Linien iterieren und deren y Werte einfach auf einen durchschnittlichen y Wert aller y Werte setzen. Da es aber in diesem Fall z.B. zwei grüne Linien gibt, sind die Y werte von den Linien natürlich unterschiedlich und am ende würde ich 2 Linien im vector haben wollen.
Danke im Voraus
Mit freundlichen Grüßen
seh
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „seh“ ()