2014-12-15 1 views
6

Meine Aufgabe ist es, ein Dienstprogramm, das ein Video und Zeit in Sekunden dauern kann.Extrahieren von Bild von Video zu einem bestimmten Zeitpunkt mit OpenCV

Das Dienstprogramm sollte JPEG-Bilder aus dem Video mit der angegebenen Eingabe schreiben.

z. Lassen Sie den Videonamen abc.mpeg und die Zeit wird dem Gerät als 20 Sekunden angegeben. Das Dienstprogramm sollte Bild von Video @ 20. Sekunde ausschreiben.

# Import the necessary packages 
    import argparse 
    import cv2 

    vidcap = cv2.VideoCapture('Wildlife.mp4') 
    success,image = vidcap.read() 
    count = 0; 
    while success: 
     success,image = vidcap.read() 
     cv2.imwrite("frame%d.jpg" % count, image)  # save frame as JPEG file 
     if cv2.waitKey(10) == 27:      # exit if Escape is hit 
      break 
     count += 1 

Der obige Code alle Frames des gesamten Videos gibt, ist meine Sorge, wie ich Zeit passieren kann und den Rahmen zu der angegebenen Zeit bekommen?

+3

in C++ würden Sie 'vidcap.set (CV_CAP_PROP_POS_MSEC, 20000);', um die Erfassung in Position 20 Sekunden = 20000 Millisekunden zu setzen. In Python wird es wahrscheinlich sehr ähnlich aussehen. Sie können 'vidcap.get (CV_CAP_PROP_POS_MSEC)' verwenden, um nach der aktuellen Position zu fragen, wenn Sie nach einer bestimmten Zeit anhalten möchten. – Micka

Antwort

8

Warum machst du nicht nur, was @micka vorgeschlagen?

import cv2 

vidcap = cv2.VideoCapture('d:/video/keep/Le Sang Des Betes.mp4') 
vidcap.set(cv2.CAP_PROP_POS_MSEC,20000)  # just cue to 20 sec. position 
success,image = vidcap.read() 
if success: 
    cv2.imwrite("frame20sec.jpg", image)  # save frame as JPEG file 
    cv2.imshow("20sec",image) 
    cv2.waitKey()      
+1

danke jetzt habe ich verstanden. Auch sollten wir vidcap.set (0.20000) anstelle von CAP_PROP_POS_MSEC verwenden – venpo045

+0

^^ ah, sorry, versuchte auf 3.0, wo die Konstanten mehr konsistent sind. es ist wahrscheinlich cv2.cv.CAP_PROP_POS_MSEC mit opencv2.4 – berak

+0

Hat nicht für mich gearbeitet – JonathanMitchell

0
# Import the necessary packages 
import cv2 

vidcap = cv2.VideoCapture('Wildlife.mp4') 
success,image = vidcap.read() 
print success 
#cv2.imwrite("frame.jpg", image) 

count = 0 
framerate = vidcap.get(5) 
print "framerate:", framerate 
framecount = vidcap.get(7) 
print "framecount:", framecount 
vidcap.set(5,1) 
newframerate = vidcap.get(5) 
print "newframerate:", newframerate 

while success: 
    success,image = vidcap.read() 
    #cv2.imwrite("frame%d.jpg" % count, image) 

    getvalue = vidcap.get(0) 
    print getvalue 
    if getvalue == 20000: 
    cv2.imwrite("frame%d.jpg" % getvalue, image) 

    #if cv2.waitKey(10) == 27:      
     #break 
    count += 1 

Die Ausgabe ist wie folgt

framerate: 29.97002997 
framecount: 901.0 
newframerate: 29.97002997 

Warum Framerate nicht changing.I will Framerate auf 1 ändern, dass so etwas auch immer Zeitwert Benutzer geben ich in der Lage sein sollte, Bildrahmen zu erhalten.

+0

Wie @Micka sagte, um die Bildrate zu ändern, habe ich versucht, Bildrate zu setzen, aber es ändert sich nicht. – venpo045

0
import cv2 

cap = cv2.VideoCapture('bunny.mp4') 
cap.set(cv2.CAP_PROP_POS_MSEC,1000)  # Go to the 1 sec. position 
ret,frame = cap.read()     # Retrieves the frame at the specified second 
cv2.imwrite("image.jpg", frame)   # Saves the frame as an image 
cv2.imshow("Frame Name",frame)   # Displays the frame on screen 
cv2.waitKey()       # Waits For Input 

Hier cap.set (cv2.CAP_PROP_POS_MSEC, 1000) ist verantwortlich für die im Video (1000. Millisekunden) direkt zum ersten Sekunde zu überspringen. Fühlen Sie sich frei, den Wert Ihrer Wahl zu ersetzen.

Ich habe den Code auf OpenCV 3.1.0 getestet.