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
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.
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')
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.
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.
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é.
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.
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.
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))
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"
.