Manipulação de imagem e video no Raspberry Pi

Lente
Lente

Manipular video no Raspberry poderia ser simples, mas eu tenho uma excelente tendência de absorver condições de anomalias. Isto é, se algo pode dar errado, dará e terei que corrigir ou reparar. Sempre dou graças a Deus por isso, de outro modo eu não aprenderia tanto. Explico no decorrer da leitura.

Manipulação de imagem e video no Raspberry

Meu propósito é que em dado momento, eu possa fazer alguns posts introdutórios à visão computacional com OpenCV (básico, porque não sou especialista nisso) e é muito bom que previamente já tenha discorrido a respeito de manipulação de imagens e videos com Raspberry Pi. Vou mostrar alguns técnicas forense “suaves” relacionadas à imagem e video para que você também possa processar alguma coisa no RPi. Mas já adianto, esse tipo de coisa demanda processamento e o desktop/notebook é a melhor opção se for trabalho grande.

Introdução ao ffmpeg

O ffmpeg é uma ferramenta fabulosa, trabalha com uma quantidade gigantesca de recursos de video e imagem e dá uma interface tão ampla que a maioria das pessoas que o usam o fazem em background ou utilizam apenas os recursos básicos. Se fosse pra mostrar tudo, sem exageros, daria um belo livro. Como não pretendo escrever um livro, vou citar alguns recursos mais interessantes, dos quais alguns utilizo em forense digital. Como citei na primeira linha, as coisas não costumam chegar prontas pra mim, agora toca compilar uma nova versão do ffmpeg para incluir o primeiro recurso que deveria ser a primeira dica desse tópico número 1.

Compilar sua própria versão do ffmpeg





Quando você mesmo compila, opcionalmente pode-se habilitar ou desabilitar recursos, conforme desejado. Tratando-se de um Raspberry Pi, o processo de compilação de uma versão “rechunchuda” deve levar um tempo consideravelmente maior,  talvez até exponencial em relação à compilação no desktop/notebook. De qualquer modo, se estiver utilizando Raspbian no seu Raspberry, inevitavelmente precisará seguir esse processo.

Primeiro, baixe a última versão disponível do ffmpeg em https://ffmpeg.org/download.html. Na data deste post, a última versão disponível era a 3.0.2. Após baixá-lo, o primeiro passo é obviamente a descompressão dos fontes. Eu montei um espacinho na RAM pra não depender de I/O no cartão, já basta o processamento da compilação. Meu caro, isso vai demorar muito, mas muito mesmo. Me faz lembrar da compilação de kernel no começo desse milênio, é um tempo realmente absurdo, portanto, siga esse processo e vá dormir. Prefira fazê-lo em um dia frio pra ajudar no resfriamento da RPi:

Não há dúvidas de que você terá de uma a várias dependências, eu não tive porque montei um ambiente maluco de desenvolvimento na RPi ao longo do tempo por isso não tive problemas. Ao término da instalação, você pode remover tudo de /mnt/RAM.

Abra um segundo terminal e já adiante uma parte do serviço, instalando umas ferramentas extras de manipulação de imagem:

Sobre o TMPFS

Nesse outro artigo escrevi sobre a utilização de sistema de arquivos em memória. O tamanho será muito maior do que 80MB, mas não se preocupe, o kernel gerencia sozinho e expande o espaço em memória conforme a demanda. O resultado final rendeu uma compilação de 541MB. Só pra citar, se isso fosse feito com o antigo RAMDISK, o tamanho exato haveria de ser alocado, senão a compilação não seria concluída.

Uso do TMPFS
Uso do TMPFS

Agora sim, podemos começar a ver os exemplos.

Captura de tela do Raspberry (screencast)





Gosto muito de fazer essa tarefa com ffmpeg. Quando preciso fazer videos do desktop, utilizo essa técnica. Também é possível utilizá-lo no Raspberry para essa tarefa, mas o ffmpeg instalado via apt-get não tinha o suporte ao x11grab, por isso iniciei o artigo compilando-o a partir dos fontes.

O comando é simples, vou explicar o que significa cada parte após exibí-lo:

-f x11grab

O formato a capturar.

-s 492×448

Tamanho da captura. Pode ser menor, mas nunca maior do que a tela. Se você não souber o tamanho da sua telinha, jogue qualquer valor alto e o ffmpeg reclamará exibindo o tamanho máximo.

-i :0.0+0,0

Origem da captura, no caso, o display em uso. Vou explicar ‘picotando’ o comando.

: – Antes do ‘:’ indica o host. No caso de localhost, apenas deixa-se vazio

0.0 – Display e tela. Você pode ter mais de um servidor gráfico rodando, então você escolhe o display. Você pode ter mais de um monitor sob o domínio desse servidor, então escolhe-se o ‘screen’, por isso ‘0.0’

+0,0 – Posição X,Y da tela. Pode acontecer de a captura pegar deslocado e indicando o alvo com esse parâmetro, você pode empurrar a captura para a posição correta. Claro que 0,0 é o default, só coloquei pra exemplificar, mas no meu notebook sou obrigado a deslocar pra 10,20.

t.mkv

Apenas indica-se o nome e o formato de saída. Depois para assistir, use o ffplay ou avplay passando o ‘t.mkv’ como parâmetro.

Converter video em imagens

Isso é bastante utilizado em perícia de video em conjunto com a técnica de super-resolução (aquela utilizada no CSI). Suponhamos que tenha um video (de baixa resolução) de um assaltante e você precisa ver detalhes do rosto, mas quando vc faz um print da tela e dá zoom, quadricula devido à baixa resolução. A primeira etapa é extrair os frame originais:

Com isso, serão criados frames com o nome ‘image’ seguido do número do frame, com a extensão (e formato) .png.

Remover o áudio de um video

Essa tarefa é simples de fazer em qualquer programa, mas se você tem uma sequência de videos e precisa remover o áudio de todos, aí não existe nada tão simples quanto esse procedimento:

Se você tem um diretório de videos .avi e quer remover o áudio de todos em um só comando, basta fazer isso:

Se precisar remover os originais depois:

Conversão de formato de video

Supondo que você tenha um (eca) .flv e quer converter pra mpeg na mesma qualidade:

Superres estilo CSI (mas sem a paia)

A super-resolução não faz mágica. Para esse objetivo, existem vários algorítmos, não vou entrar nos detalhes porque senão teria que discorrer sobre a fantástica fórmula matemática de cada um deles e não tenho condições de fazê-lo. Supondo que “aquele” video do bandido citado mais acima já tenha sido extraído, agora basta você selecionar o frame que acha adequado e aplicar o seguinte comando:

Desse comando, pouca coisa ainda não foi explicada. Em ‘-s’ você pode colocar o tamanho desejado diretamente, mas o que eu faço é multiplicar a resolução original pelo número de vezes que quero ampliar. Por exemplo, uma imagem de 640×480 e a quero 18 vezes maior; invés de fazer contas, utilizo o recurso de cálculo do próprio bash:

O parâmetro ‘-sws_flags’ é utilizado para indicar o algorítmo a aplicar na super-resolução. Eu gosto e prefiro o lanczos, mas você pode experimentar outros:

Como eu disse, não existe mágica.

Para dar um exemplo, procurei no google uma imagem de trânsito, então baixei a imagem e apliquei a superres. O link da imagem original é esse:

http://petmag.com.br/img/2010/06/08_passarinhos_gaiola.jpg

A imagem original:

08_passarinhos_gaiola
08_passarinhos_gaiola

Peguei um detalhe do bico no Gimp, para poder aplicar uma superres mais alta. Veja o comparativo do resultado à 7%  contra 1600% (máximo possível na original, mas você deve clicar para ver realmente a diferença com no tamanho original):

Comparativo (máximo)
Comparativo (máximo)

Agora o comparativo à 13% contra 100% da original:

Comparativo do detalhe
Comparativo do detalhe

Extrair áudio do video

Do mesmo modo, algumas vezes é necessário aplicar um conjunto de filtros no áudio de um video para capturar determinados detalhes isolando o som ambiente do som alvo, comparativo de frequências vocais, etc. Para extrair o áudio do video é bastante simples também:

Copiar um intervalo de tempo do video

Continuando nessa linha, na forense é necessário ser rápido, ainda mais quando isso envolve dinheiro, pois o serviço é cobrado por hora. Imagine que você quer tirar um quadro de um video de 10 minutos. Extrair todos os quadros pode ser um tanto demorado, além de que isso demanda espaço de armazenamento. Para evitar esse transtorno e agilizar a tarefa, você pode selecionar o ponto inicial e o tempo pretendido. Isso é bom tanto para reduzir o número de quadros como também isolar uma área de ação do video a ser observada:

Nesse caso, -ss é o tempo inicial em HH:MM:SS.ms e ‘-t 15’, a duração pretendida. Preservando a extensão e usando o parâmetro ‘-codec copy’, o video não é re-encodado, de modo que as características originais se preservam.

Extrair quadros específicos do video

Se for o caso de ter que selecionar um quadro em um intervalo de tempo, uma outra possibilidade é pegar diretamente estes quadros dentro do momento selecionado. Para isso:

Nesse caso, apenas 1 quadro do tempo selecionado foi extraido. Se quiser então uma amostra de quadros dentro do intervalo, basta adicionar o número desejado em ‘vframes’ e mudar o nome do arquivo assim:

Criar um gif a partir de um video

Saindo de forense, se você tem um video e gostaria de fazer um meme em gif com uma determinada parte, primeiro copie a parte que lhe interessa como exibido acima e então faça a conversão para gif reduzindo a taxa de quadros:

Aqui utiliza-se ‘scale’ para o tamanho do gif; ‘-t’ para duração e ‘-r’ para determinar o número de quadros por segundo.

Redimensionar um video

E já pensou de o gif que você quer fazer é a partir de um video em full hd? Seria péssimo, certo? Ficaria enorme! Mas há uma solução simples para isso; basta você redimensionar o video previamente:

Isso reduz um video no formato full hd para um sexto de seu tamanho. Depois, basta aplicar  a conversão para gif.

Enfim, tem mais um monte de possibilidades, mas não vou ficar detalhando porque isso daria um livro, sem exagero.

Obter infomações da imagem original

Não deveria expor isso aqui por causa das técnicas anti-forense, mas vou tentar reduzir as informações. Peguei essa imagem pelo google:

SÃO PAULO-SP-07,11,2014-TRÂNSITO SÃO PAULO- O Motorista enfrenta grande fluxo na Marginal Pinheiros sentido Interlagos.Região Oeste da cidade de São Paulo,na tarde dessa sexta-feira,07(Foto:Kevin David/Brazil Photo Press)
SÃO PAULO-SP-07,11,2014-TRÂNSITO SÃO PAULO- O Motorista enfrenta grande fluxo na Marginal Pinheiros sentido Interlagos.Região Oeste da cidade de São Paulo,na tarde dessa sexta-feira,07(Foto:Kevin David/Brazil Photo Press)





Essas informações que estão na imagem estão contidas nela própria. Normalmente, algumas informações são inseridas automaticamente pela câmera, seja uma câmera dedicada ou a de uma smartphone ou quando capturada por um sistema de câmeras de video, através do sistema operacional. Mas essas não são as únicas informações contidas na imagem. Dela, se pode extrair mais um bocado:

Esse é um modo do autor preservar os direitos autorais sobre a imagem, podendo ser uma foto artística por exemplo.

Para obter essas informações, será necessário instalar a ferramenta ‘exiftool’ e então executá-la sobre a imagem:

Eliminando vestígios

Só vejo uma razão para fazê-lo, e não é boa. De qualquer modo, uma faca é um utensílio de cozinha na mão de uns e uma arma mortal na mão de outros.

Caso queira deixar a imagem sem rastros de sua origem, será necessário instalar uma suite de manipulação e dessa, executar um de seus binários sobre a imagem:

Sua imagem não conterá mais nada além disso:

Imagem limpa
Imagem limpa

O pacote ImageMagick tem ferramentas excelentes para manipulação e talvez eu ainda dedique um post a isso. Para este artigo, apenas esse conjunto de informações já é o suficiente para iniciar um bot de rede que manipule sua galeria de imagens e videos. Para finalizar, você pode mudar o timestamp da imagem para o passado, futuro ou simplesmente a data presente:

E logo mais começo escrever algumas introduções sobre OpenCV, espero que tenha curtido esse artigo!

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

Agregador de Links - Loucuras da Net

Comments

comments

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.