2014-12-15 17 views
6

Moim zadaniem jest stworzenie narzędzia, które może zająć wideo i czas w ciągu kilku sekund.Wyodrębnianie obrazu z wideo w danym czasie za pomocą OpenCV

Narzędzie powinno wypisać obrazy jpeg z wideo z podanymi danymi wejściowymi.

E.g. niech nazwa wideo będzie abc.mpeg, a czas zostanie dostarczony do narzędzia jako 20 sekund. Narzędzie powinno wypisać obraz z wideo @ 20 sekund.

# 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 

Powyższy kod daje wszystkie ramki z całego filmu, moim problemem jest to, w jaki sposób można przekazać czas i dostać ramkę w określonym czasie?

+3

w C++ zrobiłbyś 'vidcap.set (CV_CAP_PROP_POS_MSEC, 20000);' aby ustawić przechwytywanie na pozycję 20 sekund = 20000 milisekund. W python prawdopodobnie będzie wyglądał bardzo podobnie. Możesz użyć 'vidcap.get (CV_CAP_PROP_POS_MSEC)', aby zapytać o aktualną pozycję, jeśli chcesz zatrzymać się po pewnym określonym czasie. – Micka

Odpowiedz

8

dlaczego nie robisz tego, co proponowała @micka?

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

dzięki, zrozumiałem. Również powinniśmy użyć vidcap.set (0,20000) zamiast CAP_PROP_POS_MSEC – venpo045

+0

^^ ah, przepraszam, wypróbowałem na 3.0, gdzie stałe są bardziej spójne. to prawdopodobnie cv2.cv.CAP_PROP_POS_MSEC z opencv2.4 – berak

+0

Nie działa dla mnie – 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 

Wyjście jest następujący

framerate: 29.97002997 
framecount: 901.0 
newframerate: 29.97002997 

Dlaczego liczba klatek na sekundę nie jest changing.I chcesz zmienić ilość klatek na sekundę do 1 tak, że niezależnie od wartości użytkownik daje czas i powinny być w stanie uzyskać ramkę obrazu.

+0

Jak powiedział @Micka, aby zmienić szybkość klatek, próbowałem ustawić szybkość klatek, ale nie zmienia się. – 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 

Tutaj cap.set (cv2.CAP_PROP_POS_MSEC, 1000) jest odpowiedzialny za pomijanie bezpośrednio do 1 sekundę w wideo (1000-milisekundy). Możesz zastąpić wybraną wartość.

Przetestowałem kod na OpenCV 3.1.0.