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

NEWSLETTER

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

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

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

Giovanni Bauermeister
É formado em Técnico em Mecatrônica pelo SENAI Roberto Mange de Campinas, onde teve seus primeiros contatos com microcontroladores, eletrônica e programação. Em 2016 obteve a graduação em Engenharia de Controle e Automação pela UNISAL, também em Campinas. Durante a graduação, teve a oportunidade de ingressar como estagiário na empresa Toradex, onde atuou e desenvolveu habilidades em sistemas Linux embarcado. Participou do movimento maker, contribuindo com tutoriais e suporte ao cliente na Filipeflop. Atualmente atua na área de desenvolvimento de projetos.

8
Deixe um comentário

avatar
 
5 Comment threads
3 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Alex PortoGiovanni BauermeisterRodrigo CheMarcelo JoLearn Using Cameras with Embedded Linux on Toradex Computer Modules | Toradex – Computer on Modules Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
trackback

[…] 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/ […]

Alex Porto
Visitante

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

Rodrigo Che
Visitante
Rodrigo Che

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

Giovanni Bauermeister
Visitante
Giovanni Bauermeister

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
Visitante
Rodrigo Che

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

Giovanni Bauermeister
Visitante
Giovanni Bauermeister

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

Rodrigo Che
Visitante
Rodrigo Che

Bem proveitoso, obrigado.

Marcelo Jo
Visitante
Marcelo Jo

Excelente artigo! Parabéns.