Ein Objekt finden

<module>/find-object durchsucht ein Bild einmal nach einem bekannten Objekt.

Eingaben

Knoten Standard Bedeutung

input/input-image-address

(leer)

Adresse des zu durchsuchenden Bildknotens.

input/object-id

(leer)

Welches Objekt gesucht wird. Erforderlich - ein leerer Wert wird abgelehnt.

input/confidence-threshold

0.6

Kleinster akzeptierter Score, 0 bis 1.

input/nms-min-dist

0.0

Mindestabstand in Pixeln zwischen zwei gemeldeten Treffern.

input/pyramid

[1,2]

Ebenen der Bildpyramide, auf denen die Suche läuft. Keine Geschwindigkeitseinstellung - siehe Geschwindigkeit.

input/result-coordinate

IMAGE

IMAGE oder CROP - siehe unten.

input/crop/*

alle 0

Zu durchsuchende Region; alles null durchsucht das ganze Bild.

input/preprocess/bin-size

1

Suche mit geringerer Auflösung: schneller, weniger präzise. Siehe Bin-Größe.

input/preprocess/blur-*

aus

Optionale Glättung - siehe Die Suche abstimmen.

Ausführen

Setzen Sie die Eingaben und schreiben Sie dann auf <module>/find-object/execute:

module-1/find-object/input/input-image-address = hdvisionsystems/lumiscan-cam-driver/camera1/output/image
module-1/find-object/input/object-id           = screw-m6
module-1/find-object/input/confidence-threshold = 0.7
module-1/find-object/input/nms-min-dist         = 40
write module-1/find-object/execute

Lesen Sie dann output/status-code und output/result.

Setzen Sie nms-min-dist auf etwa die halbe Größe des Teils in Pixeln. Ohne diesen Wert wird ein einzelnes Teil oft mehrfach gemeldet, als Häufung leicht verschobener Treffer.

Ein Objekt pro Suche

input/object-id nennt einen der Einträge auf system/objects und ist erforderlich: Ein leerer Wert wird mit Statuscode -2 abgelehnt.

Es gibt keinen Durchlauf „nach allem suchen". Ein Detektor wird um ein Bild herum aufgebaut; die Suche nach mehreren Objekten bedeutet also mehrere Detektoren, und jeder verarbeitet das gesamte Bild erneut - das ist der teure Teil. find-object einmal pro Objekt auszuführen, macht diese Kosten sichtbar, statt sie hinter einer leeren Eingabe zu verstecken.

Um gemischte Teile zu sortieren, führen Sie die Methode einmal pro Objekt aus und vergleichen die Scores.

Das Ergebnis

output/result ist ein object_find_result-Flatbuffer.

Feld Bedeutung

matches[].x, .y

Linke obere Ecke der gefundenen Vorlage, in Pixeln.

matches[].width, .height

Größe der Vorlage, die übereingestimmt hat, damit der Treffer gezeichnet werden kann.

matches[].score

Ähnlichkeit von 0.0 bis 1.0.

matches[].object_id

Das gefundene Objekt; bei jedem Treffer eines Durchlaufs dasselbe.

best_index, best_score, best_object_id

Der Treffer mit dem höchsten Score.

image_width, image_height

Der Bildausschnitt, in dem die Koordinaten liegen.

confidence_threshold

Der angewendete Schwellwert.

timestamp

Mikrosekunden seit Epoche, gesetzt beim Abschluss des Durchlaufs.

Die Treffer sind nach Score sortiert, sodass matches[0] der beste ist.

Das Ergebnis enthält keine Rotation: Das gemeldete Rechteck ist achsenparallel. Wenn Sie wissen müssen, welche Orientierung gefunden wurde, geben Sie jeder Orientierung ein eigenes Objekt - screw-m6-front, screw-m6-tilted - und suchen Sie nacheinander danach. Die Antwort ist dann die object_id, die übereingestimmt hat.

Bild- und Ausschnittskoordinaten

input/result-coordinate wählt das Bezugssystem, in dem Positionen gemessen werden:

  • IMAGE (Standard) - das vollständige Bild an input-image-address. Das braucht ein Robotergriff.

  • CROP - die durchsuchte Region, deren linke obere Ecke zu (0,0) wird.

image_width und image_height folgen derselben Wahl, sodass das Normieren einer Koordinate mit ihnen in beiden Fällen korrekt ist.

Die Region wird genau wie angegeben durchsucht

Jede Größe funktioniert, und kein Teil von input/crop wird weggelassen. cv::linemod braucht zwar ein Bild, dessen Größe ein bestimmtes Vielfaches ist, aber der Detektor füllt intern bis dahin auf, statt eine ihm genehme Größe zu verlangen. Nichts, was Sie konfigurieren, muss also eine Regel erfüllen.

Früher wurde stattdessen beschnitten, was bis zu 7 Pixel am rechten und unteren Rand kostete - 31 bei bin-size 4. Das Beschneiden war schlimmer, als es aussah: Es verwarf Spalten, die die Kamera tatsächlich aufgenommen hatte, und ließ den toten Rand von cv::linemod - es ignoriert den äußeren Ring dessen, was es erhält - auf den verbliebenen Pixeln liegen. Gemessen erreichte ein Objekt an der letzten nutzbaren Position 0.79 beschnitten gegenüber 1.00 aufgefüllt.

Die Auffüllung repliziert die Randpixel nach außen, erzeugt also keine eigenen Gradienten und kann nicht mit einer Form verwechselt werden; ein Treffer wird nie aus ihr heraus gemeldet. Sie wird nur rechts und unten angefügt, sodass jede gemeldete Position weiterhin eine Position im von Ihnen konfigurierten Bild ist.

Was ein leeres Ergebnis bedeutet

Ein leeres Ergebnis mit status-code 1 bedeutet das Objekt war nicht im Bild, und nichts anderes.

Jeder andere Grund, aus dem eine Suche leer zurückkommen könnte - das Objekt hat kein Bild, das Bild ist unbrauchbar, eine Pyramidenebene ist ungültig, bin-size hat zu wenig vom Objekt zum Erkennen übrig gelassen - wird vor dem Start der Suche erkannt und als negativer Statuscode gemeldet. Siehe Ausführungsstatus.

Erkennungsgeschwindigkeit

Das Bild wird bei der ersten Verwendung zu einem Detektor kompiliert, und dieser Detektor wird so lange wiederverwendet, wie Einstellungen und Objekt unverändert bleiben. Das Ändern einer Eingabe oder das Speichern einer neuen Vorlage baut ihn beim nächsten Durchlauf neu auf.

Das Kompilieren ist mit Abstand der teuerste Teil eines Durchlaufs. Eine Produktionsschleife, die wiederholt mit unveränderten Einstellungen ausführt, zahlt diese Kosten also einmal. Wer vor jedem Aufruf eine Einstellung ändert, zahlt sie jedes Mal.

Um die Suche selbst zu beschleunigen, verengen Sie zuerst input/crop und erhöhen dann input/preprocess/bin-size. input/pyramid zu erhöhen hilft nicht - siehe Geschwindigkeit.

Jedes Bild einer Kamera durchsuchen

find-object durchsucht ein Bild pro Aufruf. Wie ein Modul mit denselben Eingaben jedes Bild durchsucht, das eine Kamera streamt, lesen Sie in Objekte auf einem Bild-Stream finden (experimentell).