Написание видео с помощью OpenCV + Python + Mac - PullRequest
7 голосов
/ 25 марта 2011

Я получаю сообщение об ошибке, когда пытаюсь записать кадры в видео.Я получаю следующую ошибку:

Traceback (most recent call last):
  File "VideoMixer.py", line 23, in <module>
    cv.WriteFrame(writer, cv.LoadImage(fileName))
cv.error: dst.data == dst0.data

Вот мой сценарий:

import cv
import sys

files = sys.argv[1:]

for f in files:
    capture = cv.CaptureFromFile(f)
    height = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_WIDTH)
    width = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FRAME_HEIGHT)
    fps = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FPS)
    fourcc = cv.GetCaptureProperty(capture, cv.CV_CAP_PROP_FOURCC)
    print fourcc
    writer = cv.CreateVideoWriter('ok.mov', int(fourcc),fps,(int(width),int(height)),1)
    print writer
    for i in range(30):
        frame = cv.QueryFrame(capture)
        print frame
        if frame:
            cv.WriteFrame(writer, frame)

Сохранение кадров как изображений работает нормально, поэтому я знаю, что с захватом все в порядкеЯ неправильно пишу автора?«Print fourcc» выдает 0.0, но я пробовал много значений FOUR_CC.

Спасибо!

Ответы [ 3 ]

6 голосов
/ 25 марта 2011

Есть ли у некоторых ваших кадров разные цветовые пространства или глубины?Несколько замечаний:

  • Вы поменяли высоту и ширину в своем коде, это специально?
  • Ваш fourcc должен быть целым числом> 0. Смотрите мой пример ниже.

Я не генерировал видео Quicktime с использованием OpenCV, но это помогло мне создать несжатый файл AVI.Я выбираю Fourcc I420, используя функцию cv.CV_FOURCC:

import cv
import sys

# standard RGB png file
path = 'stack.png'
cap = cv.CaptureFromFile(path)
fps = 24
width = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_WIDTH))
height = int(cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_HEIGHT))
# uncompressed YUV 4:2:0 chroma subsampled
fourcc = cv.CV_FOURCC('I','4','2','0')
writer = cv.CreateVideoWriter('out.avi', fourcc, fps, (width, height), 1)
for i in range(90):
    cv.GrabFrame(cap)
    frame = cv.RetrieveFrame(cap)
    cv.WriteFrame(writer, frame)

Обновление : снимок экрана воспроизведения VLC out.avi:

enter image description here

В режиме Quicktime:

enter image description here

5 голосов
/ 20 ноября 2012

Я пробовал различные кодеки, в том числе «MJPG» и «I420», и ни один из них не работал на моей сборке Mac OpenCV. Они создали крошечные невидимые выходные файлы без жалоб.

Затем я нашел эту страницу , в которой перечислены некоторые кодеки, которые работали для меня. Например. 'mp4v' отлично работает на моем Mac, и QuickTime может его воспроизводить.

0 голосов
/ 25 марта 2011

Этот файл в источнике OpenCV подразумевается в строке # 2598 - если это утверждение не удается: "dst.data == dst0.data"

это означает, что пункт назначенияневерный размер или тип

...