web-dev-qa-db-fra.com

openCV enregistrement vidéo en python

J'essaie de sauvegarder la vidéo mais cela ne fonctionne pas ..__ J'ai suivi les instructions de la documentation openCV.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

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

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)


        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()

out.release()

cv2.destroyAllWindows()

Qu'est-ce qui ne va pas?

19
user4594264

essaye ça . ça marche pour moi.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
#fourcc = cv2.cv.CV_FOURCC(*'DIVX')
#out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
out = cv2.VideoWriter('output.avi', -1, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
14
Nurul Akter Towhid

Dans mon cas, j’ai trouvé que la taille de Writer devait correspondre à la taille du cadre de la caméra ou des fichiers. Pour que je lise d’abord la taille du cadre et que j’applique au paramètre writer comme ci-dessous. 

(grabbed, frame) = camera.read()
fshape = frame.shape
fheight = fshape[0]
fwidth = fshape[1]
print fwidth , fheight
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (fwidth,fheight))

J'ai également rencontré le même problème mais cela a fonctionné quand j'ai utilisé'MJPG' au lieu de 'XVID'

J'ai utilisé 

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

au lieu de 

fourcc = cv2.VideoWriter_fourcc(*'XVID')
3
Naseeb Gill

J'ai eu le même problème et puis j'ai essayé ceci:

frame = cv2.flip(frame,180) 

au lieu de 

frame= cv2.flip(frame,0) 

et ça marche.

2
Yasmin AM

jveitchmichaelis at https://github.com/ContinuumIO/anaconda-issues/issues/223 a fourni une réponse complète. Ici j'ai copié sa réponse: 

La documentation dans OpenCV indique (cachée) que vous ne pouvez écrire que pour avi en utilisant OpenCV3. Que ce soit vrai ou non, je n'ai pas été capable de déterminer, mais j'ai été incapable d'écrire à autre chose.

Cependant, OpenCV est principalement une bibliothèque de vision par ordinateur, et non un flux vidéo, un codec et une écriture. Par conséquent, les développeurs ont essayé de garder cette partie aussi simple que possible. En raison de cette OpenCV pour la vidéo conteneurs ne supporte que l'extension avi, sa première version.

De: http://docs.opencv.org/3.1.0/d7/d9e/tutorial_video_write.html

Ma configuration: j'ai créé OpenCV 3 à partir de la source à l'aide de MSVC 2015, y compris ffmpeg. J'ai également téléchargé et installé XVID et openh264 à partir de Cisco, que j'ai ajouté à mon PATH. Je cours Anaconda Python 3. Je aussi téléchargé une version récente de ffmpeg et ajouté le dossier bin à mon fichier chemin, bien que cela ne devrait pas faire une différence comme son cuit dans OpenCV.

Je cours dans Win 10 64-bit.

Ce code semble fonctionner correctement sur mon ordinateur. Il va générer une vidéo contenant des parasites statiques:

writer = cv2.VideoWriter("output.avi",
cv2.VideoWriter_fourcc(*"MJPG"), 30,(640,480))

for frame in range(1000):
    writer.write(np.random.randint(0, 255, (480,640,3)).astype('uint8'))

writer.release()

Certaines choses que j'ai apprises par essais et erreurs:

  • Utilisez uniquement ".avi", c'est juste un conteneur, le codec est la chose la plus importante.
  • Soyez prudent avec la spécification des tailles de trame. Dans le constructeur, vous devez indiquer la taille de l’image (colonne, ligne), par exemple. 640x480. Cependant, le Le tableau que vous transmettez est indexé en tant que (ligne, colonne). Voir ci-dessus par exemple comment il est commuté

  • Si la taille de votre image d'entrée est différente de celle de VideoWriter, elle échouera (souvent en mode silencieux).

  • Ne transmettez que des images 8 bits, convertissez manuellement vos tableaux si vous devez (.astype ('uint8'))
  • En fait, peu importe, juste toujours jeté. Même si vous chargez des images avec cv2.imread, vous devez convertir en uint8 ...
  • MJPG échouera si vous ne passez pas dans une image 8 canaux à 3 canaux. Je reçois un échec d'assertion pour cela au moins.
  • XVID requiert également une image à 3 canaux mais échoue silencieusement si vous ne le faites pas.
  • H264 semble être bon avec une image monocanal
  • Si vous avez besoin d’une sortie brute, par exemple d’une caméra de vision industrielle, vous pouvez utiliser «DIB». «RAW» ou un codec vide fonctionne parfois. Bizarrement si j'utilise DIB, je reçois une erreur ffmpeg, mais la vidéo est bien enregistrée. Si j'utilise RAW, il n'y a pas d'erreur, mais le lecteur vidéo Windows ne l'ouvrira pas. Tous sont bien dans VLC.

En fin de compte, je pense que le point clé est qu'OpenCV n'est pas conçu pour être une bibliothèque de capture vidéo - elle ne prend même pas en charge le son. VideoWriter est utile, mais 99% du temps, vous feriez mieux de sauvegarder tous vos fichiers images dans un dossier et en utilisant ffmpeg pour les transformer en un utile vidéo.

1
Kershaw

Comme @ ปรีดา ตั้ง น ภากร a déclaré: les tailles de Writer doivent correspondre au cadre de la caméra ou des fichiers.

Vous pouvez utiliser ce code pour vérifier si votre appareil photo est (640, 480) ou non:

print(int(cap.get(3)), int(cap.get(4)))

Pour ma part, j'ai trouvé mon appareil photo (1280, 720) et remplacé (640, 480) par (1280, 720). Ensuite, il peut enregistrer des vidéos.

0
zhengger

Par exemple :

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out_corner = cv2.VideoWriter('img_corner_1.avi',fourcc, 20.0, (640, 480))

A cet endroit, il faut définir X, Y comme largeur et hauteur

Mais, lorsque vous créez une image (une image vierge par exemple), vous devez définir Y, X en hauteur et en largeur:

    img_corner = np.zeros((480, 640, 3), np.uint8)
0
laurent thiol

Nuru answer fonctionne réellement, la seule chose à faire est de supprimer cette ligne frame = cv2.flip(frame,0) sous la boucle if ret==True: qui affichera le fichier vidéo sans basculer

0
Bhanu Chander