AR data flow
Este artigo apresenta o data flow no EasyAR Sense. O EasyAR Sense usa APIs componentizadas, e os componentes são conectados por data flow.
Dados de entrada e saída

InputFrame: Input frame. Contém a image, camera parameters, timestamp, camera transform relativo ao world coordinate system e tracking status. Entre eles, camera parameters, timestamp, camera transform relativo ao world coordinate system e tracking status são optional, mas algorithm components específicos têm requisitos específicos para o input.
OutputFrame: Output frame. Contém o input frame e os output results dos synchronous processing components.
FeedbackFrame: Feedback frame. Contém um input frame e um historical output frame, e é usado por feedback-style synchronous processing components como ImageTracker.
Camera components
CameraDevice: Default camera no Windows, Mac, iOS e Android.
ARKitCameraDevice: Implementação default do ARKit no iOS.
ARCoreCameraDevice: Implementação default do ARCore no Android.
MotionTrackerCameraDevice: Implementa motion tracking e calcula as 6DoF coordinates do dispositivo por multi-sensor fusion. (somente Android)
ThreeDofCameraDevice: Adiciona 3DoF orientation à default camera.
InertialCameraDevice: Adiciona 3DoF orientation e plane translation baseada em inertial estimation à default camera.
custom camera device: Implementação de custom camera.
Algorithm components
Feedback-style synchronous processing component: precisa emitir results para cada camera image frame e precisa do processing result do frame anterior para evitar interferência mútua.
ImageTracker: implementa a detecção e o rastreamento de imagens planas.
ObjectTracker: implementa a detecção e o rastreamento de objetos 3D.
Componentes de processamento síncrono: precisam gerar resultados acompanhando a imagem da câmera em cada frame.
SurfaceTracker: implementa o rastreamento de superfícies do ambiente.
SparseSpatialMap: implementa sparse spatial maps, fornecendo a capacidade de escanear o espaço físico enquanto gera mapas de nuvem de pontos e realiza localização em tempo real.
MegaTracker: implementa a localização espacial Mega.
Componentes de processamento assíncrono: não precisam gerar resultados acompanhando a imagem da câmera em cada frame.
CloudRecognizer: implementa cloud recognition.
DenseSpatialMap: implementa dense spatial maps, que podem ser usados para implementar efeitos como collision e occlusion.
Verificação de availability de componentes
Todos os componentes têm uma função isAvailable, que pode ser usada para determinar se o componente está disponível.
Casos em que um componente está indisponível incluem:
Não está implementado no operating system atual.
As dependencies exigidas pelo componente não existem, como ARKit ou ARCore.
O componente não existe na version (variant) atual, por exemplo quando alguns recursos não existem em certas versões reduzidas.
O componente está indisponível sob a License atual.
Antes de usar um componente, sempre verifique se ele está disponível e execute o fallback ou prompt correspondente.
Data flow
A forma de conexão dos componentes é mostrada na figura abaixo.

Existe um uso especial em que o input é um feedback frame, como mostrado abaixo.

Data flow helper classes
Portas de envio e recebimento do data flow. Cada componente precisa incluir essas portas.
SignalSink / SignalSource: recebe/envia um sinal sem dados.
InputFrameSink / InputFrameSource: recebe/envia um InputFrame.
OutputFrameSink / OutputFrameSource: recebe/envia um OutputFrame.
FeedbackFrameSink / FeedbackFrameSource: recebe/envia um FeedbackFrame.
Ramificação e mesclagem do data flow
InputFrameFork: divide um InputFrame em várias saídas paralelas.
OutputFrameFork: divide um OutputFrame em várias saídas paralelas.
OutputFrameJoin: mescla vários OutputFrame em um e mescla todos os resultados em Results. Observe que suas múltiplas conexões de entrada não devem ser conectadas enquanto houver entrada de dados, caso contrário, ele pode entrar em um estado em que não consegue produzir saída. Recomenda-se concluir as conexões de data flow antes de Camera iniciar.
FeedbackFrameFork: divide um FeedbackFrame em várias saídas paralelas.
Throttling e cache do data flow
InputFrameThrottler: recebe e envia InputFrame, mas envia apenas um por vez. Ele envia o próximo InputFrame somente após receber um sinal de disparo. Quando vários InputFrame são recebidos, InputFrame posteriores podem sobrescrever os anteriores.
OutputFrameBuffer: recebe e armazena em cache OutputFrame, espera polling do usuário e pode enviar um sinal ao receber um OutputFrame.
Conecte o sinal enviado por OutputFrameBuffer a InputFrameThrottler para concluir todo o processo de throttling.
Conversão do data flow
InputFrameToOutputFrameAdapter: pode encapsular diretamente um InputFrame como OutputFrame para exibição de renderização.
InputFrameToFeedbackFrameAdapter: pode encapsular um InputFrame e um FeedbackFrame como FeedbackFrame para componentes de processamento sincronizado por feedback.
Limite do número de InputFrame
CameraDevice pode definir bufferCapacity, que é o número máximo de InputFrame que ele emite. O valor default atual é 8.
Custom cameras podem usar BufferPool para implementação.
Para o número de InputFrame exigido por cada componente, consulte a API documentation de cada componente.
Se o número de InputFrame for insuficiente, o data flow pode travar e fazer o rendering travar.
Se o número de InputFrame for insuficiente, também pode ocorrer o caso em que o rendering não trava na primeira inicialização, mas trava depois de mudar para background ou depois de pause/start dos componentes. Garanta que os testes cubram essa situação.
Conectar e desconectar
Não é recomendado conectar e desconectar enquanto o data flow está em execução.
Se for necessário conectar ou desconectar durante runtime, observe que isso só pode ser feito em um cut edge (após remover esse edge, o data flow é dividido em duas partes). Não pode ser feito em um edge em um cycle (aqui, cycle significa um ciclo formado por edges quando o data flow é visto como um undirected graph), no input de OutputFrameJoin ou no sideInput de InputFrameThrottler. Caso contrário, o data flow pode ficar preso em nodes como OutputFrameJoin e InputFrameThrottler, impedindo output.
Todos os algorithm components têm funcionalidades start/stop. Quando estão em stop, os frames não são processados, mas ainda são emitidos pelo componente, apenas sem results.
Uso típico
Veja a seguir o uso de um único ImageTracker, que pode ser usado para reconhecer e fazer tracking de planar image targets não repetidos.
![]()
Veja a seguir o uso de um único ImageTracker, que pode ser usado para reconhecer e fazer tracking de planar image targets repetidos.
![]()
Veja a seguir o uso de SparseSpatialMap, que pode ser usado para implementar sparse spatial map building, localization e tracking.

Veja a seguir o uso conjunto de SparseSpatialMap e DenseSpatialMap, que pode ser usado para implementar sparse spatial map building, localization, tracking e dense spatial map generation.
