Ich spiele eine Videodatei, aber wie kann ich sie wieder abspielen, wenn sie fertig ist?OpenCV: Wie starte ich ein Video neu?
Javier
Ich spiele eine Videodatei, aber wie kann ich sie wieder abspielen, wenn sie fertig ist?OpenCV: Wie starte ich ein Video neu?
Javier
Schließen der aktuellen Capture und wieder öffnen:
// play video in a loop
while (1)
{
CvCapture *capture = cvCaptureFromAVI("video.avi");
if(!capture)
{
printf("!!! cvCaptureFromAVI failed (file not found?)\n");
return -1;
}
IplImage* frame = NULL;
char key = 0;
while (key != 'q')
{
frame = cvQueryFrame(capture);
if (!frame)
{
printf("!!! cvQueryFrame failed: no frame\n");
break;
}
cvShowImage("window", frame);
key = cvWaitKey(10);
}
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
}
Dieser Code ist nicht vollständig und wurden nicht getestet. Es dient nur zu Illustrationszwecken.
Sie müssen das aktuelle Capture nicht erneut öffnen. Alles, was Sie tun müssen, ist, die Position an den Anfang der Datei zurückzusetzen und den Zyklus fortzusetzen, anstatt ihn zu unterbrechen.
if (!frame)
{
printf("!!! cvQueryFrame failed: no frame\n");
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO , 0);
continue;
}
Dennoch gibt es eine erhebliche Verzögerung, als ob Sie es wieder geöffnet wurden ...
Seltsamerweise kehrt der Feed nach dem ersten Zurücksetzen den letzten Frame zurück. – noio
Wenn Sie das Video immer und immer wieder neu gestartet werden soll (looping es aka) Sie können dies tun, indem Sie eine if-Anweisung verwenden, wenn die Frame-Anzahl cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT)
erreicht und dann die Frame-Anzahl und cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, num)
auf denselben Wert zurücksetzen. Ich benutze OpenCV 2.4.9 mit Python 2.7.9 und das folgende Beispiel führt das Video für mich durch.
import cv2
cap = cv2.VideoCapture('path/to/video')
frame_counter = 0
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
frame_counter += 1
#If the last frame is reached, reset the capture and the frame_counter
if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
frame_counter = 0 #Or whatever as long as it is the same as next line
cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, 0)
# Our operations on the frame come here
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Display the resulting frame
cv2.imshow('frame',gray)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()
Es funktioniert auch das Video wieder zu erlangen, anstatt den Bildzählwertes des Zurücksetzens:
if frame_counter == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
frame_counter = 0
cap = cv2.VideoCapture(video_name)
C? C++? Java? oder was? Verbessere die Markierung bitte. – karlphillip
Wenn diese Frage erfolgreich beantwortet wurde, können Sie die offizielle Antwort auswählen, indem Sie auf das Kontrollkästchen daneben klicken. Wenn nicht, sollten Sie Ihre eigene Antwort hinzufügen. – karlphillip