Fluxo de dados AR
Este artigo apresenta o fluxo de dados no EasyAR Sense. O EasyAR Sense utiliza uma API baseada em componentes, onde os componentes são interligados por meio de um fluxo de dados.
Dados de entrada e saída

InputFrame: Quadro de entrada. Contém imagem, parâmetros da câmera, carimbo de data/hora, transformação da câmera em relação ao sistema de coordenadas mundial e estado de rastreamento. Os parâmetros da câmera, carimbo de data/hora, transformação e estado de rastreamento são opcionais, mas componentes algorítmicos específicos podem ter requisitos particulares para a entrada.
OutputFrame: Quadro de saída. Contém o quadro de entrada e os resultados de processamento sincronizado dos componentes.
FeedbackFrame: Quadro de feedback. Contém um quadro de entrada e um quadro de saída histórico, utilizado por componentes de processamento sincronizado com feedback, como ImageTracker.
Componentes de câmera
CameraDevice: Câmera padrão em Windows, Mac, iOS, Android.
ARKitCameraDevice: Implementação padrão do ARKit no iOS.
ARCoreCameraDevice: Implementação padrão do ARCore no Android.
MotionTrackerCameraDevice: Implementa rastreamento de movimento, calculando as coordenadas 6DoF do dispositivo através de fusão de múltiplos sensores. (Suporte apenas para Android)
ThreeDofCameraDevice: Adiciona orientação 3DoF à câmera padrão.
InertialCameraDevice: Adiciona orientação 3DoF e translação plana baseada em estimativa inercial à câmera padrão.
custom camera device: Implementação personalizada de câmera.
Componentes algorítmicos
Componentes de processamento sincronizado com feedback: Exigem resultados a cada quadro de saída de imagem da câmera e necessitam do resultado do quadro anterior para evitar interferências mútuas.
ImageTracker: Implementa a detecção e rastreamento de imagens planas.
ObjectTracker: Implementa a detecção e rastreamento de objetos 3D.
Componentes de processamento síncrono: Requerem resultados de saída a cada quadro junto com a imagem da câmera.
- SurfaceTracker: Implementa o rastreamento de superfícies ambientais.
- SparseSpatialMap: Implementa o mapa espacial esparso, fornecendo a capacidade de escanear o espaço físico enquanto gera um mapa de nuvem de pontos e realiza localização em tempo real.
- MegaTracker: Implementa o posicionamento espacial Mega.
Componentes de processamento assíncrono: Não requerem resultados de saída a cada quadro junto com a imagem da câmera.
- CloudRecognizer: Implementa o reconhecimento em nuvem.
- DenseSpatialMap: Implementa o mapa espacial denso, que pode ser usado para alcançar efeitos como colisão e oclusão.
Verificação de disponibilidade de componentes
Todos os componentes possuem uma função isAvailable, que pode ser usada para verificar se o componente está disponível.
Situações em que um componente não está disponível incluem:
- Não implementado no sistema operacional atual.
- Dependências necessárias ausentes, como ARKit, ARCore.
- Componente inexistente na variante atual da versão, por exemplo, em versões simplificadas.
- Componente indisponível sob a licença atual.
É essencial verificar a disponibilidade antes de usar um componente e implementar fallback ou exibir avisos conforme necessário.
Fluxo de dados
Os componentes são interligados conforme ilustrado abaixo.

Existe uma utilização especial de entrada como quadro de feedback, conforme mostrado abaixo.

Classes auxiliares de fluxo de dados
Portas de emissão e recepção do fluxo de dados; cada componente deve incluir essas portas.
SignalSink / SignalSource: Recebe/emite um sinal (sem dados).
InputFrameSink / InputFrameSource: Recebe/emite um InputFrame.
OutputFrameSink / OutputFrameSource: Recebe/emite um OutputFrame.
FeedbackFrameSink / FeedbackFrameSource: Recebe/emite um FeedbackFrame.
Divisão e união de fluxo de dados
InputFrameFork: Divide um InputFrame em múltiplos emitidos em paralelo.
OutputFrameFork: Divide um OutputFrame em múltiplos emitidos em paralelo.
OutputFrameJoin: Combina múltiplos OutputFrame em um, e mescla todos os resultados em
Results. Atenção: as ligações de suas múltiplas entradas não devem ser feitas enquanto os dados estão fluindo, caso contrário pode entrar num estado sem saída. (Recomenda-se concluir as ligações do fluxo de dados antes de iniciar a Câmara.)FeedbackFrameFork: Divide um FeedbackFrame em múltiplos emitidos em paralelo.
Limitação e armazenamento em buffer do fluxo de dados
InputFrameThrottler: Recebe e emite InputFrame, mas emite apenas um de cada vez. Emite o próximo InputFrame somente após receber um sinal de disparo. Se receber múltiplos InputFrame, os subsequentes podem substituir os anteriores.
OutputFrameBuffer: Recebe OutputFrame e armazena-os em buffer, aguardando sondagem pelo utilizador. Pode emitir um sinal ao receber um OutputFrame.
Conectando o sinal emitido pelo OutputFrameBuffer ao InputFrameThrottler, completa-se todo o processo de limitação.
Transformação do fluxo de dados
InputFrameToOutputFrameAdapter: Pode empacotar diretamente um InputFrame num OutputFrame, para renderização e exibição.
InputFrameToFeedbackFrameAdapter: Pode empacotar um InputFrame e um FeedbackFrame num FeedbackFrame, para um componente de processamento síncrono de feedback.
Limitação de quantidade de InputFrame
CameraDevice pode configurar bufferCapacity, definindo o número máximo de InputFrame emitidos. O valor padrão atual é 8.
Câmeras personalizadas podem usar BufferPool para implementação.
A quantidade necessária de InputFrame para cada componente está documentada na API de cada componente.
Quantidade insuficiente de InputFrame pode causar bloqueio do fluxo de dados, resultando em travamento da renderização.
Quantidade insuficiente pode também manifestar-se como renderização inicial fluida, mas travamento após alternar para segundo plano ou pausar/reiniciar componentes. Testes devem cobrir esses cenários.
Conectar e desconectar
Não é recomendado conectar ou desconectar durante a operação do fluxo de dados.
Se necessário durante a operação, a conexão/desconexão deve ocorrer apenas em bordas de corte (onde a remoção separaria o fluxo), nunca em arestas de loop (considerando o fluxo como grafo não direcionado), na entrada de OutputFrameJoin ou no sideInput de InputFrameThrottler. Caso contrário, pode ocorrer bloqueio em nós como OutputFrameJoin e InputFrameThrottler.
Componentes algorítmicos possuem funções start/stop. Quando parado (stop), os quadros não são processados, mas ainda são emitidos sem resultados.
Utilizações típicas
Abaixo, utilização de um único ImageTracker, adequada para reconhecimento e rastreamento de imagens de plano não repetitivo.
![]()
Abaixo, utilização de um único ImageTracker, adequada para reconhecimento e rastreamento de imagens de plano repetitivo.
![]()
Abaixo, utilização de SparseSpatialMap, adequada para construção de mapa espacial esparso, localização e rastreamento.

Abaixo, utilização simultânea de SparseSpatialMap e DenseSpatialMap, adequada para construção de mapa esparso, localização, rastreamento e geração de mapa espacial denso.
