Text erkennen liest den Zielrahmen in voller Auflösung, nicht das Vollbild
grabFrameRegion() statt grabFrame(): "Modul scannen" bekam bisher das ganze Kamerabild, auf 1280 Pixel herunterskaliert - der Zielrahmen war dabei rein kosmetisch, obwohl er dem Nutzer einen wirksamen Ausschnitt suggeriert. Jetzt liest die Texterkennung genau den Rahmenausschnitt, in nativer Auflösung - denselben, den auch die laufende Barcode-Suche längst benutzt. Die Dateiauswahl (onPickFile) bleibt unverändert beim Vollbild, da sie keinen Zielrahmen kennt.
This commit is contained in:
+22
-4
@@ -1,6 +1,6 @@
|
||||
// Vollstaendige Verdrahtung der App: Kamera, Barcode/OCR-Erkennung, Sitzung
|
||||
// und Oberflaeche. Ersetzt das fruehere Sichtpruefungs-Geruest vollstaendig.
|
||||
import { startCamera, grabFrame, grabFrameRegion, imageDataFromFile } from './camera.js';
|
||||
import { startCamera, grabFrameRegion, imageDataFromFile } from './camera.js';
|
||||
import { decodeBarcodes } from './barcode.js';
|
||||
import { runOcr, isOcrAvailable } from './ocr.js';
|
||||
import { recognize } from './pipeline.js';
|
||||
@@ -50,7 +50,13 @@ let cameraUnavailableMessage = null;
|
||||
let currentModeId = null;
|
||||
|
||||
const view = renderScanView(app, {
|
||||
onCapture: () => processCapture(() => grabFrame(view.video)),
|
||||
// "Modul scannen" ist nur in Funktion 3 ("Text erkennen") sichtbar (siehe
|
||||
// applyMode()/setCaptureVisible) - der Zielrahmen suggeriert dem Nutzer dort
|
||||
// einen Ausschnitt, den grabFrame() (Vollbild, herunterskaliert) bisher gar
|
||||
// nicht einloeste. grabFrameRegion() liest genau den Rahmenausschnitt, in
|
||||
// voller Aufloesung - derselbe Ausschnitt, den auch die Barcode-Dauersuche
|
||||
// benutzt (siehe runSearchAttempt() weiter unten).
|
||||
onCapture: () => processCapture(() => grabFrameRegion(view.video)),
|
||||
onUndo: () => {
|
||||
// Waehrend eine Erkennung laeuft, darf kein Eintrag zurueckgenommen
|
||||
// werden - sonst koennte die Rueckgaengig-Flaeche einen Eintrag treffen,
|
||||
@@ -150,7 +156,7 @@ async function processCapture(getFrame) {
|
||||
// selbst (pipeline.js) bleibt unveraendert und kennt keine Funktionen.
|
||||
const { decodeBarcodes: decode, runOcr: recognizeText } =
|
||||
buildRecognitionAdapters(currentModeId, { decodeBarcodes, runOcr });
|
||||
const { spec, source, confidence, codes } = await recognize(
|
||||
const { spec, source, confidence, codes, rawText } = await recognize(
|
||||
frame,
|
||||
{ decodeBarcodes: decode, runOcr: recognizeText, isKnownCode },
|
||||
);
|
||||
@@ -188,13 +194,25 @@ async function processCapture(getFrame) {
|
||||
if (targetSession !== session) return;
|
||||
|
||||
const entry = commitAssignment(targetSession, spec, source, stackId, codes);
|
||||
// entry.rawText ist rein additiv (siehe recognize() in pipeline.js) -
|
||||
// session.js kennt das Feld nicht und bleibt deshalb unangetastet; es wird
|
||||
// hier von aussen an den bereits gebuchten Eintrag angehaengt, genau wie
|
||||
// die Stapelzuordnung selbst nie vom Rohtext abhaengt.
|
||||
entry.rawText = rawText;
|
||||
view.setLast(describeEntry(spec, entry.stackId));
|
||||
syncView();
|
||||
|
||||
// Nach einer manuellen Entscheidung im Rot-Dialog gibt es nichts mehr
|
||||
// rueckzumelden - der Dialog selbst war die Rueckmeldung.
|
||||
if (confidence !== 'red') {
|
||||
await showResult(app, { stackId: entry.stackId, spec, confidence });
|
||||
// Nur in Funktion 3 ("Text erkennen") ist der erkannte Text lang genug,
|
||||
// dass er gelesen werden will - dort bleibt die Rueckmeldung deshalb
|
||||
// stehen, bis der Nutzer sie wegtippt, statt sich nach kurzer Zeit von
|
||||
// selbst auszublenden (siehe showResult()). In den beiden Barcode-
|
||||
// Funktionen zaehlt Tempo, dort bleibt es beim automatischen Ausblenden.
|
||||
await showResult(app, {
|
||||
stackId: entry.stackId, spec, confidence, rawText, autoHide: currentModeId !== 'ocr',
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
failed = true;
|
||||
|
||||
Reference in New Issue
Block a user