converter uma seqüência de imagens ppm para avi video

1

Eu quero converter uma seqüência de imagens ppm para um vídeo avi (ou outro formato de vídeo possível aceito pelo OpenCV) Primeiro eu converti as imagens ppm sem queda na qualidade para jpg:

$ for f in *ppm ; do convert -quality 100 $f 'basename $f ppm'jpg; done 

então eu usei o seguinte comando para converter para avi:

$ ffmpeg -i CS585Bats-FalseColor_frame*.jpg  -vcodec mpeg4 test.avi

Mas recebi o seguinte erro:

FFmpeg version SVN-r26402, Copyright (c) 2000-2011 the FFmpeg developers
  built on Aug  2 2016 19:05:32 with clang 7.3.0 (clang-703.0.31)
  configuration: --enable-libmp3lame --enable-libfaac --enable-gpl --enable-nonfree --enable-shared --disable-mmx --arch=x86_64 --cpu=core2
  libavutil     50.36. 0 / 50.36. 0
  libavcore      0.16. 1 /  0.16. 1
  libavcodec    52.108. 0 / 52.108. 0
  libavformat   52.93. 0 / 52.93. 0
  libavdevice   52. 2. 3 / 52. 2. 3
  libavfilter    1.74. 0 /  1.74. 0
  libswscale     0.12. 0 /  0.12. 0
Input #0, image2, from 'CS585Bats-FalseColor_frame000000750.jpg':
  Duration: 00:00:00.04, start: 0.000000, bitrate: N/A
    Stream #0.0: Video: mjpeg, yuvj444p, 1024x1024 [PAR 1:1 DAR 1:1], 25 tbr, 25 tbn, 25 tbc
ffmpeg(11831,0x7fffa5dc6340) malloc: *** error for object 0x100000001: pointer being realloc'd was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6

Então, pensei em usar esse outro método, mas ainda recebo o erro:

$  convert -delay 6 -quality 100 CS585Bats-FalseColor_frame000000*ppm movie.mpg
convert: delegate failed ''ffmpeg' -nostdin -v -1 -i '%M%%d.jpg' '%u.%m' 2> '%u'' @ error/delegate.c/InvokeDelegate/1919.

nomes de arquivos ppm se parecem com abaixo:

$ ls *ppm | head -5
CS585Bats-FalseColor_frame000000750.ppm
CS585Bats-FalseColor_frame000000751.ppm
CS585Bats-FalseColor_frame000000752.ppm
CS585Bats-FalseColor_frame000000753.ppm
CS585Bats-FalseColor_frame000000754.ppm
    
por Mona Jalal 31.10.2017 / 03:37

2 respostas

1

Você tem várias opções disponíveis com o demuxer do arquivo de imagem .

Usando o padrão de sequência

ffmpeg -framerate 25 -i "CS585Bats-FalseColor_frame%09d.ppm" output

Você pode alterar o número inicial com a opção de entrada -start_number .

Usando o padrão glob

ffmpeg -pattern_type glob -framerate 25 -i "CS585Bats-FalseColor_frame*.ppm" output

Se esses forem os únicos arquivos PPM no diretório, seu padrão glob poderá ser mais simples:

ffmpeg -pattern_type glob -framerate 25 -i "*.ppm" output
    
por LordNeckbeard 31.10.2017 / 19:57
0

Não tenho certeza do script bash que fará a tarefa, mas esse script Python funciona como um encanto:

import cv2
import glob

img1 = cv2.imread('bat/FalseColor/CS585Bats-FalseColor_frame000000750.ppm')
height, width, layers = img1.shape

video = cv2.VideoWriter('video.avi', -1, 1, (width, height))

filenames = glob.glob('bat/FalseColor/*.ppm')
for filename in filenames:
    img = cv2.imread(filename)
    video.write(img)

cv2.destroyAllWindows()
video.release()
    
por Mona Jalal 31.10.2017 / 05:27