2017-09-26 9 views
0

J'essaie de tirer des trames individuelles à des heures spécifiées à partir d'un flux RTSP.OpenCV (Python) ne met pas à jour le cadre quand read() est appelé

Cela fonctionne très bien pour le streaming vidéo:

vcap = cv2.VideoCapture(RTSP_URL) 

while(1): 
    ret, frame = vcap.read() 
    cv2.imshow('VIDEO', frame) 
    cv2.waitKey(1) 

Mais si je veux prendre une image chaque seconde et l'enregistrer en faisant quelque chose comme ceci:

vcap = cv2.VideoCapture(RTSP_URL) 

for t in range(60): 
    ret, frame = vcap.read() 
    if ret: 
     cv2.imwrite("{}.jpg".format(t), frame) 
    time.sleep(1); 

Chaque image sera exactement la même que la première image. Dans chaque cas ret == True.

(Aussi ce fonctionnait très bien pour moi il y a une semaine, puis ipython fait quelque chose qui m'a obligé de faire une nouvelle installation)

+0

Voulez-vous dire 'cv2.imwrite ('t.jpg', cadre)'? – zindarod

+0

^^ Oui désolé, je l'ai réparé ... Je revenais entre les différentes bibliothèques. Mais j'avais cv2.imwrite() dans mon code actuel. – theastrocat

+0

Vous ne voulez pas changer le nom de l'image 't.jpg' à chaque itération depuis son écrasement. –

Répondre

1

cv2.waitKey(1000) ne ferait rien si vous ne l'avez pas montrer l'image avec cv2.imshow(). Essayez:

vcap = cv2.VideoCapture(RTSP_URL) 

for t in range(60): 
    ret, frame = vcap.read() 
    cv2.imwrite('{}.jpg'.format(t), frame) 

    # this will activate the waitKey funciton 
    cv2.imshow('preview', frame) 
    cv2.waitKey(1000) 

Sur une autre note, ipython/jupyter ne imshow et la fonctionnalité de l'interface graphique de l'ensemble joue pas bien avec le CV2. Si, par exemple, vous ne pouvez pas briser la boucle par keypress

if (cv2.waitKey(1000) == 27 & 0xff): break; 
+0

Très bien, si je remplace cv2.waitKey (1000) avec time.sleep (1)? Je ne veux rien montrer, je veux juste attendre une seconde. – theastrocat

0

D'accord, après déconner sans fin avec elle au cours des derniers jours, 1 seconde n'est pas assez rapide pour l'alimentation pour une raison quelconque.

Cela fonctionne:

vcap = cv2.VideoCapture(RTSP_URL) 

for t in range(60): 
    ret, frame = vcap.read() 
    if ret and t % 1000 == 0: 
     cv2.imwrite("{}.jpg".format(t), frame) 
    time.sleep(0.001)