Python verwendet opencv, um jedes Bild und das letzte Bild im Video zu extrahieren und als Bild zu speichern

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:

Fügen Sie hier eine Bildbeschreibung ein

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,frameLesen der Frames des Videos werden die Frame-Bilder im frameentsprechenden 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:

Fügen Sie hier eine Bildbeschreibung ein

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.

Supongo que te gusta

Origin blog.csdn.net/weixin_45277161/article/details/135130286
Recomendado
Clasificación