mikrocontroller.net

Forum: PC-Programmierung Bildverarbeitung für Widerstandsfarbringe erkennen, OpenCV?


Autor: Raphael Z. (raphaelz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mir eine Maschine gebaut, welche bedrahtete Widerstände je nach 
Wert in verschiedene Fächer einsortiert.

Die Messung erfolgt elektrisch.

Im Rahmen einer kleinen Projektarbeit möchte ich meine Maschine 
zusätzlich mit einer Bildverarbeitungslösung ausrüsten, mit welcher man 
die Farbringe der Widerstände entschlüsseln kann.

Die Widerstände liegen an einer definierten Position (Aussparung in 
welche der Widerstand genau reinpasst). Der R ist also immer an genau 
der gleichen Stelle im Bildfeld der Kamera.

Ich habe leider Null Erfahrung mit Bildverarbeitung. Also wirklich Null. 
Habe aber grundlegende Programmierkenntnisse in C, C++, Assembler, 
Arduino und fange gerade an Java zu lernen. Ich habe aber keine 
Schmerzen damit, mich z.B. soweit wie notwendig in Python einzuarbeiten.

Als Hardware kommt z.B. ein älterer Laptop oder ein Pi in Frage. 
Kamera/Optik habe ich noch keine. Sollte auch möglichst günstig (max. 
100€) sein. Kann man hier evtl. sogar eine billige Webcam verwenden?

Meine Frage ist nun, wie ich solch eine Bilderkennung möglichst einfach 
realisieren kann. Habe gehört, dass OpenCV sehr verbreitet ist. Wäre 
OpenCV mit Kanonen auf Spatzen geschossen für diese Anwendung? Gibt es 
eine einfachere Lösung?

Habe schonmal ein paar Tutorials zu OpenCV überflogen, kann aber noch 
nicht einschätzen wie aufwändig die Einarbeitung ist.

Bin fast vollkommen frei, was die Wahl des Systems betrifft. Es sollte 
halt nur möglichst Freeware oder kostengünstig sein.

Achja, hat jemand Erfahrung mit dem Bildverarbeitungs-PlugIn von MATLAB? 
Wäre das eine sinnvolle Option? (Als Student kann ich MATLAB kostenlos 
nutzen ..)


Ich würde mich über jeden Tipp und jede Einschätzung sehr freuen :-)

Viele Grüße
Raphael

: Verschoben durch Moderator
Autor: Sebastian R. (sebastian_r569)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Harald W. (wilhelms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Raphael Z. schrieb:

> Im Rahmen einer kleinen Projektarbeit möchte ich meine Maschine
> zusätzlich mit einer Bildverarbeitungslösung ausrüsten, mit
> welcher man die Farbringe der Widerstände entschlüsseln kann.

Wichtig ist da auch die Art der Beleuchtung. LEDs sind da eher
nicht geeignet.

Autor: Amateur (Gast)
Datum:

Bewertung
3 lesenswert
nicht lesenswert
Der "optische" Teil sollte eigentlich - nach einiger Einarbeitung - kein 
Problem sein. Die Segmentierung sollte vor allem dadurch, dass eine 
Halterung besteht machbar sein. Aber auch hier droht ein Pferdefuß: Wird 
nämlich der Widerstand anders herum eingelegt so droht Ungemach. Also wo 
fängt nun der Code an.
Nur im "Bilderbuch" ist der Streifen, der die Toleranz angibt, breit.

Der "Messtechnische" aber schon. Jeder Hersteller hat eigene 
Vorstellungen davon was eine bestimmte Farbe ist.
Rot, Orange oder ein etwas dunkleres Gelb?
Je nach Lichteinfall: Ist es nun weiß oder silbern?
Abhängig vom Alter ändern sich die Farben auch.

Last but not least:
Tierschützer kümmern sich gerne um aussterbende Arten.
Aber außer für eine reine Spielerei, wird sich der Aufwand für 
bedrahtete Widerstände nicht lohnen

Autor: Walter T. (nicolas)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald W. schrieb:
> Wichtig ist da auch die Art der Beleuchtung. LEDs sind da eher
> nicht geeignet.

Im Gegenteil. Wenn mehrere Bilder mit mehreren Beleuctungsfarben gemacht 
werden, läßt sich der Kontrast und die massiv erhöhen und die 
Entscheidungsschwellen weitaus grober einstellen.

Autor: Raphael Z. (raphaelz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Harald W: Ich wollte es evtl. mit kreisförmig angeordneten weißen 
LED's und großen Diffusor/Milchglas davor probieren, um möglichst 
homogenes Licht zu bekommen. Falls das Spektrum zu ungünstig ist vllt. 
doch lieber eine runde Neonröhre ... ebenfalls mit weißen Milchglas 
davor.

@ Amateur: Ja die Widerstände sind sicherlich eine aussterbende Art. In 
diesem Fall werden die Bauteile im Rahmen von Laborveranstaltungen 
eingesetzt... also auf Steckbrettern montiert. Und da die lieben 
Studenten zu faul sind die Bauteile wieder richtig einzusortieren muss 
das irgendjemand machen. Deshalb habe ich den Roboter gebaut ;-)

Aus Prestigegründen soll die Maschine aber noch mit Bildverarbeitung 
ausgestattet werden (und auch damit ich noch bisschen mehr lerne dabei).

Da für die Aufgabe nur relativ wenig Zeit eingeplant ist, hoffe ich, 
dass es eine Lösung gibt, bei der ich mich nicht erst Monate lang 
einarbeiten muss ;-)

Autor: Markus (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Sebastian R. schrieb:
> https://pub.tik.ee.ethz.ch/students/2014-HS/GA-2014-02.pdf

Hier ist die Auswertung und das Fazit interessant: Das größte Problem 
stellt die korrekte Farberkennung dar. Kein Wunder, selbst ein Mensch 
kann die gelben, braunen und roten Ringe nur mit viel Übung 
unterscheiden. Folglich habe ich die blöden Ringe schon vor 30 Jahren 
nicht auswendig gelernt, sondern ein billiges Multimeter benutzt ;-)

Autor: Amateur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Da für die Aufgabe nur relativ wenig Zeit eingeplant ist, hoffe ich,
>dass es eine Lösung gibt, bei der ich mich nicht erst Monate lang
>einarbeiten muss ;-)

Bildverarbeitung ist ein relativ komplexes Thema.
Die OpenCV ist ein recht umfangreiches Trumm.
Also nichts, was man mal zwischen Frühstück und Mittag machen kann. 
Leider!

Autor: Harald W. (wilhelms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter T. schrieb:

>> Wichtig ist da auch die Art der Beleuchtung. LEDs sind da eher
>> nicht geeignet.
>
> Im Gegenteil. Wenn mehrere Bilder mit mehreren Beleuctungsfarben gemacht
> werden, läßt sich der Kontrast und die massiv erhöhen und die
> Entscheidungsschwellen weitaus grober einstellen.

Dann braucht man aber mehr LEDs als RGB.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Raphael Z. schrieb:
> @ Harald W: Ich wollte es evtl. mit kreisförmig angeordneten weißen
> LED's und großen Diffusor/Milchglas davor probieren, um möglichst
> homogenes Licht zu bekommen. Falls das Spektrum zu ungünstig ist vllt.
> doch lieber eine runde Neonröhre ... ebenfalls mit weißen Milchglas
> davor.

Weiße LEDs sind schon ok. Ihr Spektrum hat zwar meist eine Delle im
blau-grünen Bereich, dieser Bereich ist aber für die Erkennung der
Farbcodes ohnehin nicht relevant.

Ganz schlecht für diesen Zweck ist meiner Erfahrung nach Glühlampenlicht
wegen des kaum vorhandenen Blauanteils:

Ich habe eine Serie von Widerständen, bei denen im Glühlampenlicht die
violetten Ringe praktisch nicht von den braunen zu unterscheiden sind.
Selbst bei einem 470Ω-Widerstand, wo ein violetter und ein brauner Ring
direkt nebeneinander liegen, fällt die Unterscheidung sehr schwer. Daran
ändert sich auch nicht viel, wenn man ein Bild mit einer Digitalkamera
aufnimmt und nachträglich den Farbkontrast erhöht.

Mit Sonnen-, LED- oder ESL-Licht mit ≥4000K macht die Unterscheidung
überhaupt keine Probleme (egal ob live oder im Kamerabild), und das
trotz des gegenüber der Glühlampe schlechteren Farbwiedergabeindexes Ra
(so viel zur Aussagekraft des Ra, der IMHO u.a. genau solche Effekte
berücksichtigen sollte).

Zum Thema OpenCV:

Das ist ein mächtiges Werkzeug, das es auf jeden Fall wert ist, einmal
ausprobiert zu werden. Der Einstieg geht wahrscheinlich am schnellsten
mit Python (sofern man dieses schon einigermaßen beherrscht). Die
Bibliothek kann auch sehr gut zusammen mit NumPy (dem Numerik-Paket für
Python) verwendet werden, da beide dasselbe interne Datenformat für
Matrizen (d.h. auch für Bilddaten) verwenden.

Da in deinem Fall die Position und Orientierung des Widerstands im Bild
auf Grund der verwendeten Halterung vorab bekannt ist, beschränkt sich
die Auswertung primär auf die Farberkennung. Da diese aber ziemlich
anwendungsspezifisch ist, bietet die OpenCV diesbezüglich nicht arg viel
Unterstützung, so dass du nicht umhin kommen wirst, dafür selber ein
paar geeignete Heuristiken zu implementieren. Insofern lohnt sich eine
intensive Einarbeitung in die OpenCV wahrscheinlich nur, wenn du diese
künftig auch für andere Anwendungen einsetzen möchtest.

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus schrieb:
> selbst ein Mensch
> kann die gelben, braunen und roten Ringe nur mit viel Übung
> unterscheiden.

Ach, das lernt man sehr schnell.
Der Mensch kann auch leicht die Richtung erkennen.
Z.B. br,br,br,rt,rt = 11,1k / 2% ist Unsinn, ein E192 Widerstand wird 
keine 2% haben.
Der Widestand muß also andersum gelesen werden, d.h. 2,21k / 1%.

Maschinell kann es schwer werden, die Richtung zu erkennen. Der 
Toleranzring ist manchmal etwas dicker oder hat einen größeren Abstand 
oder sitzt auf der Kappe. Jeder Hersteller kocht da sein eigenes 
Süppchen.

Markus schrieb:
> sondern ein billiges Multimeter benutzt ;-)

Wenn der Widerstand eh in eine Halterung vor die Kamera geklemmt werden 
muß, kann man ihn natürlich auch einfach ausmessen.

Autor: John D. (drake)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:
> Der Mensch kann auch leicht die Richtung erkennen.
> Z.B. br,br,br,rt,rt = 11,1k / 2% ist Unsinn, ein E192 Widerstand wird
> keine 2% haben.

Ich kann nicht alle E-Reihen auswendig. Ein Computer würde sich beim 
Plausibilitätscheck leichter tun...

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

"Hier ist die Auswertung und das Fazit interessant: Das größte Problem
stellt die korrekte Farberkennung dar. Kein Wunder, selbst ein Mensch
kann die gelben, braunen und roten Ringe nur mit viel Übung
unterscheiden."

Denn kann ich nur zustimmen:

Es gibt vorbildliche Widerstandhersteller und Reihen da kann übertrieben 
gesagt auch ein Farbenblinder die Werte ablesen  (5% Reihe 4 Farbringe , 
helle Farbe des Widerstandskörpers) vor allem wenn er die entsprechende 
E Reihe quasi auswendig kennt.

Aber schon bei 5 (6) Farbringen, dunkler Widerstandskörperfarbe(Gerne 
ausgerechnet ein "schmutziges" dunkles Blau, Braun oder Rot ) wird es 
wie schon richtig erkannt schwierig bis teilweise unmöglich - besonders 
(weil man als Praktiker  halt auf die typischen Werte trainiert ist und 
oft gar nicht mehr bewusst dekodiert sondern automatisch als 
"Gesamtbild" abliest, bei Braun Schwarz Rot Gold, wird wohl kein 
Praktiker wirklich noch dekodieren) wenn man es dann mit der E48 oder 
noch höheren E-Reihe zu tun hat und dann ausgerechnet doch mal der 
0,18Ohm oder 15,8 GOhm Widerstand ist.
Und gerade bei den Widerständen der hohen E-Reihen wird gerne auch noch 
der TK mit einkodiert und bei den dann notwendigen 6 Farbringen ist es 
oft auch nicht mehr klar erkennbar wie herum man nun richtig ablesen 
muss - da beide Leserichtungen sinnvolle Werte ergeben.

Jemand

Autor: Jemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
..... ergeben können.

Autor: Harald W. (wilhelms)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter D. schrieb:

> Maschinell kann es schwer werden, die Richtung zu erkennen.

Normalerweise sollte es ausreichen, beide Richtungen auszuwerten
und dann die Werte auf Plausibilität zu überprüfen.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Harald W. schrieb:
> Normalerweise sollte es ausreichen, beide Richtungen auszuwerten
> und dann die Werte auf Plausibilität zu überprüfen.

Die (relativ wenigen) verbleibenden Mehrdeutigkeiten sind hier
aufgelistet:

E48 (2%, roter Toleranzring):

2,05 kΩ (ro sw gn br ro) <->  215  Ω (ro br gn sw ro) 

E96 (1%, brauner Toleranzring):

1,00 kΩ (br sw sw br br) <->  110  Ω (br br sw sw br) 
 100 kΩ (br sw sw or br) <->  130  Ω (br or sw sw br) 
1,00 MΩ (br sw sw ge br) <->  140  Ω (br ge sw sw br) 
10,0 MΩ (br sw sw gn br) <->  150  Ω (br gn sw sw br) 
 110 kΩ (br br sw or br) <-> 1,30 kΩ (br or sw br br) 
1,10 MΩ (br br sw ge br) <-> 1,40 kΩ (br ge sw br br) 
11,0 MΩ (br br sw gn br) <-> 1,50 kΩ (br gn sw br br) 
1,30 MΩ (br or sw ge br) <->  140 kΩ (br ge sw or br) 
13,0 MΩ (br or sw gn br) <->  150 kΩ (br gn sw or br) 
14,0 MΩ (br ge sw gn br) <-> 1,50 MΩ (br gn sw ge br) 
 113 kΩ (br br or or br) <-> 1,33 kΩ (br or or br br) 
1,05 kΩ (br sw gn br br) <->  115  Ω (br br gn sw br) 
10,7 kΩ (br sw vi ro br) <->  127  Ω (br ro vi sw br) 
 107 kΩ (br sw vi or br) <->  137  Ω (br or vi sw br) 
 127 kΩ (br ro vi or br) <-> 13,7 kΩ (br or vi ro br) 

Da sollte man versuchen, zusätzlich die Abstände zwischen den Ringen zu
berücksichtigen. Oder der Automat leitet in Zweifelsfällen wie diesen
eine elektrische Messung ein, die ja sowieso schon implementiert ist.

Autor: Wollvieh W. (wollvieh)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Wenn die Erkennung funktioniert, hätte ich eine praktische Anwendung 
dafür:

Ich habe eine große Tüte mit aus den Bändern gefallenen 1% 
0,6W-Widerständen.

Da ich gefühlt maximal 5 Stück im Jahr verbrauche, wäre es sinnvoller, 
alle wegzuwerfen und die benötigten Werte jedesmal zu bestellen, selbst 
bei 5 Euro Versandkosten.

Die Kompromißlösung wäre: Ich werfe bei Bedarf eine große Portion aus 
dem Sack auf den Tisch und unter die Kamera.

Wenn die Bildauswertung den vorher eingegebenen Wert erkennt, leuchtet 
sie mit einem Fadenkreuz drauf. Oder fährt einen kleinen Greifer aus so 
einem Teddybärautomaten vom Rummel drüber. Oder plottet mit einem 
Filamentaufsatz einen Kunststoffgriff zum Hochheben dran. :)

Mist, das ist eine patentfähige Idee, die ich hier so einfach 
ausplaudere. Ich fürchte aber, das wird schon vor ein paar Jahrzehnten 
irgendwo im Fertigungsbereich umgesetzt worden sein.

: Bearbeitet durch User
Autor: Raphael Z. (raphaelz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die zahlreichen Beiträge,

@ Markus: Über die korrekte Farberkennung habe ich mir auch schon Sorgen 
gemacht. Bei diesem Projekt ist es allerdings so, dass alle Widerstände 
vom gleichen Hersteller sind … daher müssten die Farben relativ 
gleichbleibend sein.

@Amateur und Yalu: Mhm also ist OpenCV also schon eine aufwändige 
Geschichte? Als Bastler ist es natürlich schon immer interessant etwas 
dazu zu lernen … mir fällt das ein oder andere Projekt ein, wofür ich 
OpenCV auch verwenden könnte. Allerdings würde es mich nun schon 
abschrecken falls der Aufwand sehr groß ist.

Gibt es irgendwo ein gutes Tutorial oder Buch für OpenCV?
Und kennt jemand Alternativen zu OpenCV die einfacher und schneller 
umzusetzen wären für die Farbringdechiffrierung? Falls es ein 
empfehlenswertes "abgespektes" Tool gibt, wäre das eventuell auch eine 
Option für mich.

Danke für die Tipps zur Beleuchtung. Ich habe einige 
Beleuchtungsvarianten daheim … werde hier dann mal rumprobieren.

Das mit der Leserichtung würde ich auch so handhaben wie es @wilhelms 
und @Yalu beschreiben.

@Wollvieh: Falls ich die Farbringerkennung so gut hinbekomme dass es 
funktioniert, stelle ich dir den Code gerne zur Verfügung, damit du die 
richtigen Widerstände detektieren kannst ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.