Zählen: Aufnahme statt Dauerbetrieb

Die Zaehlanzeige sprang beim Nutzer im Dauerbetrieb wild zwischen etwa 3
und 60, obwohl dasselbe Verfahren an einem Standfoto stabil 18 lieferte -
eine Schaetzung wird durch staendiges Neuanzeigen nicht praeziser, nur
unruhig. "Zählen" laeuft jetzt wie "Text erkennen" auf Knopfdruck: eine
Aufnahme nimmt binnen rund einer Sekunde fuenf Bilder aus dem Zielrahmen
auf, zaehlt jedes einzeln (count-objects.js unveraendert) und zeigt deren
Median (neues Modul count-capture.js). Das Ergebnis bleibt stehen, bis
erneut angetippt wird; die Diagnosezeile zeigt zusaetzlich die fuenf
Einzelmessungen. Der gleitende Median ueber neun Durchlaeufe der
Dauerzaehlung (count-history.js) entfaellt, da die Aufnahme dieselbe
Robustheit bereits selbst leistet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 09:36:43 +02:00
co-authored by Claude Opus 5
parent d84c15e0d0
commit 4b6bb065b1
10 changed files with 330 additions and 260 deletions
+44
View File
@@ -0,0 +1,44 @@
// Reine Rechenlogik der Zaehl-Aufnahme (Funktion "Zählen", siehe main.js):
// aus den (bis zu fuenf) Einzelmessungen einer Aufnahme wird deren Median
// gebildet. Siehe count-capture.js fuer die Begruendung (robust gegen einen
// einzelnen Ausreisser, ohne wie eine fortlaufende Glaettung traege zu sein).
import { test } from 'node:test';
import assert from 'node:assert/strict';
import { combineCaptureCounts } from '../src/count-capture.js';
test('fuenf gleiche Messungen liefern diese Zahl', () => {
assert.equal(combineCaptureCounts([18, 18, 18, 18, 18]), 18);
});
test('fuenf verschiedene Messungen liefern deren Median (ungerade Anzahl)', () => {
assert.equal(combineCaptureCounts([17, 19, 18, 20, 18]), 18);
});
test('ein einzelner grober Ausreisser unter fuenf Messungen schlaegt nicht durch', () => {
// Vier stabile Messungen um 18 herum, eine grob daneben (z. B.
// Bewegungsunschaerfe oder Autofokus mitten in der Aufnahme) - der Median
// bleibt bei 18, ein Mittelwert waere durch den Ausreisser spuerbar verzerrt.
assert.equal(combineCaptureCounts([18, 18, 3, 18, 60]), 18);
});
test('weniger als fuenf Messungen (eine Kameraaufnahme scheiterte) liefern trotzdem ein Ergebnis', () => {
// Gerade Anzahl (vier statt fuenf) - Median ist der Mittelwert der beiden
// mittleren Werte.
const result = combineCaptureCounts([17, 18, 18, 19]);
assert.equal(result, 18);
});
test('nur eine einzige verwertbare Messung ist ihr eigener Median', () => {
assert.equal(combineCaptureCounts([21]), 21);
});
test('eine leere Messreihe wirft, statt stillschweigend ein sinnloses Ergebnis (NaN) zu liefern', () => {
assert.throws(() => combineCaptureCounts([]));
});
test('combineCaptureCounts veraendert die uebergebene Liste nicht (reine Funktion)', () => {
const counts = [5, 1, 3];
const untouched = [...counts];
combineCaptureCounts(counts);
assert.deepEqual(counts, untouched);
});