cardstream
Open source Powered by Ximilar Bètaversie

De beste kaartherkenning voor livestreams. Gemaakt voor breaks, pack openings en liveshows.

cardstream kijkt mee met je break, pack opening of show en identificeert elke verzamelkaart zodra die in beeld komt: naam, set en betrouwbaarheid, live. Analyseer je live-shoppingstreams met een systeem dat elke kaart volgt. Voor streamers die meer willen weten.

Wat het identificeert

Van Pokémon tot Magic: The Gathering

Wissel per show van categorie en de hele engine gaat mee: detectie, filters en de identificatie-aanroep wijzen allemaal naar het juiste endpoint. Elke match komt terug met naam, set, setcode, kaartnummer, serie en jaar.

🃏

Verzamelkaartspellen

collectibles/v2/tcg_id
Ximilar Beschikbaar

Losse TCG-kaarten, modern en vintage, rechtstreeks van de stream. Het endpoint leest de illustratie, het kader en de tekst, zodat een kaart wordt geïdentificeerd op hetzelfde beeld dat je kijkers zien. Geen gezoek naar het setsymbool, geen getuur op het kaartnummer.

  • 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
🏅

Sportkaarten sport_id

Rookies, parallels, inserts en autographs uit alle grote sporten, van honkbal, basketbal en American football tot voetbal, ijshockey en meer: precies die kaart, precies die set, precies dat jaar.

Binnenkort
🧊

Graded slabs slab_id

Leest het label op de houder van een graded kaart: de kaart in een slab van PSA, BGS of CGC, geïdentificeerd zonder hem open te breken.

Binnenkort
📚

Comics comics_id

Covers worden op dezelfde manier geïdentificeerd als kaarten: titel, nummer en jaar, uit één enkel stilstaand frame.

Binnenkort
Niet gebonden aan één aanbieder

Koppel een commerciële herkenner, of je eigen

Alles wat bepaalt of er een aanroep komt, gebeurt vóór de identificatie zelf: de detectie, het bewegingsfilter en het identiteitsfilter draaien allemaal lokaal en staan los van de aanbieder. De aanroep zelf is één verwisselbare stap: standaard Ximilar, een commerciële dienst voor kaartidentificatie, of een model dat je zelf hebt getraind en op je eigen hardware host.

Het is één kleine interface: er gaat een uitsnede van de kaart in en er komt een match uit. Implementeer IdentifyTarget en elk filter, elke begrenzing en elke drempel ervoor blijft precies zo werken als voorheen. Nog steeds één uitsnede per nieuwe kaart, wie hem ook beantwoordt.

# je eigen herkenner, dezelfde engine
class HouseIdentifier(IdentifyTarget):
    def identify(self, crop_bgr):
        return my_service.match(crop_bgr)

# hoe dan ook één uitsnede per nieuwe kaart
$ cardstream-web --detector rfdetr
Waarom cardstream.ai?

Eén aanroep per kaart, niet per frame

Het idee: de analyse van je stream beperken tot de aanroepen die je echt iets nieuws vertellen. Het open-source alternatief voor gesloten SaaS-kaartherkenning: geen platform ertussen, geen licentie per gebruiker. Jouw hardware, jouw API-sleutel, en een toestandsmachine die alleen een aanroep doet als de kaart in beeld echt nieuw is.

54.000 → ~100
API-aanroepen per uur

Een naïeve pipeline die bij 15 fps elk frame opstuurt, doet 54.000 identificaties per uur. cardstream doet er één per nieuwe kaart die je laat zien: rond de honderd in datzelfde uur.

540×
minder identificatie-aanroepen

Hetzelfde uur, dezelfde video, dezelfde kaarten: 54.000 aanroepen tegenover ongeveer 100. Het bewegingsfilter en het identiteitsfilter draaien lokaal op je eigen hardware. Er gaat pas een aanroep uit als een echt nieuwe kaart stil in beeld is.

$0
platformkosten

Geen SaaS-abonnement, geen prijs per gebruiker, geen lock-in. Host de hele stack zelf, inclusief de identificatie, of koppel de Ximilar-API.

Functies

Alles wat een kaartshow op stream nodig heeft

Een co-host die geen kaart mist. Voor liveverkopers op platforms als Whatnot en Fanatics Live, voor box breaks, streams van kaartwinkels en het catalogiseren van je collectie. Overal waar een camera op karton gericht staat.

⚡

Herkend zodra hij in beeld komt

Geen scanknop. Geen wachttijd. Laat de kaart gewoon zien: in ongeveer een halve seconde gaat het van karton naar kaartnaam, met set en betrouwbaarheid, live op stream.

🎯

Eén aanroep per kaart

Een bewegingsfilter en een identiteitsfilter op basis van embeddings draaien lokaal op je eigen CPU. Houd je een kaart stil, dan volgt er geen enkele herhaalde aanroep. Wissel je van kaart, dan precies één nieuwe.

📡

Elke streambron

Webcam, videobestanden, RTSP, RTMP en SRT: opgehaald, of met --listen rechtstreeks vanuit OBS gepusht. WebSocket-JPEG-feeds voor zelfgebouwde opstellingen.

🔌

Elke identificatie-backend

Standaard Ximilar collectibles/v2. Of richt dezelfde engine op een commerciële kaartherkenner, of op een herkenner die je zelf hebt getraind en zelf host.

🧠

Gebruik je eigen modellen

De gewichten van de locator zijn van ons: een gefinetuned RF-DETR-segmentatiemodel, Apache-2.0, opgehaald door de installer. Detectoren met bounding boxes (RF-DETR, RT-DETRv2) worden ook ondersteund, als je liever je eigen export gebruikt.

🔓

Open source, zelf gehost

Eén Python-pakket met een ruime licentie. Lees het, fork het, draai het op je eigen hardware. Jouw sleutel, jouw data, jouw infrastructuur.

Hoe het werkt

Slim genoeg om te weten wanneer de API niet nodig is

Tussen je stream en de API staat een toestandsmachine. Elk frame gaat door DecisionCore, één toestandsmachine die lokaal draait, en drie lokale filters beslissen wanneer die ene API-stap echt nodig is.

1

Detecteren

lokaal · geen aanroep

Zoek de vierhoek van de kaart en trek hem recht tot een schone uitsnede. Het lokale bewegingsfilter begrenst dit in drie standen: beweging, stilstaande kaart, leeg beeld.

2

Bewegingsfilter

lokaal · geen aanroep

Een goedkoop gemiddeld verschil tussen frames. Pas als het beeld N frames lang stil is, is de kaart een tweede blik waard. Beweegt er nog iets? Wachten.

3

Identiteitsfilter

lokaal · geen aanroep

Een vergelijking van embeddings beantwoordt één vraag: is dit dezelfde kaart als daarnet? Dezelfde kaart → het bewaarde resultaat opnieuw tonen.

4

Identificeren

ximilar · 1 aanroep

Alleen een echt nieuwe kaart die stilligt, leidt tot een identificatie door Ximilar: asynchroon, met debounce, buiten de frame-loop. Het resultaat komt live terug.

Voor streamers, breakers en winkels

Stream je in je eentje?

Eén persoon, één camera, één lange avond vol breaks: je zou geen team van engineers nodig moeten hebben om te weten welke kaart er in beeld is. Koppel de stream die je toch al draait en laat cardstream hem live analyseren, of je nu via een marktplaats verkoopt of rechtstreeks via je eigen kanaal.

  • Whatnot
  • Fanatics Live
  • eBay Live
  • TikTok Shop
  • Twitch
  • YouTube Live
  • je eigen site

Geen toegang tot je account, geen API-sleutels van een marktplaats, geen bot in je chat, en geen band met een van deze platforms. cardstream leest je video, verder niets.

01

Je streamt al vanuit OBS

Voeg één extra uitvoer toe naast degene die je show voedt. Je kopers zien precies wat ze altijd al zagen: een kopie van hetzelfde beeld komt bij cardstream binnen, en elke kaart die op tafel komt, wordt in het voorbijgaan geïdentificeerd. De listener hieronder heeft de ffmpeg-binary van je systeem nodig. Of sla die tweede uitvoer helemaal over en laat cardstream de virtuele camera van OBS lezen als een gewone webcam.

$ cardstream-web --listen \
      --source rtmp://0.0.0.0:1935/live
# laat het tweede doel van OBS hiernaar wijzen
02

Of de camera die al op tafel staat

Een camera boven de tafel, een capture card, je telefoon als webcam: waar je je packs ook onder opent en je kaarten onder laat zien. De analyse draait op de machine naast de camera, dus standaard verlaat niets anders dan één uitsnede per kaart de kamer.

$ cardstream-web --source 0
# webcam · browser-UI op localhost
03

Of alles met een URL

Encoders, switchers, restreamers, een tweede studio aan de andere kant van de stad. Ophalen via RTSP, RTMP en SRT, plus WebSocket-JPEG-feeds als je opstelling zelfgebouwd is.

$ cardstream-web \
      --source rtsp://studio/stream1

Live overlay

Naam, set en betrouwbaarheid verschijnen zodra een kaart stilligt: klaar om voor te lezen, of om terug in je scène te zetten.

Elke kaart vastgelegd

Een doorlopende geschiedenis van alles wat je hebt laten zien: een thumbnail van elke kaart en hoe lang hij op stream was. Sla hem op in je Ximilar-account en kijk de show de ochtend erna terug: wat er verkocht is, wat het waard was.

Op maat van één persoon

Geen platformkosten, geen licentie per gebruiker. Een show van drie uur is een handvol identificatie-aanroepen, niet één per frame.

Cardstream Cloud

Je show, opgeslagen en klaar om terug te kijken

cardstream draait op je eigen machine en bewaart standaard niets. Voeg één flag toe en elke kaart die je laat zien, wordt ook opgeslagen in een sessie in je Ximilar-account: met de prijs, de tijd in beeld en de uitsnede waarop hij is geïdentificeerd. Open na de show de Ximilar-app en zie wat het waard was.

$ cardstream-web --price-stats \
    --ximilar-stream NEW
# toont de sessie-id en slaat op terwijl de show loopt
Een opgeslagen sessie in de Ximilar-app: getoonde producten, betaalde API-aanroepen, marktwaarde, gemiddelde tijd in beeld, de waardevolste producten en de meest voorkomende sets.

De show in cijfers

Getoonde producten, betaalde API-aanroepen, marktwaarde en gemiddelde tijd in beeld voor elke sessie, met daarnaast de waardevolste producten en de meest voorkomende sets.

Elke kaart, met afbeelding

Elke rij bewaart de kaart, de set, het nummer, de prijs en de uitsnede waarop hij is geïdentificeerd. Doorzoek de lijst op product of set en filter je sessies op status, platform en datum.

Maak er je eigen administratie van

Markeer wat verkocht is, voeg een notitie toe, corrigeer een verkeerde match of de prijs ervan, verwijder een valse. Geef de sessie een naam en hang er je eigen metadata aan: een kavelnummer, kosten, kopers.

Ga verder waar je gebleven was

Midden in de show opnieuw moeten starten? Geef de sessie-id mee in plaats van NEW en de show gaat verder in dezelfde sessie, ook als die al was afgesloten. Met --ximilar-workspace sla je hem op in een teamworkspace.

Standaard uit: zonder --ximilar-stream is de identificatie-aanroep het enige dat je machine verlaat. Voor opslaan heb je de dienst Cardstream op je Ximilar-account nodig; alleen het starten van een sessie wordt gefactureerd, en met --no-ximilar-stream-images blijft het bij tekst.

Snelstart

In 3 stappen van nul naar live identificatie

1

Installeer het

Een virtualenv, de release-wheel (gecontroleerd met een checksum), de modelgewichten en beide commando’s in je PATH. Gebruik het script, installeer dezelfde wheel met pip vanaf PyPI (de gewichten download je dan apart), of clone de repo en bouw het zelf. Docker en Windows staan op de downloadpagina.

$ curl -fsSL https://raw.githubusercontent.com/Ximilar-com/cardstream/main/scripts/install.sh | sh
# andere installatiemanieren → cardstream.ai/download
$ pip install 'cardstream[client,onnx]'   # of: uv tool install 'cardstream[client,onnx]'
# de wheel bevat geen gewichten: pak de twee tarballs van cardstream.ai/models uit
# en laat de flags ernaar wijzen:
$ 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
2

Koppel een identificatiesysteem

Standaard Ximilar collectibles/v2: een sleutel van ximilar.com is het enige inloggegeven dat het hele systeem nodig heeft. Of laat dezelfde stap naar je eigen herkenner wijzen.

$ export XIMILAR_API_KEY=your-key
3

Richt een camera op een kaart

Open de browser-UI met je webcam, of geef het je show: ophalen via RTSP, of laat OBS er rechtstreeks RTMP in pushen. Break je de hele avond één set? Vul die vooraf in en het endpoint hoeft niet meer te raden: Engelstalige Pokémon uit CRI, dat zijn drie dingen minder die mis kunnen gaan. Stel altijd --alphabet in als je --game instelt: wie het spel vooraf invult, schakelt de schriftdetectie van het endpoint zelf uit. Voeg --price-stats toe en elke match brengt ook marktprijzen in USD mee: mediaan, bandbreedte en laatste verkoop, op de kaart en in de geschiedenis. Voeg --ximilar-stream NEW toe om de show in je Ximilar-account op te slaan en hem achteraf terug te kijken.

$ cardstream-web
# → http://127.0.0.1:8001 — houd een kaart omhoog

# Engelstalige Pokémon-kaarten, één set (CRI - Chaos Rising), met marktprijzen in USD:
$ cardstream-web --game Pokemon --set-code CRI --alphabet latin --price-stats

Open source. Zelf gehost. Jouw stream, jouw stack.

Geen platform ertussen, geen licentie per gebruiker: koppel de Ximilar-API of je eigen identificatiesysteem, en cardstream roept het één keer per nieuwe kaart aan in plaats van één keer per frame. Of je nu breaks doet op Whatnot, een show draait zoals op Fanatics Live of live verkoopt via je eigen opstelling: draai cardstream vanavond nog, op de hardware die je al hebt.