Писане на видео с 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 файл. Избирам I420 fourcc с помощта на функцията 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 грешка: не мога да надникна main debug: не може да се зареди demux модул, съответстващ на avi main debug: TIMER module_need() : 303.765 ms - Общо 303,765 ms / 1 intvl (ср. 303,765 ms) основна грешка: няма подходящ demux модул за `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 е повреден, защото файлът е 8kb, без значение колко кадъра се опитвам да направя. Използвате ли 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