OpenCV записывает фрейм в файл python

Эй, я начинаю играть с OpenCV, и я не могу сохранить выходные данные своей веб-камеры в файл. Вот что у меня есть. Это работает нормально, запускает веб-камеру и создает "output.avi". Проблема заключается в том, что output.avi крошечный (414 байт) и точно такие же байты при каждом запуске программы. Я предполагаю, что проблема в кодировке fourcc, но я не смог найти то, что работает в моем случае. Я работаю на Mac OS X. Дайте мне знать, если вам нужна дополнительная информация.

import numpy as np
import cv2

path = ('/full/path/Directory/output.avi')

cap = cv2.VideoCapture(0)
cap.set(1, 20.0) #Match fps
cap.set(3,640)   #Match width
cap.set(4,480)   #Match height

fourcc = cv2.cv.CV_FOURCC(*'XVID')
video_writer = cv2.VideoWriter(path,fourcc, 20.0, (640,480))

while(cap.isOpened()):
    #read the frame
    ret, frame = cap.read()
    if ret==True:
        #show the frame
        cv2.imshow('frame',frame)
        #Write the frame
        video_writer.write(frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
video_writer.release()
cv2.destroyAllWindows()

3 ответа

Решение

Просто нужно поменять

fourcc = cv2.cv.CV_FOURCC(*'XVID')

в

fourcc = cv2.cv.CV_FOURCC('m', 'p', '4', 'v')

Нашел ответ здесь: opencv VideoWriter под OSX не производит вывод

Основная проблема в том, что вы не программируете безопасно:

path = ('/full/path/Directory/output.avi')

cap = cv2.VideoCapture(0)
if not cap:
    print "!!! Failed VideoCapture: invalid parameter!"
    sys.exit(1)

cap.set(1, 20.0) #Match fps
cap.set(3,640)   #Match width
cap.set(4,480)   #Match height

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')

video_writer = cv2.VideoWriter(path, fourcc, 20.0, (640,480))
if not video_writer :
    print "!!! Failed VideoWriter: invalid parameters"
    sys.exit(1)

# ...

Так когда VideoCapture() или же VideoWriter() не удается, программа сразу знает, что это не может продолжаться.

Кроме того, обратите внимание, как наследие cv2.cv.CV_FOURCC() вызов заменяется cv2.VideoWriter_fourcc(), Я сделал это, потому что на этой странице показаны последние примеры того, как делать это с Python. Вы также можете попробовать все коды FourCC, пока не найдете тот, который работает в вашей системе.

Еще одна важная вещь, которую нужно понять, это то, что установка размера кадра интерфейса захвата может не работать просто потому, что камера может не поддерживать это разрешение. То же самое можно сказать и о FPS. Почему это проблема? Поскольку нам нужно определить эти настройки в VideoWriter конструктор, все фреймы, отправляемые этому объекту, должны иметь точное измерение, иначе автор не сможет записать фреймы в файл.

Вот как вы должны это сделать:

path = ('/full/path/Directory/output.avi')

cap = cv2.VideoCapture(0)
if not cap:
    print "!!! Failed VideoCapture: invalid parameter!"
    sys.exit(1)

# The following might fail if the device doesn't support these values
cap.set(1, 20.0) #Match fps
cap.set(3,640)   #Match width
cap.set(4,480)   #Match height

# So it's always safer to retrieve it afterwards
fps = cap.get(CV_CAP_PROP_FPS)
w = cap.get(CV_CAP_PROP_FRAME_WIDTH);
h = cap.get(CV_CAP_PROP_FRAME_HEIGHT);

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')

video_writer = cv2.VideoWriter(path, fourcc, fps, (w, h))
if not video_writer :
    print "!!! Failed VideoWriter: invalid parameters"
    sys.exit(1)

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

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

cap.release()
video_writer.release()

Организуйте свой код в класс и разделите понятные функции, найдите несколько функций для сохранения результатов в API OpenCV, попробуйте другие форматы и запустите свой код на нескольких ОС.

Вы также можете обратиться к C++ или Java/C# с OpenCV

Я полагаю, что в книге о компьютерных злоумышленниках есть глава о вашей проблеме http://www.amazon.com/s/ref=nb_sb_noss_1?url=search-alias%3Dstripbooks&field-keywords=Cassandra%20NoSQL#/ref=nb_sb_noss_2?url= поиск-псевдоним% 3Dstripbooks и поля ключевых слов = питон + компьютер + зрение + открытые + резюме и отны = п%3A283155%2Ck%3Apython+ компьютер + зрение + открытый + резюме

Это все, что я мог, чтобы помочь тебе

Другие вопросы по тегам