Au cours de mes études universitaires, j'écris ce que je pensais généralement être utile. Je me réfère à cet article. L'article ci-dessus décrit des méthodes telles que l'extraction de toutes les images de la vidéo, l'extraction des images de $ t_1 $ secondes à $ t_2 $ secondes, mais dans cet article, je présenterai la méthode de découpage toutes les secondes. Je suis.
"Je veux analyser la vidéo, mais il est difficile de gérer la vidéo telle quelle?: Confondé:" "Ensuite, si vous le découpez avec un cadre, vous ne pouvez pas revenir à la tâche de l'image?: Open_mouth:" D'après mon expérience personnelle, le but est de découper des images de la vidéo une seconde à la fois.
La structure de répertoires suivante est supposée.
|── sample.ipynb
|
|── video
| └── video_sample.mp4
|
└── frame
└── video_sample
|── image_0000.jpg
︙
└── image_00030.jpg
Si la vidéo (video_sample.mp4
) est de 30 secondes, on suppose que 31 images à 0 seconde, 1 seconde, ..., 30 secondes seront enregistrées sous frame / video_sample
.
Opencv-python est une bonne référence pour l'installation d'OpenCV.
--video_path: le chemin de la vidéo dont vous souhaitez recadrer l'image --frame_dir: Où enregistrer le cadre
sample.ipynb
import cv2
from os import makedirs
from os.path import splitext, dirname, basename, join
def save_frames(video_path: str, frame_dir: str,
name="image", ext="jpg"):
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
return
v_name = splitext(basename(video_path))[0]
if frame_dir[-1:] == "\\" or frame_dir[-1:] == "/":
frame_dir = dirname(frame_dir)
frame_dir_ = join(frame_dir, v_name)
makedirs(frame_dir_, exist_ok=True)
base_path = join(frame_dir_, name)
idx = 0
while cap.isOpened():
idx += 1
ret, frame = cap.read()
if ret:
if cap.get(cv2.CAP_PROP_POS_FRAMES) == 1: #Enregistrer 0 seconde image
cv2.imwrite("{}_{}.{}".format(base_path, "0000", ext),
frame)
elif idx < cap.get(cv2.CAP_PROP_FPS):
continue
else: #Enregistrer l'image d'une seconde
second = int(cap.get(cv2.CAP_PROP_POS_FRAMES)/idx)
filled_second = str(second).zfill(4)
cv2.imwrite("{}_{}.{}".format(base_path, filled_second, ext),
frame)
idx = 0
else:
break
save_frames(".\\video\\video_sample.mp4", ".\\frame")
Lorsqu'il est exécuté, il est enregistré comme suit.
Il est difficile de gérer les vidéos.
Recommended Posts