web-dev-qa-db-fra.com

Comment lire des fichiers vidéo en utilisant python & Opencv

Je lis un fichier avi en utilisant python 2.7 et opencv2.4.J’utilise Windows 10. Mon exemple de code est

import numpy as np
import cv2
cap = cv2.VideoCapture('videos/wa.avi')
while(cap.isOpened()):
  ret, frame = cap.read()
  gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  cv2.imshow('frame',gray)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break

cap.release()
cv2.destroyAllWindows()

Quand je lance la vidéo est affichée, mais le programme se termine sans erreur

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ..\..\..\..\opencv\modules\highgui\src\window.cpp, line 261
Traceback (most recent call last):
File "C:/Users/Emmanu/PycharmProjects/VideoEventDetection/test.py", line 11, in <module>
cv2.imshow('frame',frame)
cv2.error: ..\..\..\..\opencv\modules\highgui\src\window.cpp:261: error: (-215) size.width>0 && size.height>0 in function cv::imshow

Qu'est-ce que je fais mal? Comment puis-je le corriger?

3
user6745741

Le problème est dans cette ligne:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Cette ligne s'attend à ce que la trame soit un objet Mat à 3 ou 4 canaux, mais à la place elle a un mat vide et c'est pourquoi vous obtenez que cette assertion a échoué. Vous devez vérifier si le cadre existe en vidéo et gérer correctement la fin de la vidéo.

cap.isOpened() vérifiera simplement si le fichier vidéo peut être ouvert en lecture, mais il ne renverra pas de faux lorsque la fin du fichier vidéo sera atteinte.

Essayez this

5
abggcv

Vous avez pris le tutoriel d'ici: Lecture d'une vidéo à partir d'un fichier

Cette question concerne votre erreur: open cv error: (-215) scn == 3 || scn == 4 dans la fonction cvtColor

Deux choses peuvent fonctionner:

  • Assurez-vous que la vidéo est trouvée!
  • Et essayez d'utiliser cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
0
ppasler

Eh bien, je suppose que la capture n’est pas ouverte. C'est pourquoi votre programme se termine instantanément lorsque vous utilisez while(cap.isOpened()):.

Comme indiqué dans ce document doc , il arrive que la capture ne soit pas implicitement ouverte lors de sa création.

Parfois, cap n'a peut-être pas initialisé la capture. Dans ce cas, ce code indique une erreur. Vous pouvez vérifier s'il est initialisé ou non par la méthode cap.isOpened (). Si c'est vrai, d'accord. Sinon, ouvrez-le avec cap.open ().

Essayez d'ouvrir explicitement la capture comme suit:

cap = cv2.VideoCapture('videos/wa.avi')
cap.open();
while(cap.isOpened()):
...

Si cela ne fonctionne pas, vous devrez vérifier le chemin du fichier vidéo.

0
Pierre C.

Lorsque vous mettez cap.isOpened(), vérifiez que la vidéo est lue correctement. La boucle while ne fonctionne donc pas. 

Mais lorsque vous passez à while True, il s'exécutera sans une lecture correcte, c'est pourquoi il génère une erreur. 

Assurez-vous que vous lisez correctement le fichier vidéo.

0
Rahul K P