web-dev-qa-db-fra.com

python opencv videowrite n'écrit pas de vidéo

Je viens de commencer à programmer python avec opencv. J'ai utilisé la page suivante du tutoriel opencv 3.0.0

Tutoriel à lire la documentation

Lorsque j'ai essayé d'utiliser l'exemple qui enregistre des vidéos, cela ne fonctionne pas. Il affiche le contenu de la webcam et crée également un fichier appelé output.avi, mais lorsque j'ai vérifié la taille de ouput.avi, il était de zéro octet. J'ai également essayé d'utiliser différents codecs, comme YUY2

J'utilise python 2.7.8 et opencv 3.0.0 et windows 8.1

13
Zachzhao

J'ai eu le même problème et je l'ai résolu en spécifiant la résolution de sortie vidéo exactement comme l'entrée:

cap = cv2.VideoCapture('vtest.avi')
...
out = cv2.VideoWriter('output.avi',fourcc, 20.0,(int(cap.get(3)),int(cap.get(4))))

Bien sûr, assurez-vous que ffmpeg est installé et fonctionne.

16
Pijar

Remplacement:

fourcc = cv2.VideoWriter_fourcc(*'XVID')

Avec:

fourcc = cv2.VideoWriter_fourcc('M','J','P','G')

A travaillé pour moi ...

Plus généralement:

Recherchez le code fourcc du format de compression vidéo que vous recherchez ici , et quel que soit le code - par exemple 'FMP4' pour FFMpeg - branchez-le de la manière suivante:

cv2.VideoWriter_fourcc('F','M','P','4')
12
Lamar Latrell

Assurez-vous que vous utilisez le bon code à quatre octets de 4 cc. L'exemple du tutoriel a:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

Ce code "XVID" ne peut fonctionner que pour Linux. La documentation au-dessus de l'exemple indique (dans le tutoriel): "Sous Windows: DIVX (Plus à tester et à ajouter)." Donc, si ce n'est pas le cas, essayez de remplacer la ligne fourcc ci-dessus par:

fourcc = cv2.VideoWriter_fourcc(*'DIVX')

J'utilise cv2.VideoWriter sur linux assez souvent et cela fonctionne toujours. Donc, si ce qui précède ne fonctionne pas, vous pouvez toujours l'essayer sur un linux vm.

6
Scott

Dans mon cas, je pensais que le codec était un obstacle, mais ce n'était pas le cas. Au lieu de cela, l'ajustement des dimensions consommées par videoWriter () a fait l'affaire:

(ok, frame) = cv2.VideoCapture(videoPath).read()

 fourcc = cv2.VideoWriter_fourcc(*'XVID')
 out = cv2.VideoWriter(output, fourcc, 10.0, (1280, 720))

(1280,720) a été utilisé parce que frame.shape de mes sorties vidéo (1280, 720, 3). Il a rendu possible l'avi vers mp4 et vice versa. Je n'ai pas eu à me soucier de réconcilier le codec.

3
mmmFood

Vérifiez la résolution de vos images! J'essayais avec des images de forme étrange (1284x709) et je me suis retrouvé avec des vidéos illisibles de 1k. Après avoir redimensionné mon image à la résolution "commune" la plus proche: image = cv2.resize(image, (1280,720)), cela a très bien fonctionné.

1
nchaumont

Cela devrait être un problème avec le codec que vous utilisez.

As-tu essayé:

cv.CV_FOURCC('i', 'Y', 'U', 'V')

Celui-ci a fonctionné pour moi.

1
Leonard Zhou

J'ai exactement le même problème. J'utilise OpenCV en C++, mais je pense que vous pouvez toujours passer -1 au lieu de choisir le codec pour avoir un menu déroulant des codecs disponibles même en python. De là, j'ai essayé tous les codecs différents et tout comme Leonard Zhou, le codec IYUV était celui qui fonctionnait pour moi. Notez également que c'est le seul qui a fonctionné même si je pouvais très bien utiliser XVID sur une autre machine avec le même code et le même programme d'installation de codec.

EDIT: Ce que j'ai suggéré fonctionnait comme un patch, le problème principal a été résolu de mon côté en ajoutant le opencv_ffmpeg dll dans le dossier de l'exécutable.

0
pandaman1234

J'ai changé la taille de l'enregistreur vidéo en taille de résolution d'écran et cela a fonctionné.

voici la solution.

out = cv2.VideoWriter("output.avi", fourcc, 5.0, (1920, 1080))
0
CCVT

Sur Windows 7 et en utilisant Python 2.7 et OpenCV 2.4.8, j'ai expérimenté le fait que si le fichier NAME est "output.mpg" n'écrirait pas.

Je l'ai résolu en changeant en "output.avi".

0
schwang