Text auf einem Bild-Stream lesen (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.

read-text liest 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, liest jedes Bild, sobald es eintrifft, und veröffentlicht ein Ergebnis pro Bild auf control/subscribe/output/stream/result. Der Stream funktioniert auf dem ctrlX Data Layer und auf LumiScan Keryx gleich; das allen LumiScan-Apps gemeinsame Konzept ist in Streams beschrieben. Diese Seite beschreibt, was beim Text Reader besonders ist.

Jedes Bild wird mit den Eingaben von read-text gelesen, wie sie in diesem Moment sind: Sprache, Engine, Layout, Zeichensatz, Ausschnittsregion und jeder andere Knoten unter read-text/input/. Die einzige 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 gelesen.

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 liest, nimmt es jedes Mal das neueste Bild, sobald das vorherige Lesen abgeschlossen ist. Die Bilder dazwischen werden als übersprungen gezählt. Wie viele Bilder warten dürfen, wird mit der Warteschlangengröße festgelegt, 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 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-text-reader/<module-id>/. Sie liegen neben read-text/, nicht darin.

Tabelle 1. Methoden
Adresse Bedeutung

control/subscribe/execute

Prüft die fünf Eingaben von control/subscribe gemeinsam, speichert sie in der Einstellungsdatei des Moduls und wendet sie dann an: Ein laufender Stream folgt bei seinem nächsten Zyklus, ohne Neustart. Eine Eingabe allein zu schreiben ändert nichts. Siehe Die Quelle ändern.

control/unsubscribe/execute

Entfernt die Quelle, die control/unsubscribe/input/address nennt, was auch den Stream-Modus beendet. Das Tag bleibt. Wird wie ein Subscribe in der Einstellungsdatei des Moduls gespeichert.

Tabelle 2. Eingaben von control/subscribe
Adresse Typ Bedeutung

control/subscribe/input/enable

bool

Stream-Modus: true lässt den Stream laufen, false stoppt ihn.

control/subscribe/input/address

string

Die eine Quelle: der Stream-Ordner einer Kamera, zum Beispiel hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream. Das Modul liest dessen Knoten frame. Eine andere Adresse ersetzt die Quelle.

control/subscribe/input/tag

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 unten liest, sieht, welches Modul es erzeugt hat. Leer: die Modul-ID, das letzte Segment der Moduladresse, zum Beispiel module-1. Ein neues Tag markiert das nächste Ergebnis; die Quelle bleibt abonniert.

control/subscribe/input/queue-size

uint32

Wie viele Bilder warten dürfen, während ein Bild gelesen wird: 1 bis 64. Siehe Die Warteschlangengröße.

control/subscribe/input/keep-latest-output

bool

true, um jedes Stream-Ergebnis zusätzlich nach read-text/output/result zu schreiben. Siehe Die neueste Ausgabe behalten.

Die Eingaben beginnen mit dem, was beim Start der Anwendung angewendet ist; ein Client kann also eine davon ändern und ausführen.

Was die Quelle enthalten muss: Lesen Sie hdvisionsystems/lumiscan-text-reader/system/meta/subscription-schema, für jedes Modul dasselbe. 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.

Tabelle 3. Eingabe von control/unsubscribe
Adresse Typ Bedeutung

control/unsubscribe/input/address

string

Die zu entfernende Quelle: die Adresse, die setting/stream/address zeigt. Ein / an einem der beiden Enden zählt nicht.

Tabelle 4. Einstellungen
Adresse Typ Bedeutung

setting/stream/enable, setting/stream/address, setting/stream/tag, setting/stream/queue-size, setting/stream/keep-latest-output

wie die Eingaben

Was control/subscribe/execute oder control/unsubscribe/execute zuletzt angewendet hat, so wie die Einstellungsdatei es enthält. Schreibgeschützt.

setting/settings-hash

string

Der Hash dessen, womit die Ergebnisse erzeugt werden, als 16 Hex-Ziffern. Schreibgeschützt. Siehe Der Einstellungs-Hash.

Tabelle 5. Ausgaben
Adresse Typ Bedeutung

control/subscribe/output/stream/active

bool

true, solange der Stream läuft.

control/subscribe/output/stream/result

flatbuffers stream_texts

Der aus jedem Bild gelesene Text und die Lineage des Bildes. Abonnieren Sie ihn, um jedes Ergebnis zu erhalten. Siehe Das Ergebnis eines Bildes.

control/subscribe/output/stream/last-failure

string

Warum das letzte Bild, das nicht gelesen werden konnte, fehlgeschlagen ist. Es nennt die Quelle über ihre Adresse, siehe Das Ergebnis eines Bildes. Wird beim Start des Streams geleert.

control/subscribe/output/stream/statistics/…​

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 read-text schreibt er nur read-text/output/result, und nur mit eingeschaltetem keep-latest-output: status-code und status-text behalten, was der letzte Aufruf der Methode dort hinterlassen hat.

Einrichten

  1. Stellen Sie sicher, dass der Stream des Cam Driver läuft: sein hdvisionsystems/lumiscan-cam-driver/<camera name>/control/publish/output/stream/active ist true.

  2. Setzen Sie die Eingaben von read-text wie für einen einzelnen Lesevorgang, siehe Text lesen. Ein Aufruf von read-text/execute auf dem output/image der Kamera ist ein schneller Weg, sie zu prüfen.

  3. Schreiben Sie den Stream-Ordner der Kamera, zum Beispiel hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream, nach control/subscribe/input/address. Lassen Sie control/subscribe/input/tag leer, um die Ergebnisse mit der Modul-ID zu markieren, oder schreiben Sie ein eigenes Tag hinein.

  4. Abonnieren Sie control/subscribe/output/stream/result.

  5. Setzen Sie control/subscribe/input/enable auf true und schreiben Sie dann auf control/subscribe/execute. Warten Sie, bis control/subscribe/output/stream/active true ist. Ab dann treffen die Ergebnisse ein.

  6. Zum Stoppen setzen Sie control/subscribe/input/enable auf false und schreiben erneut auf control/subscribe/execute. Das gerade gelesene Bild wird zuerst fertig gelesen.

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 (siehe Werkzeuge). Ergänzen Sie die Optionen --keryx-backend und --keryx-url, die Ihr Broker benötigt:

krxclient write hdvisionsystems/lumiscan-text-reader/module-1/control/subscribe/input/address hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream
krxclient write hdvisionsystems/lumiscan-text-reader/module-1/control/subscribe/input/enable true
krxclient execute hdvisionsystems/lumiscan-text-reader/module-1/control/subscribe/execute
krxclient subscribe hdvisionsystems/lumiscan-text-reader/module-1/control/subscribe/output/stream/result --count 5

krxclient subscribe zeigt einen Flatbuffer nur über seine Größe an. Es sagt Ihnen, dass Ergebnisse eintreffen, nicht, was sie enthalten.

Gut zu wissen:

  • Der Stream-Modus ist ein Pegel, kein Befehl: Der Stream läuft, solange das angewendete enable true ist.

  • Der Stream kann vor dem Stream des Cam Driver gestartet werden. Ergebnisse treffen ein, sobald Bilder eintreffen.

  • Was control/subscribe/execute anwendet, 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 gespeichert.

Die Quelle ändern

Ein Modul nimmt eine Quelle. Eine SPS oder ein anderer Client ändert sie, während die Anwendung läuft, mit oder ohne laufenden Stream:

  1. Schreiben Sie die neuen Werte auf die Eingaben von control/subscribe - nur die, die Sie ändern: Die anderen enthalten, was angewendet ist.

  2. 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 neues keep-latest-output braucht kein neues Abonnement: Ein neues Tag markiert das nächste Ergebnis.

  3. Um die Quelle zu entfernen, schreiben Sie ihre Adresse nach control/unsubscribe/input/address und dann auf control/unsubscribe/execute. Der Stream-Modus endet damit. Die Eingaben von control/subscribe werden 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 gespeichert.

Die Methoden antworten mit einem Ergebnis des Data Layer. Sein Name unterscheidet sich zwischen den beiden Data Layern, siehe Ergebnisse eines Methodenaufrufs:

ctrlX OS PC (LumiScan Keryx) Wann

DL_OK

Ok

Erledigt.

DL_INVALID_VALUE

Rejected

control/subscribe/execute: Stream-Modus ohne Adresse oder eine Warteschlangengröße außerhalb von 1 bis 64. control/unsubscribe/execute: Die Adresse ist nicht die Quelle, oder es gibt keine Quelle.

DL_CREATION_FAILED

CreationFailed

Die Einstellungsdatei konnte nicht geschrieben werden, zum Beispiel weil sie kein gültiges JSON ist. Nichts hat sich 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 das Modul es 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_texts (Datei-Identifier HSTX), auf dem Data Layer registriert als types/hdvisionsystems/lumiscan-text-reader/stream_texts. Ihr kompiliertes Schema ist als bfbs/stream_texts.bfbs installiert.

Feld Bedeutung

lineage

Woher das Ergebnis stammt, siehe Die Lineage eines Ergebnisses.

result

Das Leseergebnis, als hdv.text_read.Result: dieselbe Tabelle, die read-text für dasselbe Bild nach output/result schreibt, beschrieben in Text lesen.

Ein Lesen von control/subscribe/output/stream/result liefert das neueste Ergebnis; vor dem ersten Bild ein leeres. Das letzte Ergebnis bleibt nach dem Stopp des Streams erhalten.

Ein Bild wird dekodiert, wie read-text 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 dasselbe Leseergebnis.

Ein Bild, das nicht gelesen werden kann, ergibt kein Ergebnis. Es wird in statistics/failed-frames gezählt, und control/subscribe/output/stream/last-failure nennt den Grund. Die Gründe sind die, die read-text in seinem status-text nennt: eine Eingabe, die es ablehnen würde - darunter eine Sprache ohne Modell -, eine Ausschnittsregion, die nicht in das Bild passt, eine Region, die nicht gelesen werden kann, eine fehlgeschlagene Erkennung.

Ein in einer anderen Sprache gelesenes Bild wird verworfen

read-text prüft die Sprache, bevor es liest. Verschwindet das Modell zwischen dieser Prüfung und dem Lesen, liest die Engine stattdessen mit eng: read-text veröffentlicht das Leseergebnis dann mit einem NOTE in seinem status-text (siehe Sprachmodelle).

Der Stream veröffentlicht ein solches Leseergebnis nicht. Sein Einstellungs-Hash nennt das angeforderte Modell, nicht das verwendete, deshalb schlägt das Bild stattdessen fehl:

a frame of 'hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream' failed: language 'deu' is no longer installed; the frame was read with 'eng' instead and its result dropped

Ein hochgeladenes Modell wird ab dem nächsten Bild verwendet, wie bei read-text - ein neues ebenso wie eines, das an Ort und Stelle unter demselben Namen überschrieben wurde: Das Bild wird mit dem Modell gelesen, wie es auf dem Datenträger liegt, und der Hash nennt dieses Modell.

Die Lineage eines Ergebnisses

lineage.steps listet auf, woher das Ergebnis stammt, Ursprung zuerst:

  1. Der Schritt der Kamera, wie der Cam Driver ihn erzeugt hat: producer ist die Adresse der Kamera, hdvisionsystems/lumiscan-cam-driver/<camera name>; run, wann der Stream der Kamera gestartet wurde; sequence die Nummer des Bildes in diesem Lauf; external_id die eigene Bildnummer der Kamera; settings_hash die Einstellungen der Kamera; tag das Tag des Cam Driver für die Kamera, standardmäßig ihre Modul-ID, zum Beispiel camera1.

  2. Der Schritt des Moduls: producer ist die Adresse des Moduls, hdvisionsystems/lumiscan-text-reader/<module-id>; run, wann der Stream des Moduls gestartet wurde (jeder Start ist ein neuer Lauf); sequence die Nummer des Ergebnisses im Lauf, ab 1; settings_hash die Einstellungen des Moduls, siehe Der Einstellungs-Hash; elapsed_us die Mikrosekunden vom Eintreffen des Bildes am Modul bis zu seinem Ergebnis, Wartezeit eingeschlossen; time_us, wann das Ergebnis erzeugt wurde, in Mikrosekunden seit der Epoche; tag das Tag des Moduls, control/subscribe/input/tag, oder die Modul-ID, wenn es leer ist.

Ein Ergebnis benennt sein Bild also exakt: die Kamera über producer, das Bild über run und sequence. Um zu wissen, von welcher Kamera ein Ergebnis stammt, lesen Sie den producer seines ersten Schritts. Eine Lücke in der sequence des Kamera-Schritts zwischen zwei Ergebnissen derselben Kamera sind Bilder, die übersprungen wurden, fehlgeschlagen oder verloren gegangen sind.

Eine Lineage enthält höchstens 16 Schritte. Eine längere behält den Ursprung und die neuesten Schritte, und dropped zählt die ausgelassenen Schritte.

Ein Bild ohne Lineage ergibt ein Ergebnis mit dem Schritt des Moduls allein. 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 Modul-Schritts in jedem Ergebnis identifizieren, womit die Ergebnisse erzeugt werden. Der Knoten zeigt den Hash als 16 Hex-Ziffern; der Schritt enthält denselben Wert als Zahl. Der Hash umfasst:

  • jede Eingabe von read-text, die das Lesen verwendet, genau so, wie sie für das Bild gelesen wurde - alle außer input/input-image-address;

  • das Sprachmodell, <language>.traineddata, über seinen Inhalt: Ein neues Modell, das unter dem alten Namen hochgeladen wird, ist ein neuer Hash. Bei den Layouts AUTO_OSD und SPARSE_OSD auch das Orientierungsmodell osd.traineddata daneben. Die Modelle werden nur gehasht, wenn die Eingaben die Prüfung bestehen;

  • 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 aus ihnen gelesen wird.

setting/settings-hash wird etwa jede halbe Sekunde aktualisiert, auch während 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": {
        "read-text/input/language": "eng",
        "read-text/input/layout": "SINGLE_BLOCK",
        "read-text/language-model": {
            "file": "<model directory>/eng.traineddata",
            "fnv1a64": "<16 hex digits>"
        },
        "software.name": "lumiscan-text-reader",
        "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 nennen, von Hand. Jede Eingabe, die das Lesen verwendet, wird gehasht; eine Änderung, die ein Ergebnis nicht verändert, kann den Hash also trotzdem ändern.

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 nach dem Stopp ihre letzten Werte. Alle Adressen beginnen mit control/subscribe/output/stream/statistics/.

Zähler Bedeutung

elapsed-ms

Millisekunden seit dem Start des Streams. Teilen Sie einen Zähler dadurch, um eine Rate zu erhalten.

received-frames

Bilder, die das Abonnement geliefert hat.

processed-frames

Gelesene Bilder, jedes mit einem auf control/subscribe/output/stream/result veröffentlichten Ergebnis.

skipped-frames

Nie gelesene Bilder: von neueren aus der Warteschlange verdrängt, während ein Bild gelesen wurde (siehe Die Warteschlangengröße), oder wartend, als die Quelle ersetzt oder entfernt wurde.

failed-frames

Bilder, die nicht gelesen werden konnten. control/subscribe/output/stream/last-failure nennt den Grund für das letzte, und das Protokoll nennt die Fehlschläge, höchstens eine Zeile alle 5 Sekunden.

lost-frames

Bilder, die verloren gingen, bevor sie eintrafen, ermittelt aus Lücken in der sequence der Kamera innerhalb eines Laufs ihres Streams. Eine neue Quelle oder ein neuer Lauf des Kamera-Streams beginnt die Zählung neu.

processing-us

Mikrosekunden, die alle Lesevorgänge zusammen gedauert haben, ohne die Zeit, die ein Bild auf read-text gewartet hat. Teilen Sie durch processed-frames für den Mittelwert.

Bilder, die beim Stopp des Streams noch warten, werden verworfen, ohne gezählt zu werden.

In der Einstellungsdatei gespeichert

Stream-Modus und Quelle sind Einstellungen des Moduls. Sie werden im Member stream der Einstellungsdatei des Moduls gespeichert, <module-id>.json im Konfigurationsverzeichnis der Anwendung - der 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 DL_CREATION_FAILED (auf einem PC CreationFailed), 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 Member 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 Member stream, wenn es die Datei neu schreibt; die Eingaben von control/subscribe werden nicht als Eingaben des Moduls gespeichert.

Das Konfigurationsverzeichnis ist:

Plattform Konfigurationsverzeichnis

ctrlX OS

/var/snap/rexroth-solutions/common/solutions/activeConfiguration/lumiscan-text-reader

PC (Windows)

%APP_RESOURCE_DIR%\etc\lumiscan-text-reader; ohne APP_RESOURCE_DIR C:\ProgramData\HD Vision Systems GmbH\LumiScan Vision Suite\lumiscan-text-read\etc\lumiscan-text-reader

Der Member stream, neben den Eingaben von read-text (hier gekürzt):

{
    "read-text": {
        "language": "eng"
    },
    "stream": {
        "enable": true,
        "address": "hdvisionsystems/lumiscan-cam-driver/camera1/control/publish/output/stream",
        "queueSize": 1,
        "keepLatestOutput": false
    }
}
Schlüssel Erforderlich Bedeutung

enable

Nein

Stream-Modus: true startet den Stream beim Start der Anwendung. Benötigt eine address. false, wenn weggelassen.

address

Nein

Die eine Quelle: der Stream-Ordner einer Kamera.

tag

Nein

Was die Ergebnisse des Moduls markiert: das tag des Modul-Schritts in ihrer Lineage. Die Modul-ID, wenn weggelassen.

queueSize

Nein

Wie viele Bilder warten dürfen: 1 bis 64, 1, wenn weggelassen.

keepLatestOutput

Nein

true, um jedes Stream-Ergebnis zusätzlich nach read-text/output/result zu schreiben. false, wenn weggelassen.

onEntry

Nein

Die Schritte, die auf jedes eintreffende Bild angewendet werden, jeder ein Objekt mit einem kind, wie das stream jeder LumiScan-Anwendung sie hat. Diese Anwendung hat noch keine: Lassen Sie es weg oder leer ([]). Ein Schritt startet das Modul außerhalb des Stream-Modus, mit einer Warnung im Protokoll; das Speichern behält ihn.

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-1 bei einer frischen Installation. Von Hand an der Datei vorgenommene Änderungen wirken beim nächsten Start.

  • Ein mit system/create-module angelegtes Modul startet mit ausgeschaltetem Stream, ohne Quelle, mit einer Warteschlangengröße von 1 und ausgeschaltetem keep-latest-output, was immer eine Datei seines Namens enthält. Was es von da an anwendet, wird in diese Datei gespeichert.

  • Um ein Modul und seinen Stream nach einem Neustart zurückzubekommen, 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 mit ihr seine Stream-Einstellungen. Siehe Modulverwaltung.

  • Ein Wert, der nicht verwendet werden kann, wird ignoriert und protokolliert: ein enable oder keepLatestOutput, das nicht true oder false ist, eine address oder ein tag, das kein String ist, eine queueSize außerhalb von 1 bis 64 (1 wird verwendet). Stream-Modus ohne address wird ignoriert: Das Modul startet außerhalb des Stream-Modus.

  • Der Member subscriptions früherer Versionen wird nicht mehr gelesen, und das Modul protokolliert, dass er umgezogen ist: Geben Sie die Quelle als address an.

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 nicht lesbar.

Die Warteschlangengröße

control/subscribe/input/queue-size legt fest, wie viele Bilder warten dürfen, während ein Bild gelesen 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 von ihnen, 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 liest das neueste Bild. Es fällt nie zurück; ist das Lesen langsamer als die Kamera, überspringt es Bilder.

Mehr als 1

Kurze Bildschübe werden alle gelesen, und weniger werden übersprungen. Ist das Lesen länger langsamer als die Kamera, fällt das Modul zurück: Es liest Bilder, die bis zu so viele Lesevorgänge alt sind. Jedes wartende Bild hält ein ganzes Bild im Speicher.

Die neueste 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 read-text/output/result, so wie read-text/execute es schreibt, sobald das Ergebnis auf control/subscribe/output/stream/result veröffentlicht ist. Ein Client, der read-text/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 read-text dort hinterlassen hat. Es kostet eine Kopie jedes Ergebnisses. Standardmäßig aus.

read-text, während der Stream läuft

Der Stream und read-text verwenden dieselben Eingaben und die eine Erkennungs-Engine des Moduls, und sie laufen auf einem Modul nie gleichzeitig:

  • Ein Bild, das eintrifft, während read-text läuft, wartet, bis die Methode abgeschlossen ist. Es wird verzögert, nicht fehlgeschlagen.

  • Ein Aufruf von read-text/execute, während ein Bild gelesen wird, antwortet mit belegt: output/status-code ist -1, der Schreibvorgang antwortet mit DL_TOO_MANY_OPERATIONS (auf einem PC TooManyOperations), und nichts wird getan. output/result behält seinen Wert, wie bei jedem belegten 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-module antwortet ebenfalls mit belegt (-1), während ein Bild dieses Moduls gelesen wird. Stoppen Sie zuerst den Stream. Das Entfernen eines Moduls stoppt seinen Stream.

  • system/set-tessdata-dir und system/refresh-languages werden vom Stream nicht aufgehalten.

Andere Module sind nicht betroffen: Jedes Modul hat seine eigene Sperre, seine eigene Engine und seinen eigenen Stream.

Einschränkungen

  • Ein Bild, das mit einer anderen als der angeforderten Sprache gelesen wurde, schlägt fehl, siehe Ein in einer anderen Sprache gelesenes Bild wird verworfen.

  • Der Stream wurde nur unter Windows mit LumiScan Keryx und mit simulierten Bildern getestet. Er wurde nicht unter Linux, 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 das Lesen verwendet. Er ändert sich bei manchen Änderungen, die ein Ergebnis nicht verändern.