Extrahieren Sie jeden Frame des Videos und speichern Sie das Bild
Kürzlich habe ich an einem Videoerkennungsproblem gearbeitet. Wenn ich den Videorahmen als Bild speichere, kann das Bild gespeichert werden, aber es treten (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'
Probleme auf und es kann nicht normal ausgeführt werden. Nach Überprüfung des Codes, Überprüfung des Pfads und anderer Maßnahmen dazu Kein Erfolg, ich habe etwas über den Videorahmen erfahren. Das Problem wurde nach Anwendung des Prinzips gelöst. Der Grund war das Fehlen von Beurteilungsbedingungen für das Ende des Rahmens. Fügen Sie vor dem Schreiben Folgendes hinzu:
if frame is None;
break
else:
import cv2
# 读取视频并分帧为图片
video = cv2.VideoCapture("python/video/video2.mp4")
save_path = "python/img2"
index = 0
if video.isOpened():
f = int(video.get(cv2.CAP_PROP_FPS)) # 读取视频帧率
print("The video's fps is ", f) # 显示视频帧率
rval, frame = video.read() # 读取视频帧
else:
rval = False
while rval:
print(index)
rval,frame = video.read()
cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)
index += 1
Der Grund für den Fehler ist ganz einfach: Beim rval,frame
Lesen der Frames des Videos werden die Frame-Bilder im frame
entsprechenden Index gespeichert. Beim Schreiben von Bildern werden keine Beurteilungsbedingungen hinzugefügt. Nachdem das Video in Frames unterteilt wurde, cv2.imread函数
werden immer noch leere Informationen in den Ordner geschrieben, sodass ein Fehler auftritt. Daher wird cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)
der vorherigen Zeile des Videos eine Beurteilungsbedingung hinzugefügt Code, es wird beurteilt, dass das Framing beendet ist. Danach hören Sie einfach auf zu schreiben. Beurteilungsbedingungen hinzufügen:
if frame is None:
break
else:
Sie können die gerahmten Bilder korrekt importieren.
Der korrekte vollständige Code lautet wie folgt:
import cv2
# 读取视频并分帧为图片
video = cv2.VideoCapture("python/video/video2.mp4")
save_path = "python/img2"
index = 0
if video.isOpened():
f = int(video.get(cv2.CAP_PROP_FPS)) # 读取视频帧率
print("The video's fps is ", f) # 显示视频帧率
rval, frame = video.read() # 读取视频帧
else:
rval = False
while rval:
print(index)
rval,frame = video.read()
if frame is None:
break
else:
cv2.imwrite(save_path + "/"+ str(index)+".jpg",frame)
index += 1
Geben Sie das gerahmte Bild korrekt aus und speichern Sie es im Ordner:
Extrahieren Sie das letzte Bild des Videos und speichern Sie das Bild
Vollständiger Code:
import cv2
# 打开视频文件
cap = cv2.VideoCapture('python/video/video2.mp4')
# 读取视频文件中的所有帧
frames = []
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
frames.append(frame)
# 检查是否有帧可用
if len(frames) > 0:
# 提取最后一帧并将其保存为图像
last_frame = frames[-1]
cv2.imwrite('python/img/last.jpg', last_frame)
print("last picture over")
else:
print("错误:无法提取任何帧")
# 释放视频文件句柄
cap.release()
In diesem Code lesen wir zunächst alle Frames aus der Videodatei und speichern sie in einer Liste. Anschließend prüfen wir, ob in der Liste Frames verfügbar sind. Wenn ja, extrahieren Sie das letzte Bild und speichern Sie es als Bild. Andernfalls geben wir eine Fehlermeldung aus.
Beachten Sie hier, dass wir in diesem Code keine While-Schleife verwenden, um alle Frames zu durchlaufen, sondern alle Frames in eine Liste einlesen. Dadurch wird sichergestellt, dass wir den letzten Frame korrekt erhalten und keine Frames verpassen.
Wenn Sie das letzte Bild immer noch nicht extrahieren können, stellen Sie sicher, dass die Videodatei vorhanden und lesbar ist, und versuchen Sie es mit einer anderen Videodatei.