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
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()
Plusieurs options sont disponibles avec le démultiplicateur de fichier image .
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
.
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