2012-04-07 18 views
0

Ich spiele eine Videodatei, aber wie kann ich sie wieder abspielen, wenn sie fertig ist?OpenCV: Wie starte ich ein Video neu?

Javier

+1

C? C++? Java? oder was? Verbessere die Markierung bitte. – karlphillip

+1

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

Antwort

0

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.

1

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 ...

Siehe http://docs.opencv.org/2.4.6/modules/highgui/doc/reading_and_writing_images_and_video.html?highlight=cvqueryframe#videocapture-set

+0

Seltsamerweise kehrt der Feed nach dem ersten Zurücksetzen den letzten Frame zurück. – noio

1

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)