Objekte auf einem Bild-Stream finden (experimentell)
| Der Bild-Stream ist experimentell. Seine Knoten und Einstellungen können sich noch ändern. Verwenden Sie ihn zur Evaluierung, und prüfen Sie ihn mit Ihren Kameras und Ihrem Data Layer, bevor Sie sich darauf verlassen. |
find-object durchsucht ein Bild pro Aufruf: Ihr Programm setzt input/input-image-address und schreibt auf
execute. Ein Bild-Stream funktioniert andersherum. Der Cam Driver veröffentlicht jedes Bild, das er aufnimmt,
auf <camera name>/control/publish/output/stream/frame, mit seiner Größe, seinem Pixelformat und seiner
Lineage (siehe das Handbuch des Cam Driver, Bilder streamen). Ein Modul abonniert den Stream einer Kamera,
durchsucht jedes Bild, sobald es eintrifft, und veröffentlicht ein Ergebnis pro Bild auf
control/subscribe/output/stream/result.
Jedes Bild wird mit den Eingaben von find-object durchsucht, wie sie in diesem Moment sind: das Objekt, der
Konfidenz-Schwellwert, die Ausschnittsregion und jeder andere Knoten unter find-object/input/. Die eine
Eingabe, die der Stream nicht verwendet, ist input/input-image-address: Das Bild tritt an ihre Stelle. Ändern
Sie eine Eingabe, während der Stream läuft, wird das nächste Bild mit dem neuen Wert durchsucht.
Jedes Ergebnis trägt die Lineage seines Bildes - welche Kamera es aufgenommen hat, in welchem Lauf des Kamera-Streams, als welches Bild des Laufs - ergänzt um den eigenen Schritt des Moduls. Siehe Die Lineage eines Ergebnisses.
Standardmäßig fällt das Modul nie hinter seine Kamera zurück. Treffen Bilder schneller ein, als das Modul sie durchsucht, nimmt es jedes Mal das neueste Bild, sobald die vorherige Suche abgeschlossen ist. Die Bilder dazwischen werden als übersprungen gezählt. Wie viele Bilder warten dürfen, legt die Warteschlangengröße fest, siehe Die Warteschlangengröße.
Ein Modul nimmt den Stream einer Kamera. Für eine andere Kamera oder andere Einstellungen verwenden Sie ein anderes Modul.
Die Stream-Knoten und die Art, wie ein Stream gestartet und gestoppt wird, sind in jeder LumiScan-App gleich, die einen Stream konsumiert; Streams (experimentell) im Data-Layer-Handbuch beschreibt sie allgemein. Diese Seite beschreibt, was beim Object Finder besonders ist.
Die Knoten des Streams
Jedes Modul hat die Knoten des Streams, ob es einen Stream abonniert oder nicht. Um sie zu verwenden, ist kein
Neustart nötig. Alle Adressen unten beginnen mit
hdvisionsystems/lumiscan-object-finder/<module-id>/. Sie liegen neben find-object/, nicht darin.
| Adresse | Bedeutung |
|---|---|
|
Prüft die fünf Eingaben von |
|
Entfernt die Quelle, die |
| Adresse | Typ | Bedeutung |
|---|---|---|
|
bool |
Stream-Modus: |
|
string |
Die eine Quelle: der Stream-Ordner einer Kamera, zum Beispiel
|
|
string |
Das Tag, das das Modul auf seine Ergebnisse setzt: Der Schritt des Moduls in der Lineage jedes Ergebnisses
trägt es, sodass jeder, der ein Ergebnis weiter hinten in der Kette liest, sieht, welches Modul es erzeugt hat.
Leer: die Modul-ID, das letzte Segment der Moduladresse, zum Beispiel |
|
uint32 |
Wie viele Bilder warten dürfen, während ein Bild durchsucht wird: |
|
bool |
|
Die Eingaben beginnen mit dem, was beim Start der Anwendung angewendet ist, sodass ein Client eine davon ändern und ausführen kann.
Was die Quelle enthalten muss: Lesen Sie hdvisionsystems/lumiscan-object-finder/system/meta/subscription-schema,
für jedes Modul gleich. Es ist ein JSON Schema des Knotens frame der Quelle, ein stream_image mit seiner
lineage und seinem image, in seiner JSON-Form. Siehe
Data-Layer-Referenz.
| Adresse | Typ | Bedeutung |
|---|---|---|
|
string |
Die zu entfernende Quelle: die Adresse, die |
| Adresse | Typ | Bedeutung |
|---|---|---|
|
wie die Eingaben |
Was |
|
string |
Der Hash dessen, womit die Ergebnisse erzeugt werden, als 16 Hexadezimalziffern. Schreibgeschützt. Siehe Der Einstellungs-Hash. |
| Adresse | Typ | Bedeutung |
|---|---|---|
|
bool |
|
|
Flatbuffer |
Die in jedem Bild gefundenen Treffer und die Lineage des Bildes. Abonnieren Sie ihn, um jedes Ergebnis zu erhalten. Siehe Das Ergebnis eines Bildes. |
|
string |
Warum das letzte Bild, das nicht durchsucht werden konnte, fehlgeschlagen ist. Es nennt die Quelle anhand ihrer Adresse, siehe Das Ergebnis eines Bildes. Wird beim Start des Streams geleert. |
|
uint64 |
Zähler des aktuellen oder des letzten Streams, siehe Die Statistik lesen. |
Der Stream veröffentlicht seine Ergebnisse auf control/subscribe/output/stream/result. Von den Knoten von
find-object schreibt er nur find-object/output/result, und nur bei eingeschaltetem keep-latest-output:
status-code und status-text behalten, was der letzte Aufruf der Methode dort hinterlassen hat.
Einrichten
-
Stellen Sie sicher, dass der Stream des Cam Driver läuft: Sein
hdvisionsystems/lumiscan-cam-driver/<camera name>/control/publish/output/stream/activeisttrue. -
Setzen Sie die Eingaben von
find-objectwie für eine einzelne Suche, siehe Ein Objekt finden. Ein Aufruf vonfind-object/executeauf demoutput/imageder Kamera ist ein schneller Weg, sie zu prüfen. -
Schreiben Sie den Stream-Ordner der Kamera, zum Beispiel
hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream, aufcontrol/subscribe/input/address. Lassen Siecontrol/subscribe/input/tagleer, um die Ergebnisse mit der Modul-ID zu markieren, oder schreiben Sie ein eigenes Tag hinein. -
Abonnieren Sie
control/subscribe/output/stream/result. -
Setzen Sie
control/subscribe/input/enableauftrueund schreiben Sie dann aufcontrol/subscribe/execute. Warten Sie, biscontrol/subscribe/output/stream/activetrueist. Ab dann treffen die Ergebnisse ein. -
Zum Stoppen setzen Sie
control/subscribe/input/enableauffalseund schreiben erneut aufcontrol/subscribe/execute. Das gerade durchsuchte Bild wird zuerst fertiggestellt.
Auf ctrlX OS verwenden Sie für diese Schritte die Data-Layer-Ansicht der ctrlX-OS-Weboberfläche oder Ihr SPS-Programm.
Auf einem PC dieselben Schritte mit krxclient, dem Kommandozeilen-Client von LumiScan Keryx, der eine SPS
vertritt. Ergänzen Sie die Optionen --keryx-backend und --keryx-url, die Ihr Broker braucht
(siehe krxclient):
krxclient write hdvisionsystems/lumiscan-object-finder/module-1/control/subscribe/input/address hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream
krxclient write hdvisionsystems/lumiscan-object-finder/module-1/control/subscribe/input/enable true
krxclient execute hdvisionsystems/lumiscan-object-finder/module-1/control/subscribe/execute
krxclient subscribe hdvisionsystems/lumiscan-object-finder/module-1/control/subscribe/output/stream/result --count 5
krxclient subscribe zeigt einen Flatbuffer nur anhand seiner Größe. Es sagt Ihnen, dass Ergebnisse eintreffen,
nicht, was sie enthalten.
Gut zu wissen:
-
Der Stream-Modus ist ein Pegel, kein Befehl, und der Stream kann vor dem Stream des Cam Driver gestartet werden: Ergebnisse treffen ein, sobald Bilder eintreffen. Siehe Stream starten und stoppen.
-
Was
control/subscribe/executeanwendet, wird in der Einstellungsdatei des Moduls gespeichert. Nach einem Neustart der Anwendung startet das Modul, wie es war: Eines, das gestreamt hat, streamt sofort wieder, ohne dass Ihr Programm etwas ausführt. Siehe In der Einstellungsdatei erhalten.
Die Quelle wechseln
Ein Modul nimmt eine Quelle. Eine SPS oder ein anderer Client wechselt sie, während die Anwendung läuft, mit oder ohne laufenden Stream:
-
Schreiben Sie die neuen Werte auf die Eingaben von
control/subscribe- nur die, die Sie ändern: Die anderen enthalten, was angewendet ist. -
Schreiben Sie auf
control/subscribe/execute. Die Eingaben werden gemeinsam geprüft, in der Einstellungsdatei des Moduls gespeichert und erst dann angewendet:setting/stream/zeigt sie sofort, und ein laufender Stream folgt bei seinem nächsten Zyklus. Eine andere Adresse ersetzt die Quelle; die Bilder, die bei der alten warteten, werden als übersprungen gezählt. Ein neues Tag, eine neue Warteschlangengröße oder ein neueskeep-latest-outputbraucht kein neues Abonnement: Ein neues Tag markiert das nächste Ergebnis. -
Um die Quelle zu entfernen, schreiben Sie ihre Adresse auf
control/unsubscribe/input/addressund dann aufcontrol/unsubscribe/execute. Der Stream-Modus endet damit. Die Eingaben voncontrol/subscribewerden auf das gesetzt, was angewendet wurde: Stream-Modus aus, keine Adresse. Das Tag bleibt: Es markiert die Ergebnisse des Moduls, nicht die Quelle.
Kann die Einstellungsdatei nicht geschrieben werden, ändert sich nichts. Siehe In der Einstellungsdatei erhalten.
Die Methoden antworten mit einem Ergebnis, dessen Name vom Data Layer abhängt (siehe Ergebnisse eines Methodenaufrufs):
| ctrlX Data Layer | LumiScan Keryx (PC) | Wann |
|---|---|---|
|
|
Erledigt. |
|
|
|
|
|
Die Einstellungsdatei konnte nicht geschrieben werden, zum Beispiel weil sie kein gültiges JSON ist. Nichts wurde geändert. |
Diese Methoden haben keinen status-text. Der Grund für eine Ablehnung wird in das Anwendungsprotokoll
geschrieben.
Kann die Quelle nicht abonniert werden, versucht es das Modul alle 5 Sekunden erneut, solange der Stream läuft, und protokolliert den ersten Fehlschlag.
Das Ergebnis eines Bildes
control/subscribe/output/stream/result enthält eine FlatBuffers-Tabelle vom Typ stream_object_matches
(Dateikennung HSOM), auf dem Data Layer registriert als
types/hdvisionsystems/lumiscan-object-finder/stream_object_matches. Ihr kompiliertes Schema ist als
bfbs/stream_object_matches.bfbs installiert.
| Feld | Bedeutung |
|---|---|
|
Woher das Ergebnis kam, siehe Die Lineage eines Ergebnisses. |
|
Die Treffer, als |
Ein Lesen von control/subscribe/output/stream/result liefert das letzte Ergebnis; vor dem ersten Bild ein
leeres. Das letzte Ergebnis bleibt nach dem Stopp des Streams erhalten.
Ein Bild wird so dekodiert, wie find-object den Bildknoten dekodiert, es werden also dieselben Pixelformate
akzeptiert, siehe Voraussetzungen. Ein Bild aus dem Stream und
dasselbe Bild, über input/input-image-address gelesen, ergeben dieselben Treffer.
Ein Bild, das nicht durchsucht werden kann, liefert kein Ergebnis. Es wird in statistics/failed-frames
gezählt, und control/subscribe/output/stream/last-failure nennt den Grund, zum Beispiel:
a frame of 'hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream' failed: invalid input: object-id is empty - name the object to search for, see system/objects
Die Gründe sind dieselben, die find-object in seinem status-text nennt: eine Eingabe, die es ablehnen
würde, ein Objekt, das nicht auf system/objects steht oder kein Bild hat, eine Ausschnittsregion, die nicht in
das Bild passt, eine Region, die der Detektor nicht durchsuchen kann.
Die Lineage eines Ergebnisses
lineage.steps listet auf, woher das Ergebnis kam, Ursprung zuerst:
-
Der Schritt der Kamera, wie der Cam Driver ihn erzeugt hat:
producerist die Adresse der Kamera,hdvisionsystems/lumiscan-cam-driver/<camera name>;run, wann der Stream der Kamera gestartet wurde;sequencedie Nummer des Bildes in diesem Lauf;external_iddie eigene Bildnummer der Kamera;settings_hashdie Einstellungen der Kamera;tagdas Tag des Cam Driver für die Kamera, standardmäßig deren Modul-ID, zum Beispielcamera1. -
Der Schritt des Moduls:
producerist die Adresse des Moduls,hdvisionsystems/lumiscan-object-finder/<module-id>;run, wann der Stream des Moduls gestartet wurde (jeder Start ist ein neuer Lauf);sequencedie Nummer des Ergebnisses im Lauf, ab1;settings_hashdie Einstellungen des Moduls, siehe Der Einstellungs-Hash;elapsed_usdie Mikrosekunden vom Eintreffen des Bildes beim Modul bis zu seinem Ergebnis, Wartezeit eingeschlossen;time_us, wann das Ergebnis erzeugt wurde, in Mikrosekunden seit der Epoche;tagdas Tag des Moduls,control/subscribe/input/tag, oder die Modul-ID, wenn es leer ist.
Ein Ergebnis benennt sein Bild also genau: die Kamera über producer, das Bild über run und sequence. Um
zu wissen, von welcher Kamera ein Ergebnis kam, lesen Sie den producer seines ersten Schritts. Eine Lücke in
der sequence des Kameraschritts zwischen zwei Ergebnissen derselben Kamera sind Bilder, die übersprungen
wurden, fehlgeschlagen sind oder verloren gingen.
Eine Lineage enthält höchstens 16 Schritte. Eine längere behält den Ursprung und die neuesten Schritte, und
dropped zählt die weggelassenen Schritte.
Ein Bild, das keine Lineage trägt, liefert ein Ergebnis allein mit dem Schritt des Moduls. Ein Wert auf dem
Knoten frame eines Streams, der kein stream_image ist, wird ignoriert und einmal protokolliert.
Der Einstellungs-Hash
setting/settings-hash und der settings_hash des Modulschritts in jedem Ergebnis identifizieren, womit die
Ergebnisse erzeugt werden. Der Knoten zeigt den Hash als 16 Hexadezimalziffern; der Schritt enthält denselben
Wert als Zahl. Der Hash umfasst:
-
jede Eingabe von
find-object, die die Suche liest, genau so, wie sie für das Bild gelesen wurde - alle außerinput/input-image-address; -
das Bild des Objekts, anhand seines Inhalts: Ein neues Bild, das unter der alten Objekt-ID gespeichert wird, ist ein neuer Hash;
-
Name und Version der Anwendung.
Er umfasst nicht den Stream-Modus, die Quelle, die Warteschlangengröße oder keep-latest-output: Sie wählen und takten die Bilder, sie ändern nicht, was darin gefunden wird.
Der Stream vergleicht für jedes Bild den Inhalt des Objektbildes mit dem Bild, mit dem der Detektor des Moduls
trainiert wurde. Unterscheiden sie sich, wird der Detektor neu trainiert, bevor das Bild durchsucht wird,
sodass ein Ergebnis nie mit einem Bild erzeugt wird, das sein Hash nicht benennt. find-object allein
vergleicht den Inhalt nicht: Es trainiert neu, wenn sich eine Detektoreinstellung ändert oder die Objektliste
aktualisiert wird, siehe Objektspeicher.
setting/settings-hash wird etwa jede halbe Sekunde aktualisiert, auch wenn der Stream aus ist. Wenn ein Hash
zum ersten Mal erscheint, schreibt das Modul die Einstellungen, für die er steht, nach
settings-history/<module-id>-<hash>.json im Konfigurationsverzeichnis der Anwendung, sodass ein in einem
Ergebnis gefundener Hash später nachgeschlagen werden kann. Die Anwendung löscht diese Dateien nicht. Eine
Datei sieht so aus, gekürzt:
{
"format": 1,
"settings": {
"find-object/input/confidence-threshold": 0.6,
"find-object/input/object-id": "screw-m6",
"find-object/template": {
"file": "<object directory>/screw-m6.png",
"fnv1a64": "<16 hex digits>"
},
"software.name": "lumiscan-object-finder",
"software.version": "<version>"
},
"settingsHash": "<16 hex digits>"
}
Ein Ergebnis trägt nur den Hash. Ein anderer Hash sagt, dass sich etwas geändert hat, womit die
Ergebnisse erzeugt werden, nicht was. Um das herauszufinden, vergleichen Sie die beiden Dateien in
settings-history, die die Hashes benennen, von Hand. Jede Eingabe, die die Suche liest, wird gehasht, sodass
eine Änderung, die ein Ergebnis nicht verändert, trotzdem den Hash ändern kann.
|
Die Statistik lesen
Die Zähler beginnen bei jedem Start des Streams bei null, werden etwa viermal pro Sekunde aktualisiert,
solange er läuft, und behalten ihre letzten Werte nach dem Stopp. Alle Adressen beginnen mit
control/subscribe/output/stream/statistics/.
| Zähler | Bedeutung |
|---|---|
|
Millisekunden seit dem Start des Streams. Teilen Sie einen Zähler dadurch, um eine Rate zu erhalten. |
|
Bilder, die das Abonnement geliefert hat. |
|
Durchsuchte Bilder, jedes mit einem auf |
|
Nie durchsuchte Bilder: von neueren aus der Warteschlange verdrängt, während ein Bild durchsucht wurde (siehe Die Warteschlangengröße), oder wartend, als die Quelle ersetzt oder entfernt wurde. |
|
Bilder, die nicht durchsucht werden konnten. |
|
Bilder, die verloren gingen, bevor sie ankamen, gezählt anhand von Lücken in der |
|
Mikrosekunden, die alle Suchen gedauert haben, summiert, ohne die Zeit, die ein Bild auf |
Bilder, die beim Stopp des Streams noch warten, werden verworfen, ohne gezählt zu werden.
In der Einstellungsdatei erhalten
Stream-Modus und Quelle sind Einstellungen des Moduls. Sie werden im Abschnitt stream der Einstellungsdatei
des Moduls aufbewahrt, <module-id>.json im Konfigurationsverzeichnis der Anwendung - die Datei, in die
system/save-module-inputs die Eingaben schreibt.
control/subscribe/execute und control/unsubscribe/execute speichern dort selbst, was sie anwenden, alle
fünf Werte in einem Schreibvorgang, bevor sie sie anwenden. Kann die Datei nicht geschrieben werden, antwortet
die Methode mit CreationFailed (ctrlX: DL_CREATION_FAILED), und nichts ändert sich. Nach einem Neustart
abonniert das Modul dieselbe Quelle und startet, wenn stream.enable true ist, seinen Stream sofort: Niemand
muss etwas ausführen.
Das Speichern ändert nur den Abschnitt stream; der Rest der Datei bleibt, wie er war. Das Modul legt die
Datei an, wenn es noch keine gibt - ein Modul, dessen Eingaben nie gespeichert wurden, hat keine.
system/save-module-inputs wiederum behält den Abschnitt stream, wenn es die Datei neu schreibt; die
Eingaben von control/subscribe werden nicht als Eingaben des Moduls gespeichert.
| Plattform | Konfigurationsverzeichnis |
|---|---|
ctrlX OS |
|
PC (Windows) |
|
Der Abschnitt stream, neben den Eingaben von find-object (hier gekürzt):
{
"find-object": {
"object-id": "screw-m6"
},
"stream": {
"enable": true,
"address": "hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream",
"queueSize": 1,
"keepLatestOutput": false
}
}
| Schlüssel | Erforderlich | Bedeutung |
|---|---|---|
|
Nein |
Stream-Modus: |
|
Nein |
Die eine Quelle: der Stream-Ordner einer Kamera. |
|
Nein |
Was die Ergebnisse des Moduls markiert: das |
|
Nein |
Wie viele Bilder warten dürfen: |
|
Nein |
|
|
Nein |
Die Schritte, die auf jedes eintreffende Bild angewendet werden, jeder ein Objekt mit einem |
control/subscribe/execute und control/unsubscribe/execute schreiben alle fünf.
Gut zu wissen:
-
Die Datei wird einmal gelesen, wenn das Modul beim Start der Anwendung wiederhergestellt wird: ein Modul in der gespeicherten Modulliste oder
module-1bei einer frischen Installation. Von Hand an der Datei vorgenommene Änderungen wirken beim nächsten Start. -
Ein mit
system/create-moduleangelegtes Modul beginnt mit ausgeschaltetem Stream, ohne Quelle, mit einer Warteschlangengröße von1und ausgeschaltetemkeep-latest-output, was auch immer eine Datei seines Namens enthält. Was es von da an anwendet, wird in diese Datei gespeichert. -
Damit ein Modul und sein Stream nach einem Neustart zurückkommen, speichern Sie auch die Modulliste, mit
system/save-current-modules. Das Speichern einer Liste, die ein Modul nicht mehr nennt, löscht die Datei dieses Moduls und damit seine Stream-Einstellungen. Siehe Modulverwaltung. -
Ein Wert, der nicht verwendet werden kann, wird ignoriert und protokolliert: ein
enableoderkeepLatestOutput, das nichttrueoderfalseist, eineaddressoder eintag, das kein String ist, einequeueSizeaußerhalb von1bis64(1wird verwendet). Stream-Modus ohneaddresswird ignoriert: Das Modul startet außerhalb des Stream-Modus. -
Der Abschnitt
subscriptionsfrüherer Versionen wird nicht mehr gelesen, und das Modul protokolliert, dass er umgezogen ist: Geben Sie die Quelle alsaddressan.
Fügen Sie <module-id>.json keine Kommentare hinzu. Der Stream liest eine Datei mit Kommentaren, aber
die Eingaben des Moduls werden dann beim Start nicht wiederhergestellt: Das Protokoll meldet die Datei als
unlesbar.
|
Die Warteschlangengröße
control/subscribe/input/queue-size legt fest, wie viele Bilder warten dürfen, während ein Bild durchsucht
wird: 1 bis 64, standardmäßig 1. Sie wird als stream.queueSize gespeichert, und
setting/stream/queue-size zeigt den verwendeten Wert. Ein Bild, das eintrifft, wenn so viele warten,
verdrängt das älteste davon, was in statistics/skipped-frames gezählt wird. Eine neue Warteschlangengröße
gilt ab dem nächsten eintreffenden Bild, ohne neues Abonnement.
| Warteschlangengröße | Wirkung |
|---|---|
1 (Standard) |
Das Modul durchsucht das neueste Bild. Es fällt nie zurück; ist die Suche langsamer als die Kamera, überspringt es Bilder. |
Mehr als 1 |
Kurze Bildfolgen werden alle durchsucht, und weniger Bilder werden übersprungen. Ist die Suche über längere Zeit langsamer als die Kamera, fällt das Modul zurück: Es durchsucht Bilder, die bis zu so viele Suchen alt sind. Jedes wartende Bild hält ein ganzes Bild im Speicher. |
Die letzte Ausgabe behalten
Mit control/subscribe/input/keep-latest-output true - angewendet durch control/subscribe/execute,
gespeichert als stream.keepLatestOutput - schreibt das Modul jedes Stream-Ergebnis zusätzlich nach
find-object/output/result, so wie find-object/execute es schreibt, sobald das Ergebnis auf
control/subscribe/output/stream/result veröffentlicht ist. Ein Client, der find-object/output/result
liest, hat dann das Ergebnis des neuesten Bildes, ohne den Stream zu abonnieren. status-code und
status-text werden nicht geschrieben: Sie behalten, was der letzte Aufruf von find-object dort hinterlassen
hat. Es kostet eine Kopie jedes Ergebnisses. Standardmäßig aus.
find-object, während der Stream läuft
Der Stream und find-object verwenden dieselben Eingaben und den einen trainierten Detektor des Moduls, und
sie laufen auf einem Modul nie gleichzeitig:
-
Ein Bild, das eintrifft, während
find-objectläuft, wartet, bis die Methode abgeschlossen ist. Es wird verzögert, nicht verworfen. -
Ein Aufruf von
find-object/execute, während ein Bild durchsucht wird, antwortet mit busy:output/status-codeist-1, der Schreibvorgang antwortet mitTooManyOperations(ctrlX:DL_TOO_MANY_OPERATIONS), und nichts wird getan.output/resultbehält seinen Wert, wie bei jedem busy-Aufruf (siehe Eine Methode ausführen). Bei einer streamenden Kamera passiert das oft. Stoppen Sie den Stream, bevor Sie die Methode aufrufen, oder rufen Sie sie erneut auf. -
system/remove-moduleantwortet ebenfalls mit busy (-1), während ein Bild dieses Moduls durchsucht wird. Stoppen Sie zuerst den Stream. Das Entfernen eines Moduls stoppt seinen Stream. -
system/create-objecthat eine eigene Sperre und wird vom Stream nicht aufgehalten.
Andere Module sind nicht betroffen: Jedes Modul hat seine eigene Sperre und seinen eigenen Stream.
Einschränkungen
-
Der Stream wurde nur unter Windows mit LumiScan Keryx und simulierten Bildern getestet. Er wurde nicht unter Linux - auf ctrlX OS oder Ubuntu -, auf dem ctrlX Data Layer oder mit einer echten Kamera verifiziert.
-
LumiScan Cockpit zeichnet die Ergebnisse des Streams noch nicht.
-
Von Hand an der Einstellungsdatei vorgenommene Änderungen wirken beim nächsten Start der Anwendung.
-
Der Hash umfasst jede Eingabe, die die Suche liest. Er ändert sich bei manchen Änderungen, die ein Ergebnis nicht verändern.