webentwicklung-frage-antwort-db.com.de

openCV-Video speichern in Python

Ich versuche, das Video zu speichern, aber es funktioniert nicht ... Ich bin den Anweisungen in der openCV-Dokumentation gefolgt.

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()

Was ist falsch?

19
user4594264

versuche dies . es funktioniert für mich.

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

In meinem Fall habe ich festgestellt, dass die Größe des Writers sowohl von der Kamera als auch von der Datei mit der Bildgröße übereinstimmen muss. So dass ich zuerst die Framegröße lese und auf die Schreibereinstellung zutreffe, siehe unten. 

(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))

Ich hatte auch das gleiche Problem, aber es funktionierte, als ich'MJPG' anstelle von 'XVID' verwendete.

Ich benutzte 

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

anstatt 

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

Bitte achten Sie auf die richtige Breite und Höhe. Sie können es wie unten einstellen

cv2.VideoWriter('output.avi', fourcc, 20.0, (int(cap.get(3)), int(cap.get(4))))
3
Dinusha Dilanka

Ich hatte das gleiche Problem und versuchte es dann:

frame = cv2.flip(frame,180) 

anstatt 

frame= cv2.flip(frame,0) 

und es funktioniert.

2
Yasmin AM

jveitchmichaelis unter https://github.com/ContinuumIO/anaconda-issues/issues/223 gab eine gründliche Antwort. Hier habe ich seine Antwort kopiert: 

Die Dokumentation in OpenCV besagt (versteckt), dass Sie nur .__ schreiben können. in avi mit OpenCV3. Ob das stimmt oder nicht, ich konnte es nicht Feststellen, aber ich konnte nichts anderes schreiben.

OpenCV ist jedoch hauptsächlich eine Computer Vision-Bibliothek, kein Videostream, Codec und Write. Daher haben die Entwickler versucht, .__ zu behalten. dieser Teil so einfach wie möglich. Aufgrund dieser OpenCV für Video container unterstützt nur die avi-erweiterung, die erste version.

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

Mein Setup: Ich habe OpenCV 3 mit MSVC 2015, einschließlich .__, aus dem Quellcode erstellt. ffmpeg. Ich habe auch XVID und openh264 von .__ heruntergeladen und installiert. Cisco, das ich meinem PFAD hinzugefügt habe. Ich betreibe Anaconda Python 3. Ich auch ein aktuelles Build von ffmpeg heruntergeladen und den bin-Ordner zu meinem .__ hinzugefügt. Pfad, aber das sollte keinen Unterschied machen, da es eingebettet in OpenCV.

Ich laufe in Win 10 64-Bit.

Dieser Code scheint auf meinem Computer gut zu funktionieren. Es wird ein Video erstellt zufällige Statik enthalten:

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()

Einige Dinge, die ich durch Ausprobieren gelernt habe:

  • Verwenden Sie nur '.avi', es ist nur ein Container, der Codec ist das Wichtigste.
  • Seien Sie vorsichtig bei der Angabe der Rahmengrößen. Im Konstruktor müssen Sie die Framegröße als (Spalte, Zeile) übergeben, z. 640 x 480. Die Array, das Sie übergeben, wird als (Zeile, Spalte) indiziert. Siehe oben Beispiel wie es geschaltet wird

  • Wenn Ihr Eingabebild eine andere Größe als der VideoWriter hat, schlägt es fehl (oft im Hintergrund).

  • Nur 8-Bit-Bilder übergeben, Arrays manuell umwandeln (.astype ('uint8'))
  • In der Tat, egal, nur immer Besetzung. Selbst wenn Sie Bilder mit cv2.imread laden, müssen Sie in uint8 umwandeln ...
  • MJPG schlägt fehl, wenn Sie kein 8-Bit-Bild mit 3 Kanälen übergeben. Ich bekomme dafür zumindest einen Behauptungsfehler.
  • XVID erfordert auch ein 3-Kanal-Image, schlägt jedoch fehl, wenn Sie dies nicht tun.
  • H264 scheint mit einem einzelnen Kanalbild gut zu funktionieren
  • Wenn Sie eine Rohausgabe benötigen, beispielsweise von einer Bildverarbeitungskamera, können Sie 'DIB' verwenden. 'RAW' oder ein leerer Codec funktioniert manchmal. Seltsam, wenn ich .__ benutze. DIB, ich bekomme einen ffmpeg-Fehler, aber das Video wird gut gespeichert. Wenn ich RAW verwende, Es wird kein Fehler angezeigt, aber der Windows Video Player lässt sich nicht öffnen. Alle sind gut in VLC.

Am Ende denke ich, der Schlüsselpunkt ist, dass OpenCV nicht als .__ konzipiert ist. eine Video-Capture-Bibliothek - es unterstützt nicht einmal Ton. VideoWriter ist nützlich, aber in 99% der Fälle ist es besser, alle Ihre .__ zu sparen. Bilder in einen Ordner und mit ffmpeg zu einem nützlichen Video.

1
Kershaw

Dies ist eine Antwort, die nur unter MacOS getestet wurde, aber wahrscheinlich auch unter Linux und Windows funktioniert.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Get the Default resolutions
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

# Define the codec and filename.
out = cv2.VideoWriter('output.avi',cv2.VideoWriter_fourcc('M','J','P','G'), 10, (frame_width,frame_height))

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

        # write the  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()

1
Boris

Wie @ ปรีดา ตั้ง น saidร sagte: Die Größe des Writers muss mit dem Bild der Kamera oder der Dateien übereinstimmen.

Sie können diesen Code verwenden, um zu überprüfen, ob Ihre Kamera (640, 480) ist oder nicht:

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

Für mich fand ich meine Kamera (1280, 720) und (640, 480) durch (1280, 720). Dann können Videos gespeichert werden.

0
zhengger

Als Beispiel :

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

An dieser Stelle müssen Sie X, Y als Breite und Höhe definieren

Wenn Sie jedoch ein Bild erstellen (beispielsweise ein leeres Bild), müssen Sie Y, X als Höhe und Breite definieren:

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

Nuru Antwort funktioniert tatsächlich, nur diese Zeile entfernen frame = cv2.flip(frame,0) unter if ret==True:-Schleife, die die Videodatei ohne Flips ausgibt

0
Bhanu Chander