Anleitung: Teilefläche aus einem Kamerabild messen

Von Anfang bis Ende: eine echte Flächenmessung aus einer laufenden Kamera gewinnen und dafür sorgen, dass sie einen Neustart übersteht.

Bevor Sie beginnen

  • LumiScan Cam Driver ist installiert und veröffentlicht ein Bild, zum Beispiel unter hdvisionsystems/lumiscan-cam-driver/camera1/output/image.

  • LumiScan Area Detector ist installiert, und system/modules führt module-1 auf. Auf ctrlX OS ist die Anwendung außerdem lizenziert, siehe Voraussetzungen.

  • Die Teile liegen vor der Kamera, in der Beleuchtung, die die Installation tatsächlich verwenden wird.

Schritt 1: Sehen, was mit den Standardwerten gefunden wird

module-1/detect-area/input/input-image-address = hdvisionsystems/lumiscan-cam-driver/camera1/output/image
write module-1/detect-area/execute

Prüfen Sie, dass output/status-code 1 ist, und lesen Sie dann output/result. Sehen Sie sich blob_count an: zu viele bedeutet, dass Rauschen mitgezählt wird, null bedeutet, dass nichts zutraf.

Die Flächen sind bereits echte Pixelzahlen. Was der nächste Schritt ändert, ist, wie die Regionen gefunden werden.

Schritt 2: Den Schwellwert einstellen

Die eine Einstellung, die entscheidet, ob das funktioniert, ist die Helligkeit, die ein Pixel überschreiten muss. Raten Sie nicht - messen Sie das Bild:

system/analyse-scene/input/input-image-address = "hdvisionsystems/lumiscan-cam-driver/camera1/output/image"
write system/analyse-scene/execute
read  system/analyse-scene/output/recommended-settings
read  system/analyse-scene/output/histogram

recommended-settings liefert Ihnen einen Schwellwert, welche Seite das Teil ist und ob Löcher gefüllt werden sollen. Mit histogram prüfen Sie das: Der Schwellwert sollte im Tal zwischen dem Buckel des Teils und dem des Hintergrunds liegen. Zwei Buckel mit einer Lücke bedeuten, dass sich das Bild sauber trennt; ein Buckel bedeutet, dass kein Schwellwert es rettet und stattdessen die Beleuchtung korrigiert werden muss.

Setzen Sie ihn dann am Modul:

module-1/detect-area/input/method-specific/fixed/level = 128
write module-1/detect-area/execute

Sind die Teile dunkler als der Hintergrund, ergänzen Sie:

module-1/detect-area/input/detect-dark = true

Schritt 3: Kein Rauschen mehr zählen

Sehen Sie sich die kleinsten Einträge in blobs an. Die App meldet jede Region, die sie getrennt hat - es gibt kein Flächenfenster, das sich anheben ließe -, Rauschen und Staub werden daher an einer von zwei Stellen behandelt:

  • Am Schwellwert. method-specific/fixed/level so weit anzuheben, bis das Rauschen den Schwellwert nicht mehr überschreitet, ist die bessere Lösung, weil das Finden dieser Regionen dann nichts mehr kostet.

  • In Ihrem Steuerungsprogramm. Ignorieren Sie jeden blobs[]-Eintrag, dessen area unter dem liegt, was ein Teil sein kann. Ein Viertel der Fläche des kleinsten Teils, das Sie interessiert, ist ein guter Ausgangspunkt. Diese Entscheidung liegt bei Ihnen: Nur Sie wissen, was ein Teil ist.

Schritt 4: Die Zahl gegen etwas Bekanntes prüfen

Messen Sie ein Teil, dessen echte Fläche Sie kennen - oder zählen Sie seine Pixel einmal in einem Bildbetrachter -, und vergleichen Sie sie mit blobs[0].area. Beide sollten eng übereinstimmen. Ist die Messung durchgehend zu niedrig, schneidet der Schwellwert in das Teil hinein: Senken Sie method-specific/fixed/level, und probieren Sie detect-dark, wenn das Teil das dunklere von beiden ist.

Schritt 5: Dauerhaft machen

system/save-module-inputs/input/module-id = module-1
write system/save-module-inputs/execute
write system/save-current-modules/execute

Beide sollten 1 melden. Das Modul und seine Einstellungen überstehen jetzt einen Neustart.

Schritt 6: Aus einem Steuerungsprogramm ausführen

Pro Zyklus:

  1. Schreiben Sie auf module-1/detect-area/execute.

  2. Lesen Sie module-1/detect-area/output/status-code.

  3. Ist er negativ, ist der Durchlauf fehlgeschlagen - lesen Sie output/status-text und verwenden Sie das Ergebnis nicht.

  4. Ist er 1, lesen Sie output/result und reagieren Sie auf total_area, oder auf blob_count für eine Anwesenheitsprüfung.

Lesen Sie die Ausgaben, bevor Sie das nächste execute auslösen: Ein Durchlauf leert sie, sobald er beginnt.