Написание видео с OpenCV + Python + Mac

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

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.

Спасибо!


person rgbrgb    schedule 24.03.2011    source источник


Ответы (3)


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

  • Вы поменяли местами высоту и ширину в своем коде, это специально?
  • Ваш 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:

введите здесь описание изображения

В Quicktime:

введите здесь описание изображения

person samplebias    schedule 25.03.2011
comment
Большое спасибо, но вы можете воспроизвести out.avi? Сценарий работает нормально для меня и создает файл, но VLC выдает мне ошибку, когда я пытаюсь его воспроизвести: ошибка ps: невозможно просмотреть основную отладку: модуль демультиплексора, соответствующий avi, не может быть загружен основной отладкой: TIMER module_need(): 303,765 мс - Всего 303,765 мс / 1 intvls (в среднем 303,765 мс) основная ошибка: нет подходящего модуля демультиплексора для `file/:///Users/***/Documents/Code/Video/out.avi' - person rgbrgb; 25.03.2011
comment
Я могу воспроизвести файл, я использую последнюю версию VLC на Mac. Я обновлю свой ответ скриншотом. - person samplebias; 25.03.2011
comment
Я также смог открыть и воспроизвести файл out.avi с помощью AviDemux и Quicktime. - person samplebias; 25.03.2011
comment
Хм, тоже не смог заставить AviDemux работать. Я думаю, что out.avi поврежден, потому что файл весит 8 КБ, независимо от того, сколько кадров я пытаюсь сделать. Вы используете Quicktime или ffmpeg? Я использую quicktime, так что, возможно, это проблема. В очередной раз благодарим за помощь. - person rgbrgb; 26.03.2011

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

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

person mtoossi    schedule 20.11.2012
comment
@mtoosi, под каким расширением вы сохранили файл? Я попробовал codec = cv.CV_FOURCC('M','P','4','V') и сохранил файл как /full/path/to/file/out.mp4v, который создал действительный файл, но не тот, который открывается в QuickTime или VLC. - person cooncesean; 06.12.2012
comment
@cooncesean, я использовал .avi в качестве расширения файла во всех случаях IIRC. Кроме того, я работал на OS X 10.8 и сам собрал OpenCV 2.4.3 со всеми флагами по умолчанию и без установленных в системе сторонних библиотек. - person mtoossi; 06.12.2012
comment
К вашему сведению, я работаю в OS X 10.11 с OpenCV 2.4.13.2, и мне удалось заставить это работать с cv2.cv.CV_FOURCC('M','P','4','V') и именем выходного файла с расширением .avi. Расширение .mp4 создало видео с одним кадром и без движения. - person trianta2; 07.04.2017
comment
С OpenCV 4.1.0 в OS X 10.14.5 у меня работал cv2.VideoWriter_fourcc(*"MP4V"), но только если я сделал файл .mp4. Если бы я попробовал .avi, QuickTime не воспроизвел бы его. - person Nathan; 12.07.2019

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

это означает, что размер или тип назначения был неправильным

person lunixbochs    schedule 25.03.2011