Ein Objekt finden
<module>/find-object durchsucht ein Bild einmal nach einem bekannten Objekt.
Eingaben
| Knoten | Standard | Bedeutung |
|---|---|---|
|
(leer) |
Adresse des zu durchsuchenden Bildknotens. |
|
(leer) |
Welches Objekt gesucht wird. Erforderlich - ein leerer Wert wird abgelehnt. |
|
|
Kleinster akzeptierter Score, 0 bis 1. |
|
|
Mindestabstand in Pixeln zwischen zwei gemeldeten Treffern. |
|
|
Ebenen der Bildpyramide, auf denen die Suche läuft. Keine Geschwindigkeitseinstellung - siehe Geschwindigkeit. |
|
|
|
|
alle |
Zu durchsuchende Region; alles null durchsucht das ganze Bild. |
|
|
Suche mit geringerer Auflösung: schneller, weniger präzise. Siehe Bin-Größe. |
|
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 |
|---|---|
|
Linke obere Ecke der gefundenen Vorlage, in Pixeln. |
|
Größe der Vorlage, die übereingestimmt hat, damit der Treffer gezeichnet werden kann. |
|
Ähnlichkeit von 0.0 bis 1.0. |
|
Das gefundene Objekt; bei jedem Treffer eines Durchlaufs dasselbe. |
|
Der Treffer mit dem höchsten Score. |
|
Der Bildausschnitt, in dem die Koordinaten liegen. |
|
Der angewendete Schwellwert. |
|
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 aninput-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).