Während des Studiums schreibe ich auf, was ich allgemein für nützlich hielt. Ich verweise auf diesen Artikel. Der obige Artikel beschreibt Methoden wie das Extrahieren aller Frames aus dem Video, das Extrahieren von Frames von $ t_1 $ Sekunden bis $ t_2 $ Sekunden. In diesem Artikel werde ich jedoch die Methode zum Ausschneiden jeder Sekunde vorstellen. Ich bin.
"Ich möchte das Video analysieren, aber es ist schwierig, mit dem Video so umzugehen, wie es ist?: Verwirrt:" "Wenn Sie es dann mit einem Rahmen ausschneiden, können Sie nicht zur Aufgabe des Bildes zurückkehren ?: Open_mouth:" Nach meiner persönlichen Erfahrung besteht der Zweck darin, Bilder einzeln aus dem Video auszuschneiden.
Die folgende Verzeichnisstruktur wird angenommen.
|── sample.ipynb
|
|── video
| └── video_sample.mp4
|
└── frame
└── video_sample
|── image_0000.jpg
︙
└── image_00030.jpg
Wenn das Video (video_sample.mp4
) 30 Sekunden lang ist, wird angenommen, dass 31 Bilder mit 0 Sekunden, 1 Sekunde, ..., 30 Sekunden unter frame / video_sample
gespeichert werden.
Opencv-python ist eine gute Referenz für die Installation von OpenCV.
--video_path: Der Pfad des Videos, in dem Sie den Frame zuschneiden möchten --frame_dir: Wo soll der Frame gespeichert werden?
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: #Speichern Sie 0 Sekunden Frame
cv2.imwrite("{}_{}.{}".format(base_path, "0000", ext),
frame)
elif idx < cap.get(cv2.CAP_PROP_FPS):
continue
else: #Bild um 1 Sekunde speichern
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")
Bei der Ausführung wird es wie folgt gespeichert.
Es ist schwierig, mit Videos umzugehen.
Recommended Posts