web-dev-qa-db-fra.com

Convertir une séquence d'images ppm en vidéo avi

Je souhaite convertir une séquence d'images ppm en vidéo AVI (ou tout autre format vidéo accepté par OpenCV).

J'ai tout d'abord converti les images en ppm sans perte de qualité en jpg:

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

Ensuite, j'ai utilisé la commande suivante pour convertir en avi:

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

Mais j'ai eu l'erreur suivante:

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

Alors j'ai pensé à utiliser cette autre méthode mais j'ai toujours une erreur:

$ 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.

les noms de fichiers ppm ressemblent à ceux ci-dessous:

$ ls *ppm | head -5
CS585Bats-FalseColor_frame000000750.ppm
CS585Bats-FalseColor_frame000000751.ppm
CS585Bats-FalseColor_frame000000752.ppm
CS585Bats-FalseColor_frame000000753.ppm
CS585Bats-FalseColor_frame000000754.ppm
1
Mona Jalal

Vous ne savez pas quel script bash effectuera la tâche, mais ce script Python fonctionne comme un charme:

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()
0
Mona Jalal

Plusieurs options sont disponibles avec le démultiplicateur de fichier image .

Utiliser le motif de séquence

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

Vous pouvez modifier le numéro de départ avec l'option de saisie -start_number.

Utiliser le motif glob

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

Si ce sont les seuls fichiers PPM du répertoire, votre modèle global peut être plus simple:

ffmpeg -pattern_type glob -framerate 25 -i "*.ppm" output
2
llogan