comment faire une vidéo à partir d'images extraites?
J'ai extrait les images vidéo dans un dossier appelé "images". Après avoir enregistré les images dans mon dossier, j'utilise le code suivant pour créer à nouveau la vidéo. Je reçois la vidéo mais les images sont classées au hasard, comment puis-je les organiser dans un ordre séquentiel? Merci pour le post
import cv2
import os
image_folder = 'images'
video_name = 'video.avi'
images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape
video = cv2.VideoWriter(video_name, 0, 1, (width,height))
for image in images:
video.write(cv2.imread(os.path.join(image_folder, image)))
cv2.destroyAllWindows()
video.release()
s'il vous plaît aviser, comment puis-je résoudre ce problème? J'aimerais que les vidéos soient au même rythme que la vidéo originale et que les images soient dans un ordre séquentiel.
Si votre besoin nécessite que vous stockiez les cadres, essayez ceci
import cv2
import os
image_folder = 'images'
video_name = 'video.avi'
images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape
video = cv2.VideoWriter(video_name, 0, 1, (width,height))
for i in range(len(images)):
video.write(cv2.imread(os.path.join(image_folder, 'a'+str(i)+'.jpg')))
cv2.destroyAllWindows()
video.release()
Cela fonctionne bien avec moi
import cv2
import os
image_folder = 'c:\\m\\'
video_name = 'c:\\m\\avideo.avi'
images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")]
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape
#1 fps
#video = cv2.VideoWriter(video_name, 0, 1, (width,height))
#25 fps
video = cv2.VideoWriter(video_name, 0, 25, (width,height))
for image in images:
video.write(cv2.imread(os.path.join(image_folder, image)))
cv2.destroyAllWindows()
video.release()
matériaux et résultat Ici
Essayez glob
pour lister les fichiers et trier la liste. J'ai modifié votre code à l'aide de glob. (En supposant que vos noms de fichiers d'images sont dans l'ordre souhaité)
import cv2
import os
import glob
video_name = 'video.avi'
images = glob.glob('images/*.jpg')
images.sort()
frame = cv2.imread(images[0])
height, width, layers = frame.shape
video = cv2.VideoWriter(video_name, 0, 1, (width,height))
for image in images:
video.write(cv2.imread(image))
cv2.destroyAllWindows()
video.release()
Il semble que vous ayez besoin d'un tri naturel, alors essayez natsort library:
from natsort import natsorted
images = natsorted(images)
Installer à l'aide de pip:
pip install natsort