Como extrair imagens de um arquivo rosbag e convertê-las em vídeo

ATUALIZAÇÃO (junho de 2014) : o pacote bag_tools ROS inclui um nó chamado make_video.py que converte imagens dentro de um arquivo bag em um vídeo, semelhante ao fluxo de trabalho manual descrito neste artigo.

Pré requisitos

Os métodos descritos abaixo foram testados usando ROS Fuerte em uma máquina Ubuntu 12.04 de 64 bits. No entanto, deve funcionar bem em ROS Electric e / ou outras distros Linux.

  • Um arquivo rosbag com um tópico de imagem dentro dele
  • Ferramentas MJPEG [Ubuntu: sudo apt-get install mjpegtools]
  • ffmpeg [Ubuntu: sudo apt-get install ffmpeg] ou
  • mencoder [Ubuntu: sudo apt-get install mencoder] preferido

Extraia as imagens

  1. Crie uma pasta para as imagens extraídas e cdnela.
  2. Executar

rosrun image_view extract_images _sec_per_frame:=0.01 image:=<IMAGETOPICINBAGFILE>

  1. Na outra janela do terminal, execute rosbag play <BAGFILE>
  2. Uma sequência de imagens será criada.

Você pode verificar se o número de quadros criados é igual ao número de mensagens no arquivo .bag usando o rosbag infocomando. Se o número for menor, diminua o _sec_per_framevalor.

Nota: As imagens foram nomeadas usando este padrão de estilo printf: frame%04d.jpg

Fazendo o arquivo de vídeo (Mencoder)

  1. Determine o fps do arquivo rosbag. Use rosbag infoe divida o número de mensagens para o tópico da imagem pela duração (em segundos). Este passo é muito importante.

  2. Use este mencodercomando na pasta em que você armazenou as imagens:

mencoder -nosound mf://*.jpg -mf w=<WIDTH>:h=<HEIGHT>:type=jpg:fps=<FPS> -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=<BITRATE> :mbd=2:keyint=132:v4mv:vqmin=3:lumi_mask=0.07:dark_mask=0.2:mpeg_quant:scplx_mask=0.1:tcplx_mask=0.1:naq -o <OUTPUT>.avi

Para a <FPS>utilização do número obtido no passo 1, para o <BITRATE>check a seção de Notas abaixo.

Fazendo o arquivo de vídeo (FFMPEG)

  1. Determine o FPS do arquivo rosbag. Use rosbag infoe divida o número de mensagens para o tópico da imagem pela duração (em segundos). Este passo é muito importante.

  2. Use este comando de ffmpegcomando na pasta em que você armazenou as imagens:

ffmpeg -r <FPS> -b <BITRATE> -i frame%04d.jpg <OUTPUT>.avi

Para a <FPS>utilização do número obtido no passo 1, para o <BITRATE>check a seção de Notas abaixo.

Notas

  • O BITRATE determina a qualidade. Para ffmpeg use KiloBytes / Sec, para mencoder use KiloBits / Sec (por exemplo, 2400 Kbps vs 300 KBps). Números maiores que 1800 KBits geralmente funcionam bem.

  • O arquivo de vídeo resultante será um arquivo AVI codificado em MPEG4.

Referências