Como criar vídeos “time lapse”

O "time-lapse" é um processo cinematográfico em que a frequência de cada foto ou quadro (frame) por segundo de filme é muito menor do que aquela em que o filme será reproduzido. Ou seja, quando visto a uma velocidade normal, o tempo parece correr mais depressa e parece saltar (lapsing), sendo uma ferramenta muito útil para mostrar eventos que demoram muito tempo para acontecer em um curto período. Veja a seguir como construir dois sistemas (webcam e câmera IP) em Linux para captura de uma imagem por minuto do céu e fazer o vídeo, tudo via linha de comando. Para testar sua webcam, uma dica é usar o programa Cheese, que geralmente já vem instalado.

Netbook e câmeras utilizadas (ficou faltando o tripé e os roteadores).

Netbook e câmeras utilizadas (ficou faltando o tripé e os roteadores).

Usando webcam

Foi utilizada uma webcam externa, mas funciona com câmera integrada ao computador também. Segue o script (fotografo.sh) criado em linux para obter as fotos. Nos comentários, tem a linha que pode ser incluída no crontab do usuário para tirar fotos a cada 1 minuto. O comando streamer executa a ação; veja se o dispositivo está em video0 ou video1 ("ls /dev" ou, para câmera externa, pode-se descobrir ao rodar o comando dmesg, conectar a câmera e verificar novamente a saída do comando dmesg). Veja mais sobre o streamer no site Daemonio Labs.

#!/bin/bash
# Acrescentar no crontab
# Tirar foto a cada 1 minuto
#*/1 * * * * /home/monolitonimbus/camera/fotografo.sh

caminho=/home/monolitonimbus/camera/
pasta=20`date +%y-%m-%d`
horario=`date +%H-%M-%S`
cd $caminho
mkdir -p $pasta

streamer -c /dev/video0 -b 16 -o $caminho/$pasta/cupula_$horario.jpeg

exit

Veja mais opções do comando date clicando no link.

Usando câmera IP

Foi utilizada uma câmera IP da ACTi ACM4000. Deve-se conectar a câmera no mesmo roteador que o computador (wireless ou cabo). No computador, acessar o site do roteador (192.168.0.1, no caso do roteador D-Link e nessa rede), entrar com login e senha, ir no menu STATUS e buscar os computadores conectados. Lá vai aparecer a câmera e o IP dela (geralmente o IP que aparecerá é 192.168.0.100, que é o default). O que também pode ser feito (no caso do roteador Tp-Link) é usar o comando nmap para encontrar IP da câmera (fazer nmap antes e ver o que aparece de diferente quando conecta, geralmente o IP que aparecerá é 192.168.0.100, que é o default). Digite o IP obtido para acessar a câmera; entrar com login e senha (o padrão dessa câmera é admin, senha 123456).

estrutura

Segue rotina em shell script (camera.sh) para usar o comando do VLC para obter as imagens. A opção "scene-ratio" dá a frequência de imagens a serem obtidas (nos comentários, está uma opção para tirar imagens a uma razão menor durante a noite).

#!/bin/bash
caminho=/home/monolitonimbus/camera/imagens
user='digite_o_usuario_da_camera'
senha='digite_a_senha_da_camera'
ip='digite_o_ip_da_camera'

#if [ "$(date +%H)" -gt 19 ] || [ "$(date +%H)" -lt 6 ]; then
fratio=1480 # 1 imagem por minuto
#else
#fratio=150 # 1 imagem a cada 5 segundos
#fi

cvlc http://$user:$senha@$ip/cgi-bin/cmd/system?GET_STREAM --video-filter=scene --no-audio --vout=dummy --scene-format=jpg --scene-ratio=$fratio --scene-prefix="$(date +%F-%H:%M:%S:%N-)" --scene-path=$caminho --quiet

# Estampar legenda => rodar arquivo nomes_frames.sh
#file=`ls -t $caminho | head -1` # ultima imagem

exit

Para acesso da câmera através da internet, veja mais no blog Metaverse.

Estampando rótulo nas imagens e fazendo vídeo

Segue a rotina em shell script (criavideo.sh) para listar em ordem cronológica ("ls -tr"), etiquetar horário na imagem (comando convert), renomear arquivos e criar vídeo (comando avconv, sucessor do ffmpeg). Está comentada a opção para criar diretórios e sub-diretórios conforme a data e hora, respectivamente.

#!/bin/bash
caminho=/home/monolitonimbus/camera/
cd $caminho
vetor_files=`ls -tr *.jpeg`
n=1
for file in $vetor_files;
do
    # Colocar rótulo no frame
    filename=${file%.*}
    extension=${file##*.}
    output=${filename}.${extension}
    dim=$(identify -format "%w %h" "$file")
    width=${dim%% *}
    height=${dim#* }
    data=$(stat -c %y $file)
    filename="img_"${data:0:10}"_"${data:11:8}".jpeg"
    #caminho=/home/monolitonimbus/camera/${data:0:10}/${data:11:2}/
    mkdir -p $caminho
    if [ $width -ge $height ]
    then
        pointsize=$((`expr $width / 30`))
    else
        pointsize=$((`expr $height / 30`))
    fi
    convert "$file" -gravity SouthEast -font "$font" -pointsize "$pointsize" -fill yellow -annotate 1 "$data" "$caminho$filename"

    # Renomear para criar vídeo
    mv $filename imagem$n.jpeg
    n=`expr $n + 1`
done

#Cria video para o cj de imagens renomeadas
avconv -f image2 -r 5 -i imagem%d.jpeg ../teste.avi

Os parâmetros para a criação do vídeo são:

  • -f image2 : multiplexador/demultiplexador de imagem a ser utilizado (image2)
  • -r 5 : framerate, ou seja, quantidade de frames por segundo. Com o valor 1 será exibido uma imagem por segundo (frame), ou seja, o vídeo composto de 10 imagens terá 10 segundos
  • -i imagem%d.jpg : imagens que comporão o vídeo, %d indica um valor decimal inteiro (como na linguagem C), sempre contando do menor valor encontrado para o maior, ou seja, serão lidas as imagens imagem1.jpg, depois imagem2.jpg e assim sucessivamente
  • teste.avi : nome e formato do vídeo de saída

Caso não queira colocar rótulo no frame ou não criar vídeo, basta comentar as respectivas partes no código. Agradecimento ao Gustavo pelos comandos para rotular as imagens e aquisição da imagem via câmera IP. Veja o resultado abaixo, num vídeo com imagens a cada 1 minuto do céu tempestuoso de São Paulo no fim da tarde de natal (25/12/2013) e do amanhecer, gravados na cúpula do telescópio do IAG/USP.

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.