Flächen erkennen
<module>/detect-area durchsucht ein Bild, einmal, und meldet die Regionen, die es findet.
Ausführen
Setzen Sie die Bildadresse und führen Sie aus:
module-1/detect-area/input/input-image-address = hdvisionsystems/lumiscan-cam-driver/camera1/output/image write module-1/detect-area/execute
Lesen Sie dann output/status-code und output/result.
Alles andere hat einen funktionierenden Standardwert, dieser erste Durchlauf zeigt Ihnen also, ob überhaupt etwas gefunden wird. Das Abstimmen folgt: siehe Die Erkennung abstimmen und Eine Szene analysieren zum Einstellen des Schwellwerts.
Das Ergebnis
output/result ist ein area_detect_result-Flatbuffer.
| Feld | Bedeutung |
|---|---|
|
Mittelpunkt der Region. |
|
[Pixel^2] Pixel, die die Region bedeckt, gezählt - nie aus einer angepassten Form abgeleitet. |
|
Welche Region dies in |
|
Eng anliegendes Rechteck um die Region. |
|
Wie viele Regionen, für ein Steuerungsprogramm, das nur eine Anzahl braucht. |
|
[Pixel^2] Summe über alle Regionen - die zentrale Zahl für eine Bedeckungsprüfung. |
|
Die größte Region. |
|
Der durchsuchte Bereich - das ganze Bild, sofern kein Crop gesetzt war. |
|
|
|
Mikrosekunden seit der Epoche, wann der Durchlauf abgeschlossen wurde. |
Die Regionen sind nach Fläche sortiert, blobs[0] ist also die größte.
total_area ist meist die Zahl, auf die Sie reagieren: Bedeckungs-, Verunreinigungs- und
Füllstandsprüfungen fragen alle "wie viel", nicht "wie viele".
Farbbilder
Es kann ein Grau- oder ein Farbbild hineingehen. Schwellwertbildung und Zusammenhangskomponenten sind Einkanal-Operationen, ein Farbbild wird also umgewandelt und wie jedes andere gemessen. Auf ctrlX OS liefert ein ctrlX-Bildknoten drei Farbkanäle, egal welche Kamera angeschlossen ist; eine Graustufenkamera erzeugt also drei identische Kopien. Es gibt kein Flag, und eine Region wird einmal gemeldet, wie viele Kanäle auch immer ankamen.
Die Suche einschränken
input/crop/{startX, startY, width, height} beschränkt die Suche auf einen Teil des Bildes. Eine Breite
oder Höhe von null reicht bis zum entsprechenden Rand; die Standardregion mit lauter Nullen durchsucht
also alles, und startX=100 mit Nullgrößen sucht von dort bis zur unteren rechten Ecke.
Zwei Gründe, sie zu verwenden: Geschwindigkeit, und das Ausschließen von Bereichen, in denen keine Region sein kann, was das Zählen von Hintergrundstörungen vermeidet.
Eine Region, die über einen Rand hinausreicht, wird abgelehnt und nicht beschnitten; die Meldung nennt die Eingabe und die Grenze, die sie verletzt hat.
Vorverarbeitung
input/preprocess/method wendet vor der Erkennung einen Filter an:
| Methode | Was sie tut |
|---|---|
|
Der Standard. |
|
Laplacian of Gaussian - Weichzeichnen, dann eine zweite Ableitung; hebt Regionen einer durch das Sigma festgelegten Größe hervor. |
|
Difference of Gaussians - zwei Weichzeichnungen voneinander abgezogen, ein Bandpass. |
|
Determinant of Hessian - kombinierte zweite Ableitungen. |
Nur die Parameter der gewählten Methode werden gelesen, und nur sie werden geprüft.
Die Regionen selbst
Das Ergebnis enthält Zahlen, keine Pixel. Die Pixel stehen in output/blob-labels, das jeder Durchlauf
veröffentlicht: eine Regionsnummer pro Pixel, und blobs[].label sagt, welche Nummer welche Region
ist. Siehe Das Label-Bild.
Ein leeres Ergebnis
Eine leere blobs-Liste mit status-code 1 bedeutet, dass keine Regionen zutrafen - sonst nichts.
Jeder andere Grund, aus dem ein Durchlauf nichts erzeugen könnte, wird vor der Erkennung abgefangen
und als negativer Statuscode gemeldet. Siehe
Ausführungsstatus.