Die beste Kartenerkennung für Livestreams. Gemacht für Breaks, Openings und Live-Shows.
cardstream schaut bei deinem Break, deinem Opening oder deiner Show zu und erkennt jede Sammelkarte, sobald sie ins Bild kommt: Name, Set und Konfidenz, live. Werte deine Live-Shopping-Streams mit Karten-Tracking aus. Für Streamer, die mehr wissen wollen.
Von Pokémon bis Magic: The Gathering
Wechsle die Kategorie pro Show, und die ganze Engine zieht mit: Detektion, Filter und Identifikationsaufruf zeigen alle auf den richtigen Endpunkt. Jeder Treffer kommt mit Name, Set, Set-Code, Kartennummer, Serie und Jahr zurück.
Sammelkartenspiele
collectibles/v2/tcg_id Einzelkarten aus Sammelkartenspielen (TCG), modern wie Vintage, direkt aus dem Stream. Der Endpunkt liest Artwork, Rahmen und Text und erkennt die Karte auf demselben Bild, das deine Zuschauer sehen. Kein Suchen nach dem Set-Symbol, kein Entziffern der Kartennummer.
- Pokémon
- Magic: The Gathering
- Yu-Gi-Oh!
- One Piece
- Lorcana
- Digimon
- Dragon Ball Super
- Flesh and Blood
- Star Wars Unlimited
- Star Wars Destiny
- MetaZoo
- Riftbound
- Weiss Schwarz
- Union Arena
- Force of Will
- Grand Archive
- Vanguard
- Marvel Champions
- Sorcery
- Final Fantasy
- Gundam
- Duel Masters
- Naruto Mythos
- Hololive
- Garbage Pail Kids
Sportkarten sport_id
Rookies, Parallels, Inserts und Autogrammkarten aus allen großen Sportarten, von Baseball, Basketball und American Football bis Fußball und Eishockey: genau die Karte, genau das Set, genau das Jahr.
Gegradete Karten (Slabs) slab_id
Liest das Label auf dem Case: Die Karte in einem Slab von PSA, BGS oder CGC wird erkannt, ohne dass du ihn aufbrechen musst.
Comics comics_id
Cover werden genauso erkannt wie Karten: Titel, Ausgabe und Jahr, aus einem einzigen ruhigen Frame.
Schließ ein proprietäres Erkennungssystem an, oder dein eigenes
Alles, was darüber entscheidet, ob überhaupt aufgerufen wird, passiert vor der eigentlichen Identifikation: Detektion, Bewegungsfilter und Identitätsfilter laufen lokal und hängen von keinem Anbieter ab. Der Aufruf selbst ist ein einzelner, austauschbarer Schritt: Ximilar ab Werk, ein proprietärer Dienst zur Kartenerkennung oder ein Modell, das du selbst trainiert hast und auf eigener Hardware betreibst.
Es ist eine einzige kleine Schnittstelle: Ein Kartenausschnitt geht hinein, ein Treffer kommt heraus. Implementiere IdentifyTarget, und alle Filter, Drosselungen und Schwellenwerte davor arbeiten genau wie bisher. Es bleibt bei einem Ausschnitt pro neuer Karte, egal wer antwortet.
# dein eigenes Erkennungssystem, dieselbe Engine class HouseIdentifier(IdentifyTarget): def identify(self, crop_bgr): return my_service.match(crop_bgr) # so oder so: ein Ausschnitt pro neuer Karte $ cardstream-web --detector rfdetr
Ein Aufruf pro Karte, nicht pro Frame
Es geht darum, die Stream-Analyse auf die Aufrufe zu beschränken, die dir wirklich etwas Neues sagen. Die Open-Source-Alternative zu geschlossenen SaaS-Diensten für Kartenerkennung: keine Plattform dazwischen, keine Lizenz pro Nutzer. Deine Hardware, dein API-Schlüssel und ein Zustandsautomat, der nur dann einen Aufruf absetzt, wenn die Karte im Bild wirklich neu ist.
Eine naive Pipeline, die bei 15 fps jeden Frame abfragt, löst 54.000 Identifikationen pro Stunde aus. cardstream löst eine pro neuer Karte aus, die du zeigst: rund hundert in derselben Stunde.
Dieselbe Stunde, dasselbe Video, dieselben Karten: 54.000 Aufrufe gegenüber rund 100. Bewegungs- und Identitätsfilter laufen lokal auf deiner eigenen Hardware. Ein Aufruf geht nur hinaus, wenn eine wirklich neue Karte ruhig im Bild liegt.
Kein SaaS-Abo, kein Preis pro Nutzer, kein Lock-in. Hoste den ganzen Stack samt Identifikation selbst oder verbinde dich mit der Ximilar-API.
Alles, was eine Karten-Show im Stream braucht
Ein Co-Host, dem keine Karte entgeht: für Live-Commerce-Verkäufer auf Plattformen wie Whatnot und Fanatics Live, für Box-Breaks, Streams aus dem Kartenladen und das Katalogisieren von Sammlungen. Überall, wo eine Kamera auf Pappe trifft.
Erkannt, sobald sie im Bild ist
Kein Scan-Knopf. Kein Warten. Zeig einfach die Karte: Von der Pappe zum Kartennamen dauert es etwa eine halbe Sekunde, mit Name, Set und Konfidenz, live im Stream.
Ein Aufruf pro Karte
Ein Bewegungsfilter und ein Identitätsfilter auf Embedding-Basis laufen lokal auf deiner eigenen CPU. Halte eine Karte still: kein einziger wiederholter Aufruf. Wechsle die Karte: genau ein neuer Aufruf.
Jede Stream-Quelle
Webcam, Videodateien, RTSP, RTMP und SRT: per Pull abgeholt oder mit --listen direkt aus OBS gesendet. Dazu WebSocket-JPEG-Feeds für Eigenbau-Setups.
Jedes Identifikations-Backend
Ximilar collectibles/v2 ab Werk. Oder du richtest dieselbe Engine auf ein proprietäres Erkennungssystem oder auf eines, das du selbst trainiert hast und betreibst.
Bring deine eigenen Modelle mit
Die Gewichte des Locators stammen von uns: ein feinabgestimmtes RF-DETR-Segmentierungsmodell unter Apache-2.0, das der Installer herunterlädt. Box-Detektoren (RF-DETR, RT-DETRv2) werden ebenfalls unterstützt, falls du lieber deinen eigenen Export mitbringst.
Open Source, selbst gehostet
Ein einziges Python-Paket unter einer freizügigen Lizenz. Lies es, forke es, betreib es auf deiner eigenen Hardware. Dein Schlüssel, deine Daten, deine Infrastruktur.
Schlau genug zu wissen, wann die API nicht aufgerufen werden muss
Zwischen deinem Stream und der API steht ein Zustandsautomat. Jeder Frame läuft durch DecisionCore, einen einzigen, lokal laufenden Zustandsautomaten, und drei lokale Filter entscheiden, wann der eine API-Schritt wirklich nötig ist.
Detektion
lokal · kein AufrufFindet das Viereck der Karte und entzerrt es zu einem sauberen Ausschnitt. Der lokale Bewegungsfilter drosselt die Detektion in drei Stufen: Bewegung, ruhige Karte, leeres Bild.
Bewegungsfilter
lokal · kein AufrufEine mittlere Frame-Differenz, die fast nichts kostet. Erst wenn die Szene N Frames lang ruhig ist, lohnt ein genauerer Blick auf die Karte. Noch in Bewegung? Warten.
Identitätsfilter
lokal · kein AufrufEin Embedding-Vergleich beantwortet eine einzige Frage: Ist das dieselbe Karte wie eben? Dieselbe Karte → das zwischengespeicherte Ergebnis wird noch einmal ausgegeben.
Identifikation
ximilar · 1 AufrufNur eine wirklich neue, ruhig liegende Karte löst eine Identifikation bei Ximilar aus: asynchron, entprellt, außerhalb der Frame-Schleife. Das Ergebnis kommt live zurück.
Du streamst allein?
Ein Mensch, eine Kamera, eine lange Nacht voller Breaks: Du solltest kein Entwicklerteam brauchen, um zu wissen, welche Karte gerade im Bild ist. Schließ den Stream an, den du ohnehin sendest, und lass cardstream ihn live auswerten, egal ob du auf einem Marktplatz verkaufst oder direkt über deinen eigenen Kanal.
- Whatnot
- Fanatics Live
- eBay Live
- TikTok Shop
- Twitch
- YouTube Live
- deine eigene Website
Kein Zugriff auf dein Konto, keine API-Schlüssel vom Marktplatz, kein Bot in deinem Chat, und keinerlei Verbindung zu einer dieser Plattformen. cardstream liest dein Video, sonst nichts.
Du streamst schon mit OBS
Füge neben der Ausgabe, die deine Show speist, eine weitere hinzu. Deine Käufer sehen genau das, was sie vorher gesehen haben. Eine Kopie desselben Signals landet bei cardstream, und jede Karte, die auf den Tisch kommt, wird im Vorbeigehen erkannt. Der Listener unten braucht ein systemweit installiertes ffmpeg. Oder du sparst dir die zweite Ausgabe ganz und lässt cardstream die virtuelle Kamera von OBS wie eine gewöhnliche Webcam lesen.
$ cardstream-web --listen \ --source rtmp://0.0.0.0:1935/live # richte das zweite Ziel von OBS hierhin
Oder die Kamera, die schon auf dem Tisch steht
Overhead-Kamera, Capture-Card, Handy als Webcam: das, worunter du ohnehin Booster öffnest und Karten zeigst. Die Analyse läuft auf dem Rechner neben der Kamera, also verlässt standardmäßig nichts außer einem Ausschnitt pro Karte den Raum.
$ cardstream-web --source 0 # Webcam · Browser-Oberfläche auf localhost
Oder alles, was eine URL hat
Encoder, Bildmischer, Restreamer, ein zweites Studio am anderen Ende der Stadt. Pulls per RTSP, RTMP und SRT, dazu WebSocket-JPEG-Feeds, wenn dein Setup Marke Eigenbau ist.
$ cardstream-web \
--source rtsp://studio/stream1 Live-Overlay
Name, Set und Konfidenz erscheinen, sobald eine Karte ruhig liegt: zum Vorlesen oder zum Einblenden in deine Szene.
Jede Karte, protokolliert
Ein fortlaufender Verlauf von allem, was du gezeigt hast: ein Vorschaubild jeder Karte und wie lange sie im Stream war. Speichere ihn in deinem Ximilar-Konto und geh die Show am nächsten Morgen durch: was verkauft wurde, was es wert war.
Gemacht für Solo-Streamer
Keine Plattformgebühr, keine Lizenz pro Nutzer. Eine dreistündige Show bedeutet eine Handvoll Identifikationsaufrufe, nicht einen pro Frame.
Schritt für Schritt: eine Show auf Whatnot oder Fanatics Live anbinden →
Deine Show, gespeichert und bereit zur Auswertung
cardstream läuft auf deinem Rechner und speichert standardmäßig nichts. Mit einem einzigen Flag landet jede Karte, die du zeigst, zusätzlich in einer Session in deinem Ximilar-Konto: mit ihrem Preis, ihrer Zeit im Bild und dem Ausschnitt, an dem sie erkannt wurde. Öffne nach der Show die Ximilar-App und sieh nach, was sie wert war.
$ cardstream-web --price-stats \ --ximilar-stream NEW # gibt die Session-ID aus und speichert, während die Show läuft
Die Show in Zahlen
Gezeigte Produkte, bezahlte API-Aufrufe, Marktwert und durchschnittliche Zeit im Bild für jede Session, daneben die wertvollsten Produkte und die häufigsten Sets.
Jede Karte, mit Bild
Jede Zeile enthält Karte, Set, Nummer, Preis und den Ausschnitt, an dem sie erkannt wurde. Durchsuche die Liste nach Produkt oder Set und filtere deine Sessions nach Status, Plattform und Datum.
Mach daraus dein Protokoll
Markiere, was verkauft wurde, füge eine Notiz hinzu, korrigiere einen falschen Treffer oder seinen Preis, lösche einen Fehltreffer. Gib der Session einen Namen und hänge eigene Metadaten an: eine Lot-Nummer, Kosten, Käufer.
Mach weiter, wo du aufgehört hast
Mitten in der Show neu gestartet? Gib statt NEW die Session-ID an, und die Show läuft in derselben Session weiter, selbst wenn sie schon geschlossen war. --ximilar-workspace speichert sie in einem Team-Workspace.
Standardmäßig aus: Ohne --ximilar-stream verlässt nur der Identifikationsaufruf deinen Rechner. Zum Speichern braucht dein Ximilar-Konto den Dienst Cardstream. Berechnet wird nur der Start einer Session, und mit --no-ximilar-stream-images bleibt es bei Text.
Von null zur Live-Identifikation in 3 Schritten
Installieren
Ein virtualenv, das Release-Wheel (per Prüfsumme verifiziert), die Modellgewichte und beide Befehle in deinem PATH. Nimm das Skript, installiere dasselbe Wheel mit pip von PyPI (die Gewichte sind ein separater Download) oder klone das Repository und baue es selbst. Docker und Windows findest du auf der Download-Seite.
$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh # weitere Installationswege → cardstream.ai/download
$ pip install 'cardstream[client,onnx]' # oder: uv tool install 'cardstream[client,onnx]' # das Wheel enthält keine Gewichte: entpacke die beiden Tarballs von cardstream.ai/models # und gib sie über die Flags an: $ cardstream-web --segmentor-model segmentation_model/onnx/model.onnx \ --embed-model similarity_model/onnx/model.onnx
$ git clone https://github.com/Ximilar-com/cardstream && cd cardstream $ ./scripts/build-from-source.sh --models $ source .venv/bin/activate
Ein Identifikationssystem verbinden
Ximilar collectibles/v2 ab Werk: Ein Schlüssel von ximilar.com ist alles an Zugangsdaten, was das ganze System braucht. Oder du richtest denselben Schritt auf dein eigenes Erkennungssystem.
$ export XIMILAR_API_KEY=your-key
Eine Karte in die Kamera halten
Öffne die Browser-Oberfläche mit deiner Webcam oder gib ihr deine Show: per RTSP-Pull, oder lass OBS direkt per RTMP hineinsenden. Den ganzen Abend ein einziges Set im Break? Gib es vor, und der Endpunkt muss nicht mehr raten: Englische Pokémon-Karten aus CRI sind drei Dinge weniger, die schiefgehen können. Setz --alphabet immer dann, wenn du --game setzt, denn die Vorgabe des Spiels schaltet die Schrifterkennung des Endpunkts ab. Mit --price-stats bringt jeder Treffer zusätzlich Marktpreise in USD mit: Median, Preisspanne und letzter Verkauf, an der Karte und im Verlauf. Mit --ximilar-stream NEW speicherst du die Show in deinem Ximilar-Konto und wertest sie später aus.
$ cardstream-web # → http://127.0.0.1:8001, halte eine Karte hoch # Englische Pokémon-Karten, ein Set (CRI - Chaos Rising), mit Marktpreisen in USD: $ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats
Open Source. Selbst gehostet. Dein Stream, dein Stack.
Keine Plattform dazwischen, keine Lizenz pro Nutzer: Verbinde die Ximilar-API oder dein eigenes Identifikationssystem, und cardstream ruft es einmal pro neuer Karte auf statt einmal pro Frame. Ob du auf Whatnot Breaks machst, eine Show im Stil von Fanatics Live fährst oder dein eigenes Live-Commerce-Setup streamst: Starte cardstream heute Abend auf der Hardware, die du schon hast.