Manual

do

Maker

.

com

Manipulação de imagem e video no Raspberry Pi

Manipulação de imagem e video no Raspberry Pi

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:

sudo su
mkdir /mnt/RAM
mount -t tmpfs -o size=80M tmpfs /mnt/RAM/
cd /mnt/RAM
wget -c http://ffmpeg.org/releases/ffmpeg-3.0.2.tar.bz2
tar xvjf ffmpeg-3.0.2.tar.bz2 && cd ffmpeg-3.0.2
./configure --help|egrep -v '='|egrep enable|awk '{print $1}' |while read line; do echo -n $line" " >params;done
./configure $(cat params)
make
make install

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:

apt-get install imagemagick imagemagick-common libimage-exiftool-perl

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.

00c.webp

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:

sudo ffmpeg -f x11grab -s 592x448 -i :0.0+0,0 t.mkv
-f x11grab

O formato a capturar.

-s 492x448

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:

ffmpeg -i video.mp4 image%d.png

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:

ffmpeg -i videoOriginal.avi -an novoVideo.avi

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

ls *.avi|while read line; do ffmpeg -i "$line" -an "new-$line";done

Se precisar remover os originais depois:

ls *.avi|while read line; do ffmpeg -i "$line" -an "new-$line";rm -f "$line";done

Conversão de formato de video

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

ffmpeg -i video.flv -sameq video.mpeg

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:

ffmpeg -i imagem.png -s $[x*scale]x$[y*scale] -sws_flags lanczos newImage.jpg

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 640x480 e a quero 18 vezes maior; invés de fazer contas, utilizo o recurso de cálculo do próprio bash:

ffmpeg -i imagem.png -s $[640*18]x$[480*18] -sws_flags lanczos newImage.jpg

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:

fast_bilinear
bilinear
bicubic
experimental
neighbor
area
bicublin
gauss
sinc
spline

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.

A imagem original:

01c.webp

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):

02c.webp

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

0c3.webp

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:

ffmpeg -i video.avi audio.wav

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:

ffmpeg -i input.mp4 -ss 00:00:10.0 -codec copy -t 15 output.mp4

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:

ffmpeg -ss 00:00:05 -i video.mp4 -vf scale=800:-1 -vframes 1 quadro_selecionado.jpg

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:

ffmpeg -ss 00:00:05 -i video.mp4 -vf scale=800:-1 -vframes 10 quadro_selecionado%d.jpg

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:

ffmpeg -i video-pequeno.mp4 -vf scale=500:-1 -t 5 -r 8 meme.gif

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:

ffmpeg -i recorte_do_video_do_meme.mp4 -s 180x321 -c:a copy video-mini-do-meme.mp4

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:

04c.webp

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:

ExifTool Version Number         : 9.46                                                                                                                                                                                                                                         
File Name                       : lasertap.jpg                                                                                                                                                                                                                                 
Directory                       : .                                                                                                                                                                                                                                            
File Size                       : 80 kB                                                                                                                                                                                                                                        
File Modification Date/Time     : 2015:09:14 11:42:40-03:00                                                                                                                                                                                                                    
File Access Date/Time           : 2015:09:20 17:36:44-03:00                                                                                                                                                                                                                    
File Inode Change Date/Time     : 2015:09:15 11:13:35-03:00                                                                                                                                                                                                                    
File Permissions                : rw-------                                                                                                                                                                                                                                    
File Type                       : JPEG                                                                                                                                                                                                                                         
MIME Type                       : image/jpeg                                                                                                                                                                                                                                   
JFIF Version                    : 1.01                                                                                                                                                                                                                                         
Resolution Unit                 : None                                                                                                                                                                                                                                         
X Resolution                    : 1                                                                                                                                                                                                                                            
Y Resolution                    : 1                                                                                                                                                                                                                                            
Image Width                     : 1296                                                                                                                                                                                                                                         
Image Height                    : 728                                                                                                                                                                                                                                          
Encoding Process                : Baseline DCT, Huffman coding                                                                                                                                                                                                                 
Bits Per Sample                 : 8                                                                                                                                                                                                                                            
Color Components                : 3                                                                                                                                                                                                                                            
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)                                                                                                                                                                                                                             
Image Size                      : 1296x728                                                                                                                                                                                                                                     
djames@KGB:~/downloads > exiftool KevinDavid-transito-07112014573.jpg                                                                                                                                                                                                          
ExifTool Version Number         : 9.46                                                                                                                                                                                                                                         
File Name                       : KevinDavid-transito-07112014573.jpg                                                                                                                                                                                                          
Directory                       : .                                                                                                                                                                                                                                            
File Size                       : 381 kB                                                                                                                                                                                                                                       
File Modification Date/Time     : 2016:05:14 02:10:48-03:00                                                                                                                                                                                                                    
File Access Date/Time           : 2016:05:14 02:11:06-03:00                                                                                                                                                                                                                    
File Inode Change Date/Time     : 2016:05:14 02:10:48-03:00                                                                                                                                                                                                                    
File Permissions                : rw-------                                                                                                                                                                                                                                    
File Type                       : JPEG
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Resolution Unit                 : inches
X Resolution                    : 240
Displayed Units X               : inches
Y Resolution                    : 240
Displayed Units Y               : inches
Current IPTC Digest             : ef95240009c1a6d1ca6ca66ae7fa71a3
Coded Character Set             : UTF8
Application Record Version      : 4
Object Name                     : TRÂNSITO SÃO PAULO
Time Created                    : 17:26:01
Digital Creation Date           : 2014:11:07
Digital Creation Time           : 17:26:01
City                            : SÃO PAULO
Sub-location                    : MARGINAL PINHEIROS
Province-State                  : SÃO PAULO
Country-Primary Location Code   : BRA
Country-Primary Location Name   : BRASIL
Copyright Notice                : KEVIN DAVID/BRAZIL PHOTO PRESS
Caption-Abstract                : 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)
Copyright Flag                  : True
Photoshop Thumbnail             : (Binary data 20515 bytes, use -b option to extract)
IPTC Digest                     : ef95240009c1a6d1ca6ca66ae7fa71a3
Profile CMM Type                : Lino
Profile Version                 : 2.1.0
Profile Class                   : Display Device Profile
Color Space Data                : RGB
Profile Connection Space        : XYZ
Profile Date Time               : 1998:02:09 06:49:00
Profile File Signature          : acsp
Primary Platform                : Microsoft Corporation
CMM Flags                       : Not Embedded, Independent
Device Manufacturer             : IEC
Device Model                    : sRGB
Device Attributes               : Reflective, Glossy, Positive, Color
Rendering Intent                : Perceptual
Connection Space Illuminant     : 0.9642 1 0.82491
Profile Creator                 : HP
Profile ID                      : 0
Profile Copyright               : Copyright (c) 1998 Hewlett-Packard Company
Profile Description             : sRGB IEC61966-2.1
Media White Point               : 0.95045 1 1.08905
Media Black Point               : 0 0 0
Red Matrix Column               : 0.43607 0.22249 0.01392
Green Matrix Column             : 0.38515 0.71687 0.09708
Blue Matrix Column              : 0.14307 0.06061 0.7141
Device Mfg Desc                 : IEC http://www.iec.ch
Device Model Desc               : IEC 61966-2.1 Default RGB colour space - sRGB
Viewing Cond Desc               : Reference Viewing Condition in IEC61966-2.1
Viewing Cond Illuminant         : 19.6445 20.3718 16.8089
Viewing Cond Surround           : 3.92889 4.07439 3.36179
Viewing Cond Illuminant Type    : D50
Luminance                       : 76.03647 80 87.12462
Measurement Observer            : CIE 1931
Measurement Backing             : 0 0 0
Measurement Geometry            : Unknown (0)
Measurement Flare               : 0.999%
Measurement Illuminant          : D65
Technology                      : Cathode Ray Tube Display
Red Tone Reproduction Curve     : (Binary data 2060 bytes, use -b option to extract)
Green Tone Reproduction Curve   : (Binary data 2060 bytes, use -b option to extract)
Blue Tone Reproduction Curve    : (Binary data 2060 bytes, use -b option to extract)
XMP Toolkit                     : 3.1.1-111
Headline                        : TRÂNSITO SÃO PAULO
Date Created                    : 2011:08:05 10:48:16-05:00
Format                          : image/jpeg
Rights                          : KEVIN DAVID/BRAZIL PHOTO PRESS
Creator Work Telephone          : 
Creator Work Email              : 
Creator Work URL                : 
Image Width                     : 900
Image Height                    : 598
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:4:4 (1 1)
Date/Time Created               : 2014:11:07 17:26:01
Date/Time Original              : 2014:11:07 17:26:01
Digital Creation Date/Time      : 2014:11:07 17:26:01
Image Size                      : 900x598

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:

sudo apt-get install libimage-exiftool-perl
exiftool nome_da_imagem.jpg

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:

apt-get install imagemagick
mogrify -strip imagem_original.jpg

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

striped.webp

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:

touch imagem_original.jpg

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

Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.

Próximo post a caminho!

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.