Utilizando Câmeras em Sistemas Linux Embarcado

câmeras

Apresentação

Este artigo explora diversas maneiras de obter, exibir e gravar vídeos utilizando um CoM ou SoM (Computer on Module ou System on Module) otimizado para aplicações sensíveis a custo e que não possui enconder/decoder de vídeo por hardware.

Aplicação de Câmeras em Sistemas Linux Embarcado

Dizem que uma imagem vale mais que mil palavras, talvez por isso a utilização de câmeras em sistemas embarcados tem crescido muito nos últimos anos. Elas são utilizadas nas mais diversas situações, entre elas: 

  • Monitoramento por um operador remoto: exemplos desta aplicação são os circuitos de TV fechados onde um operador monitora o ambiente (provavelmente a portaria de seu prédio tem um) ou mesmo monitoramento de cidade pela polícia;
  • Gravação de vídeo de segurança: sistemas de monitoramento podem ou não gravar vídeo, muitos sistemas não possuem um operador monitorando o sistema o tempo todo, eles apenas realizam a gravação para obter provas em caso de algum evento;
  • Monitoramento automático com análises através de ferramentas de visão computacional: nestes sistemas, um software realiza o processamento da imagem para extrair informações mais complexas. Entre eles estão os radares e alguns sistemas de monitoramento de tráfego em cidades;
  • Utilização como um sensor: diversos sistemas de diagnóstico clínico são baseados em análise de imagem da amostra, outro exemplo são vitrines inteligentes em lojas que identificam algumas características do usuário para oferecer o marketing específico.

Hardware utilizado

Usaremos os módulos Colibri VF61 da empresa Toradex que possuem processadores Vybrid da Freescale, que são processadores dual core heterogêneo (ARM Cortex-A5 + ARM Cortex-M4). Além do processador o módulo conta com 256 MB RAM e 512 MB Flash. Neste artigo estaremos utilizando apenas o Cortex-A5. É possível fazer várias atividades com vídeo e câmeras nesses processadores mesmo eles não possuindo hardware específico para isso. Outras informações e instruções sobre o módulo Colibri VF61 podem ser encontradas no site da Toradex na seção de desenvolvedores.  

As câmeras utilizadas foram uma Logitech HD 720p, um módulo de câmera USB mjpeg genérica e uma câmera IP da D-Link modelo DCS-930L.

A imagem linux do módulo utilizado para este artigo possui um ambiente de área de trabalho chamado LXDE. Utilizaremos também um framework chamado GStreamer, que é amplamente usado no desenvolvimento de aplicações de multimídia. O GStreamer provê o serviço de multimídia de aplicativos, como editores de vídeo, streaming de mídia e media players. É utilizada uma série de plugins que faz com que o GStreamer  funcione com as mais diversas bibliotecas de mídia, como MP3, ffmpeg e outras. Entre esses plugins encontram-se elementos de entrada e saída, filtros, codecs e outros mais. 

Instalando os pacotes necessários

Nos módulos Colibri VF61 é necessário a instalação do GStreamer, Video4Linux2 e também alguns pacotes adicionais. Para isso, execute os seguintes comandos no terminal do módulo:

Agora com o comando gst-inspect você pode vizualizar os plugins e elementos instalados anteriormente. Abaixo alguns exemplos de plugins e elementos instalados. 

Câmeras: Alguns dos plugins e elementos instalados
Figura 1 - Alguns dos plugins e elementos instalados

Um pouco sobre Pipelines e seus elementos

Com base no Manual de Desenvolvimento de Aplicação do GStreamer no capítulo 3, um elemento é a mais importante classe de objetos do GStreamer. Usualmente cria-se uma corrente de elementos conectados e os dados percorrem por essa estrutura. Um elemento tem função específica que pode ser leitura de dados de um arquivo, decodificação de dados ou sua exibição na tela. Elementos colocados juntos como uma corrente denomina-se uma pipeline, que pode ser utilizada para uma tarefa específica, por exemplo reprodução ou captura de vídeo. Por padrão o GStreamer contém uma vasta coleção de elementos, tornando possível o desenvolvimento de uma grande variedade de aplicações de mídia. Ao longo desse artigo iremos usar algumas pipelines e esclarecer um pouco sobre alguns elementos.

Abaixo temos uma ilustração de uma pipeline de um player ogg básico, contendo um demuxer e dois ramos, um para áudio e outro para vídeo. 

Câmeras: Exemplo de pipeline de um player ogg básico
Figura 2 - Exemplo de pipeline de um player ogg básico

Exibindo vídeo padrão de teste

Para exibir um vídeo padrão de teste utilizamos a pipeline a seguir:

Video de padrão de teste
Figura 3 - Video de padrão de teste

O autovideosink é um elemento que detecta automaticamente uma saída de vídeo. O elemento videotestsrc é usado para gerar um vídeo de teste em uma variedade de formatos e pode ser controlado com a propriedade “pattern”.

Vídeo de padrão de teste com pattern snow
Figura 4 - Vídeo de padrão de teste com pattern snow

Exibindo vídeo de uma WebCam

Ao inserir uma WebCam no módulo ela deve ser encontrada em /dev/videox podendo x ser 0, 1, 2 e assim por diante, dependendo do número de câmeras conectadas ao módulo.

Dispositivos de captura de video conectados
Figura 5 - Dispositivos de captura de video conectados

Para visualização do vídeo da WebCam em tela cheia utilize a pipeline a seguir:

WebCam em modo tela cheia
Figura 6 - WebCam em modo tela cheia

A seguir se encontra um vídeo mostrando a fluidez de exibição da webcam em modo tela cheia:

Video 4 Linux é uma API e driver framework de captura e reprodução de vídeo que suporta vários tipos de câmeras USB e outros dispositivos. v4l2src é um elemento do plugin video4linux2 que lê frames de um dispositivo video4linux2, que no nosso caso é uma webcam.

O elemento ffmpegcolorspace é um filtro utilizado para converter frames de vídeo entre uma grande variedade de formatos de cor.

O ximagesink é um elemento videosink padrão baseado no desktop X.

Podemos ver com o comando top a memória e processamento da CPU utilizados pelo gstreamer ao exibir uma câmera.

É possível também exibir o vídeo com algumas propriedades como tamanho e outras. Os parâmetros width, height, framerate podem ser ajustados de acordo com as configurações suportadas pela câmera. Execute as pipelines a seguir para câmeras 1, 2 ou 3 respectivamente (no caso, 3 câmeras estão conectadas no módulo), para visualizar o vídeo de cada webcam num formato 320x240 ou especifique o formato desejado.

Exibição de uma webcam
Figura 7 - Exibição de uma webcam

Exibindo duas janelas simultâneas

Também é possível exibir duas câmeras simultaneamente. A pipeline seguinte foi testada usando uma câmera Logitech HD 720p e um módulo de câmera mjpeg genérica.

 

Exibição simultânea de duas webcams
Figura 8 - Exibição simultânea de duas webcams

A seguir se encontra um vídeo mostrando a fluidez de exibição de duas webcams simultaneamente:

Gravando vídeo

Para gravar um vídeo em formato mp4 utilizamos a seguinte pipeline:

O comando --eos-on-shutdown é usado para finalizar o arquivo corretamente. O elemento ffenc_mjpeg é um codificador para o formato mjpeg. ffmux_mp4 é um muxer para o formato mp4. 

O elemento filesink indica que os dados provenientes do source v4l2 devem ser armazenados em um arquivo e não são exibidos no elemento ximagesink. Pode também ser especificado o path de destino do arquivo.

Para analisar a qualidade do vídeo gravado pelo módulo, você pode vizualisar o mesmo no video a seguir:

Playback de vídeo  

Para visualizar o vídeo anteriormente gravado, utilizamos a seguinte pipeline: 

Neste caso o vídeo source é proveniente de um filesrc, ou seja, o vídeo é buscado de um arquivo e não de um dispositivo de vídeo como uma WebCam. Esse vídeo foi anteriormente codificado utilizando mjpeg por isso utilizamos o decoder ffdec_mjpeg para decodificar o vídeo. 

Playback de vídeo via HTTP

Para visualizar um vídeo de uma dada URL utilizamos a seguinte pipeline: 

Souphttpsrc é um elemento que recebe dados como cliente, pela rede, via HTTP. Neste caso a propriedade location recebe uma URL que contém um arquivo de vídeo ao invés de um arquivo em seu computador. 

Note que o decoder ffdec_vp8 foi utilizado para decodificar o formato webm.

Streaming de vídeo da Webcam via TCP

É também possível fazer streaming de vídeo dos módulos VF61 para um computador rodando linux.

IP VF61    = 192.168.0.8

IP Ubuntu = 192.168.0.7

Execute a seguinte pipeline no terminal do módulo VF61: 

Execute a seguinte pipeline no terminal do host: 

Note que deverão ser alterados os respectivos endereços IP. Para verificar o endereço IP, execute o comando ifconfig no terminal.

No link a seguir se encontra um vídeo demonstrando o exemplo acima:

Usando uma câmera Logitech HD 720p obtivemos o seguinte desempenho:

Câmera IP D-Link e módulo VF61

Exibindo vídeo da Câmera IP

Neste exemplo foi utilizado uma câmera IP da D-Link modelo DCS-930L. A câmera foi configurada para fazer streaming de vídeo codificado num formato JPEG com uma resolução de 320x240 em 15 frames por segundo e uma qualidade média de JPEG. O rendimento da placa difere de acordo com as configurações de streaming da câmera IP.

Câmera IP D-Link DCS-930L
Figura 9 - Câmera IP D-Link DCS-930L
Tela de configurações da câmera IP D-Link
Figura 10 - Tela de configurações da câmera IP D-Link

Para exibir o vídeo da camera IP use a seguinte pipeline no terminal do módulo: 

Câmera IP sendo exibida no desktop do módulo
Figura 11 - Camera IP sendo exibida no desktop do módulo

A seguir se encontra um vídeo demonstrando o desempenho do exemplo acima:

Gravando câmera IP

É possível também gravar o vídeo da câmera IP com o módulo VF61, utilizando a seguinte pipeline: 

Para analisar a qualidade do vídeo você poderá acessá-lo a seguir:

Com a resolução da câmera em 320x240, 15 frames por segundo e média qualidade JPEG, obtivemos o seguinte desempenho:

Streaming TCP de IP para IP

Neste exemplo será feito streaming de vídeo da câmera IP para o módulo VF61 onde esse irá fazer novamente streaming para outro endereço IP.

A pipeline seguinte foi executada no terminal do módulo VF61:

Para visualizar o streaming de dados proveniente do módulo em um computador rodando Linux utilizamos a pipeline a seguir: 

Abaixo uma tabela comparativa de CPU e memória RAM do módulo em cada teste realizado. 

Teste Realizado

%CPU

%MEM

Exibindo vídeo de uma Webcam

28.2

2.7

Exibindo vídeo de duas Webcams

64.8

3.1

Gravando vídeo

97.4

4.9

Playback de vídeo

38.0

3.9

Playback de vídeo via HTTP

41.9

4.1

Streaming de vídeo via TCP

66.0

3.6

Exibindo vídeo câmera IP

25.2

3.3

Gravando vídeo câmera IP

40.1

3.9

Streaming câmera IP para outro IP

97.2

4.8

Conclusão

A duração das atividades realizadas neste artigo, desde a pesquisa teórica e estudo de vários elementos do Gstreamer, pode levar alguns dias. Uma das dificuldades encontradas, é que não há documentação do Gstreamer específica para cada caso. Entretanto, há uma vasta gama de exemplos pela internet, os quais provavelmente necessitam de adaptações. Por isso, pode ser necessário que o leitor realize várias pesquisas, assim como foi feito para realização deste artigo. Foi necessário uma estratégia de tentativa e erro para a construção das pipelines e encontrar elementos do Gstreamer compatíveis com as configurações desse artigo.

Os processadores da Freescale Vybrid VF61 podem, muitas vezes, atender a várias necessidades com respeito à mídia e processamento de vídeo, mesmo não possuindo hardware específico para tais tarefas. Ficamos realmente surpresos com o desempenho desse processador ao realizar atividades com vídeo e imagem. Quando projetos embarcados são sensíveis a custo, e não vão realizar tarefas que demandem um grande processamento de vídeo,  os processadores Vybrid VF61 são uma ótima opção. Já quando há necessidade de um alto processamento de vídeo com uma melhor performance, indicamos processadores como o iMX6, também da Freescale, que tem hardware específico de vídeo.

Referências e Links adicionais:

https://www.toradex.com/pt_br/computer-on-modules/colibri-arm-family/freescale-vybrid-vf6xx

- http://lxde.org/pt-br

http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/index.html

http://developer.toradex.com/knowledge-base/webcam-(linux)

http://developer.toradex.com/knowledge-base/video-playback- (linux)#Video_Playback_on_Vybrid_Modules

http://en.wikipedia.org/wiki/GStreamer

http://www.freedesktop.org/software/gstreamer-sdk/data/docs/latest/gst-plugins-base-plugins-0.10/index.html

http://pt.wikipedia.org/wiki/Codec

http://pt.wikipedia.org/wiki/Codec_de_v%C3%ADdeo

http://gstreamer.freedesktop.org/data/doc/gstreamer/0.10.36/manual/manual.pdf

- Fonte da Figura 2: http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/images/simple-player.png

- Fonte da Figura 9: http://www.premiumstore.com.br/images/product/DCDLDCS930L_1.jpg

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Linux Embarcado » Utilizando Câmeras em Sistemas Linux Embarcado
Comentários:
Notificações
Notificar
guest
8 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Alex Porto
15/07/2015 11:35

Ótimo artigo! Obrigado por compartilhar essas informações.

Rodrigo Che
Rodrigo Che
15/07/2015 09:23

Bem legal, os VF61 vão cair como uma luva em minha aplicação.
Obrigado.

Giovanni Bauermeister
Giovanni Bauermeister
Reply to  Rodrigo Che
15/07/2015 09:36

Olá Rodrigo, temos o VF61 em estoque.Se quiser pode ligar para o nosso escritório.
Fico feliz pelo artigo ter te ajudado!

Rodrigo Che
Rodrigo Che
Reply to  Giovanni Bauermeister
15/07/2015 09:42

Opa, já tenho três módulos VF61 e Violas, agora vou iniciar testes e desenvolvimento.

Giovanni Bauermeister
Giovanni Bauermeister
Reply to  Rodrigo Che
15/07/2015 18:04

muito bom. qualquer dúvida estamos aqui pra dar suporte

Rodrigo Che
Rodrigo Che
15/07/2015 09:21

Bem proveitoso, obrigado.

Marcelo Jo
Marcelo Jo
15/07/2015 08:51

Excelente artigo! Parabéns.

trackback
17/07/2015 05:49

[…] Learn how to interface your cameras using Embedded Linux on Toradex system on modules Hummingbird Colibri VF61 of toradex, Vybrid Freescale processor (ARM Cortex-A5 + ARM Cortex-M4) in this latest article from Giovanni Bauermeister (Engineer, Toradex) on Embarcados. This article explores various ways to obtain, view, and record videos using a computer on module optimized for cost-sensitive applications and has no encoder / decoder video hardware. Read it here: https://www.embarcados.com.br/utilizando-cameras-em-sistemas-linux-embarcado/ […]

Talvez você goste:

Séries

Menu

WEBINAR
 
Sensores e soluções para aplicações em indústria inteligente

Data: 13/08 às 15:00h - Apoio: STMicroelectronics
 
INSCREVA-SE AGORA »



 
close-link