2015-11-11 12 views

risposta

16

Grazie GPPK.

I parametri video devono essere indicati come numeri interi. Ogni bandiera ha il suo valore. Vedi here per i codici.

La soluzione corretta è:

import numpy as np 
import cv2 

#Get video name from user 
#Ginen video name must be in quotes, e.g. "pirkagia.avi" or "plaque.avi" 
video_name = input("Please give the video name including its extension. E.g. \"pirkagia.avi\":\n") 

#Open the video file 
cap = cv2.VideoCapture(video_name) 

#Set frame_no in range 0.0-1.0 
#In this example we have a video of 30 seconds having 25 frames per seconds, thus we have 750 frames. 
#The examined frame must get a value from 0 to 749. 
#For more info about the video flags see here: https://stackoverflow.com/questions/11420748/setting-camera-parameters-in-opencv-python 
#Here we select the last frame as frame sequence=749. In case you want to select other frame change value 749. 
#BE CAREFUL! Each video has different time length and frame rate. 
#So make sure that you have the right parameters for the right video! 
time_length = 30.0 
fps=25 
frame_seq = 749 
frame_no = (frame_seq /(time_length*fps)) 

#The first argument of cap.set(), number 2 defines that parameter for setting the frame selection. 
#Number 2 defines flag CV_CAP_PROP_POS_FRAMES which is a 0-based index of the frame to be decoded/captured next. 
#The second argument defines the frame number in range 0.0-1.0 
cap.set(2,frame_no); 

#Read the next frame from the video. If you set frame 749 above then the code will return the last frame. 
ret, frame = cap.read() 

#Set grayscale colorspace for the frame. 
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

#Cut the video extension to have the name of the video 
my_video_name = video_name.split(".")[0] 

#Display the resulting frame 
cv2.imshow(my_video_name+' frame '+ str(frame_seq),gray) 

#Set waitKey 
cv2.waitKey() 

#Store this frame to an image 
cv2.imwrite(my_video_name+'_frame_'+str(frame_seq)+'.jpg',gray) 

# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 
+0

In 'pitone 3.5' ​​usando' cap.set() ', il primo argomento definisce il numero di frame nell'intervallo 0,0-1,0. Quindi è 'cap.set (1, frame_no)'. – zinon

+1

In cap.set() il primo argomento dovrebbe essere 'cv2.cv.CV_CAP_PROP_POS_FRAMES' senza alcuna magia '1' o '2'. Il secondo è il numero di fotogramma nel range 0 - cv2.cv.CV_CAP_PROP_FRAME_COUNT - è un numero intero, non float 0.0 - 1.0! –

9

Se si desidera un fotogramma esatto, si può solo impostare la sessione VideoCapture a quel fotogramma. È molto più intuitivo chiamare automaticamente quel frame. La soluzione "corretta" richiede l'inserimento di dati noti: come fps, lunghezza e quant'altro. Tutto quello che devi sapere con il codice qui sotto è il frame che vuoi chiamare.

import numpy as np 
import cv2 
cap = cv2.VideoCapture(video_name) #video_name is the video being called 
cap.set(1,frame_no); # Where frame_no is the frame you want 
ret, frame = cap.read() # Read the frame 
cv2.imshow('window_name', frame) # show frame on window 

Se si vuole tenere la finestra, fino a quando si preme l'uscita:

while True: 
    ch = 0xFF & cv2.waitKey(1) # Wait for a second 
    if ch == 27: 
     break 
+1

Cos'è 1 in 'cap.set (1, frame_no)'? – Moondra

+0

Dai un'occhiata alla mia risposta qui sotto. –

5

Sì, è molto semplice:

import cv2 
cap = cv2.VideoCapture(videopath) 
cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, frame_number-1) 
res, frame = cap.read() 

'frame_number' è un intero compreso tra 0 ... amount_of_frames. Nota: è necessario impostare 'frame_number-1' per forzare la lettura del frame 'frame_number'. Non è documentato bene ma il test mostra che il comportamento del modulo VideoCapture.

'res' è il risultato booleano dell'operazione, si può usarlo per controllare se il frame è stato letto correttamente. Si può ottenere quantità di fotogrammi:

amount_of_frames = cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT) 
+2

'cv2.cv.CV_CAP_PROP_FRAME_COUNT' non era disponibile per me. Ho trovato 'cv2.CAP_PROP_FRAME_COUNT' – user3731622

+2

Immagino tu stia usando cv 3.x. Opencv 3.x definisce quelle costanti all'interno del modulo cv2 e senza prefisso CV_. Opencv 2.x li definisce all'interno del modulo cv2.cv e con prefisso CV_. –

Problemi correlati