Anleitung: Eine Bauteilkennzeichnung aus einem Kamerabild lesen

Eine gedruckte Teilenummer aus einem Kamerabild lesen, von einer frischen Installation bis zu einer Einstellung, die Sie in die Produktion nehmen können.

Das Beispiel ist eine sechsstellige Teilenummer, auf ein Etikett gedruckt. Passen Sie Zeichensatz und Layout unterwegs an Ihre Kennzeichnung an.

Bevor Sie beginnen

  • LumiScan Cam Driver oder eine andere Bildquelle, die auf demselben Gerät läuft - derselben ctrlX CORE oder demselben ctrlX IPC oder demselben PC - und Bilder liefert.

  • Die Adresse ihres Bildknotens zur Hand, z. B. hdvisionsystems/lumiscan-cam-driver/camera1/output/image.

  • Ein Teil vor der Kamera, mit der Kennzeichnung im Bild, im Fokus und gut beleuchtet.

1. Den Leser auf die Kamera richten

write  hdvisionsystems/lumiscan-text-reader/module-1/read-text/input/input-image-address
       = "hdvisionsystems/lumiscan-cam-driver/camera1/output/image"

2. Einen ersten Lesevorgang durchführen

Lassen Sie alles andere auf dem Standardwert und führen Sie ihn aus:

write  .../module-1/read-text/execute
read   .../module-1/read-text/output/status-code   -> 1
read   .../module-1/read-text/output/status-text
read   .../module-1/read-text/output/result

Ein negativer Statuscode bedeutet, dass er nicht gelaufen ist - status-text nennt den Grund. -3 ist fast immer eine falsche Bildadresse.

An diesem Punkt ist das Leseergebnis meist schlecht: zu viele Wörter, manche davon Unsinn aus dem Hintergrund. Das ist zu erwarten, und die nächsten drei Schritte beheben es.

3. Auf die Kennzeichnung zuschneiden

Ermitteln Sie die Pixelkoordinaten des Etiketts im Bild - auf ctrlX OS zeigt die ctrlX-Kameraansicht sie an - und setzen Sie eine Region, die etwas größer ist als der Text:

write  .../input/crop/startX = 620
write  .../input/crop/startY = 310
write  .../input/crop/width  = 260
write  .../input/crop/height = 90

Führen Sie es erneut aus. Die meisten Störwörter sollten verschwunden sein.

Dieser Schritt hilft am meisten, und er macht auch jeden Lesevorgang schneller. Kann sich das Teil zwischen den Zyklen verschieben, machen Sie den Ausschnitt groß genug, um den gesamten Bereich abzudecken, den es einnehmen kann - eine Kennzeichnung, die aus dem Ausschnitt herauswandert, wird als nichts gelesen, was ein besserer Fehler ist, als etwas Falsches zu lesen.

4. Den Zeichensatz einschränken

Eine sechsstellige Teilenummer enthält nur Ziffern, also sagen Sie das:

write  .../input/characters/mode = "DIGITS"

Das verhindert, dass 0 als O und 5 als S gelesen wird. Enthält die Nummer auch Buchstaben, verwenden Sie stattdessen UPPERCASE_LETTERS mit allow = "0123456789", oder CUSTOM mit allow auf genau die Zeichen gesetzt, die Ihre Kennzeichnung enthalten kann.

5. Sagen, was betrachtet wird

Eine Druckzeile in einem engen Ausschnitt:

write  .../input/layout = "SINGLE_LINE"

Führen Sie es erneut aus. output/result.text sollte jetzt die Teilenummer sein und sonst nichts.

6. Einen Konfidenz-Schwellwert wählen

Lassen Sie fünf oder zehn bekannt gute Teile durchlaufen und notieren Sie mean_score aus jedem Ergebnis sowie die einzelnen words[].score.

Korrekte Leseergebnisse auf einem ordentlichen Bild liegen deutlich über 0.8. Setzen Sie den Schwellwert unter Ihr schlechtestes bekannt gutes Leseergebnis und über das Rauschen:

write  .../input/min-score = 0.7

min-score filtert nur words[]; text ist immer die vollständige Ausgabe der Engine. Prüfen Sie word_count statt text, wenn Sie wissen müssen, ob das Leseergebnis gut war.

7. Die Einstellungen speichern

Nichts von dem oben überlebt einen Neustart, bis Sie es speichern:

write  hdvisionsystems/lumiscan-text-reader/system/save-module-inputs/input/module-id = "module-1"
write  hdvisionsystems/lumiscan-text-reader/system/save-module-inputs/execute

8. In das Steuerungsprogramm einbinden

Pro Zyklus:

  1. Schreiben Sie read-text/execute - ein blockierender Aufruf, es gibt also kein Ready-Flag zu pollen.

  2. Prüfen Sie output/status-code. Negativ bedeutet, dass der Lesevorgang fehlgeschlagen ist und nichts erzeugt hat.

  3. Lesen Sie output/result.

  4. Prüfen Sie, ob word_count 1 ist und words[0].score akzeptabel, und vergleichen Sie dann words[0].text mit der erwarteten Teilenummer.

Lesen Sie das Ergebnis, bevor Sie den nächsten Lesevorgang auslösen: Das nächste execute leert es.