Ar data flow
Questo articolo introduce il flusso di dati in EasyAR Sense. EasyAR Sense utilizza API componentizzate, con i componenti connessi tramite flussi di dati.
Input e output di dati

InputFrame: Frame di input. Contiene immagini, parametri della fotocamera, timestamp, trasformazione della fotocamera rispetto al sistema di coordinate mondiale e stato del tracking. I parametri della fotocamera, il timestamp, la trasformazione e lo stato del tracking sono opzionali, ma specifici componenti algoritmici potrebbero avere requisiti particolari per l'input.
OutputFrame: Frame di output. Contiene il frame di input e i risultati dell'elaborazione sincrona dei componenti.
FeedbackFrame: Frame di feedback. Contiene un frame di input e un frame di output storico, utilizzato per componenti di elaborazione sincrona con feedback come ImageTracker.
Componenti fotocamera
CameraDevice: Fotocamera predefinita su Windows, Mac, iOS, Android.
ARKitCameraDevice: Implementazione predefinita ARKit su iOS.
ARCoreCameraDevice: Implementazione predefinita ARCore su Android.
MotionTrackerCameraDevice: Implementa il motion tracking, calcolando le coordinate 6DoF del dispositivo tramite fusione di più sensori. (Supporta solo Android)
ThreeDofCameraDevice: Aggiunge orientamento 3DoF alla fotocamera predefinita.
InertialCameraDevice: Aggiunge orientamento 3DoF e traslazione planare basata su stime inerziali alla fotocamera predefinita.
Custom camera device: Implementazione personalizzata della fotocamera.
Componenti algoritmici
Componenti di elaborazione sincrona con feedback: Richiedono di emettere risultati per ogni frame insieme all'immagine della fotocamera e necessitano dei risultati dell'elaborazione del frame precedente per evitare interferenze reciproche.
ImageTracker: Implementa il rilevamento e il tracciamento di immagini piane.
ObjectTracker: Implementa il rilevamento e il tracciamento di oggetti 3D.
Componenti di elaborazione sincrona: Richiedono l'output dei risultati ogni fotogramma insieme all'immagine della fotocamera.
SurfaceTracker: Implementa il tracciamento delle superfici ambientali.
SparseSpatialMap: Implementa una mappa spaziale sparsa, fornendo la capacità di scansionare lo spazio fisico generando contemporaneamente una mappa di point cloud e di localizzarsi in tempo reale.
MegaTracker: Implementa il posizionamento spaziale Mega.
Componenti di elaborazione asincrona: Non richiedono l'output dei risultati ogni fotogramma insieme all'immagine della fotocamera.
CloudRecognizer: Implementa il riconoscimento cloud.
DenseSpatialMap: Implementa una mappa spaziale densa, utilizzabile per realizzare effetti come collisioni e occlusione.
Controllo disponibilità componenti
Tutti i componenti hanno una funzione isAvailable, utilizzabile per determinare se il componente è disponibile.
I componenti potrebbero non essere disponibili per
Mancanza di implementazione sul sistema operativo corrente.
Dipendenze mancanti (es. ARKit, ARCore).
Assenza del componente nella versione corrente (variant), ad esempio in versioni semplificate.
Componente non disponibile con la licenza corrente.
Prima di utilizzare un componente, è essenziale verificare la sua disponibilità e implementare soluzioni alternative o avvisi opportuni.
Flusso di dati
I componenti si connettono come mostrato di seguito.

Esiste un utilizzo speciale dell'input tramite frame di feedback, come illustrato:

Classi ausiliarie per il flusso di dati
Porte di emissione e ricezione del flusso di dati; ogni componente deve includere queste porte
SignalSink / SignalSource: Riceve/emette un segnale (senza dati).
InputFrameSink / InputFrameSource: Riceve/emette un InputFrame.
OutputFrameSink / OutputFrameSource: Riceve/emette un OutputFrame.
FeedbackFrameSink / FeedbackFrameSource: Riceve/emette un FeedbackFrame.
Divisione e unione del flusso di dati
InputFrameFork: Divide un InputFrame e lo emette in più flussi paralleli.
OutputFrameFork: Divide un OutputFrame e lo emette in più flussi paralleli.
OutputFrameJoin: Unisce più OutputFrame in uno solo, combinando tutti i risultati in
Results. È importante notare che le connessioni ai suoi ingressi multipli non dovrebbero essere stabilite mentre scorrono dati, altrimenti potrebbe rimanere bloccato nell'impossibilità di produrre output. (Si consiglia di completare il collegamento del flusso di dati prima di avviare la Camera).FeedbackFrameFork: Divide un FeedbackFrame e lo emette in più flussi paralleli.
Limitazione e bufferizzazione del flusso di dati
InputFrameThrottler: Riceve ed emette InputFrame, ma ne emette uno alla volta. Emette l'InputFrame successivo solo dopo aver ricevuto un segnale di trigger. Se riceve più InputFrame, quelli successivi possono sovrascrivere quelli precedenti.
OutputFrameBuffer: Riceve e memorizza in un buffer OutputFrame, in attesa che l'utente li prelevi. Può emettere un segnale quando riceve un OutputFrame.
Collegando il segnale emesso da OutputFrameBuffer a InputFrameThrottler si completa il processo di limitazione.
Trasformazione del flusso di dati
InputFrameToOutputFrameAdapter: Può incapsolare direttamente un InputFrame in un OutputFrame, utilizzato per il rendering e la visualizzazione.
InputFrameToFeedbackFrameAdapter: Può incapsolare un InputFrame e un FeedbackFrame in un FeedbackFrame, utilizzato per componenti di elaborazione sincrona con feedback.
Limite numero InputFrame
CameraDevice può impostare bufferCapacity, il numero massimo di InputFrame emessi. Il valore predefinito corrente è 8.
Le fotocamere personalizzate possono utilizzare BufferPool.
Per il numero di InputFrame richiesti da ciascun componente, consultare la documentazione API del rispettivo componente.
Se il numero di InputFrame è insufficiente, potrebbe causare un blocco del flusso di dati, portando a un blocco del rendering.
Un numero insufficiente di InputFrame potrebbe anche manifestarsi come un rendering fluido al primo avvio, ma bloccarsi dopo il passaggio in background o la pausa/riavvio dei componenti. È importante testare questi scenari.
Connessione e disconnessione
Sconsigliato connettere e disconnettere durante l'esecuzione del flusso di dati.
Se necessario, assicurarsi di operare solo su "spigoli di taglio" (rimuovendo i quali il flusso si divide in due parti), mai su spigoli che formano anelli (considerando il flusso come grafo non orientato), sugli input di OutputFrameJoin o sul sideInput di InputFrameThrottler. Altrimenti, si rischia di bloccare il flusso su nodi come OutputFrameJoin e InputFrameThrottler.
I componenti algoritmici hanno funzioni start/stop. Quando sono in stop, i frame non vengono elaborati ma vengono comunque emessi, semplicemente senza risultati.
Utilizzi tipici
Di seguito, l'utilizzo di un singolo ImageTracker, per il riconoscimento e tracking di target planari non ripetuti.
![]()
Di seguito, l'utilizzo di un singolo ImageTracker, per il riconoscimento e tracking di target planari ripetuti.
![]()
Di seguito, l'utilizzo di SparseSpatialMap, per la creazione di mappe spaziali sparse, localizzazione e tracking.

Di seguito, l'utilizzo combinato di SparseSpatialMap e DenseSpatialMap, per creazione di mappe sparse, localizzazione, tracking e generazione di mappe spaziali dense.
