Python 3 OpenCV не может записывать и сохранять видео - PullRequest
1 голос
/ 18 марта 2020

Я использую cv2 версии 4.2.0, я пытаюсь записать и сохранить видео, но получаю ошибку.

Код

import numpy as np
import os
import cv2


filename = 'myvid.avi'
frames_per_second = 24.0
res = '720p'

def change_res(cap, width, height):
    cap.set(3, width)
    cap.set(4, height)

STD_DIMENSIONS =  {
    "480p": (640, 480),
    "720p": (1280, 720),
    "1080p": (1920, 1080),
    "4k": (3840, 2160),
}

def get_dims(cap, res='1080p'):
    width, height = STD_DIMENSIONS["480p"]
    if res in STD_DIMENSIONS:
        width,height = STD_DIMENSIONS[res]
    ## change the current caputre device
    ## to the resulting resolution
    change_res(cap, width, height)
    return width, height

VIDEO_TYPE = {
    'avi': cv2.VideoWriter_fourcc(*'XVID'),
    #'mp4': cv2.VideoWriter_fourcc(*'H264'),
    'mp4': cv2.VideoWriter_fourcc(*'XVID'),
}

def get_video_type(filename):
    filename, ext = os.path.splitext(filename)
    if ext in VIDEO_TYPE:
      return  VIDEO_TYPE[ext]
    return VIDEO_TYPE['avi']



cap = cv2.VideoCapture(0)
out = cv2.VideoWriter(filename, get_video_type(filename), 25, get_dims(cap, res))

while True:
    ret, frame = cap.read()
    out.write(frame)
    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


cap.release()
out.release()
cv2.destroyAllWindows()

Ошибка

cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\highgui\src\window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'

[ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback

Я попытался добавить полный каталог, как указано в других ответах, но это тоже не помогло и показывает ту же ошибку. Я слежу за видеоуроком, и тот же код, кажется, отлично работает для инструктора.

1 Ответ

0 голосов
/ 18 марта 2020

Вы используете cv2.VideoCapture(0) для захвата видео с камеры , код, вероятно, не работает, потому что у вас нет подключенной камеры.

Если у вас есть подключенная камера, существуют другие причины, по которым код может не работать.
Если у вас нет камеры, вы можете загрузить и установить приложение виртуальной камеры (которое захватывает экран для пример).

Предлагаю сначала попробовать прочитать видео из файла.

Пример кода ниже:

  • Генерирует синтезированный c видеофайл (сборка входного видеофайла).
    Целью генерации синтезированного c видео является создание " "автономный" пример.
  • Считывание видеокадров из сгенерированного файла и запись кадров в выходной видеофайл.
    Разрешение входного и выходного видео одинаковое.

Вот код:

import numpy as np
import cv2
import os

intput_filename = 'input_vid.avi'

# Generate synthetic video to be used as input:
###############################################################################
width  = 640
height = 480

n_frames = 250

# Use motion JPEG codec (for testing)
synthetic_out = cv2.VideoWriter(intput_filename, cv2.VideoWriter_fourcc(*'MJPG'), 25, (width, height))

for i in range(n_frames):
    img = np.full((height, width, 3), 60, np.uint8)
    cv2.putText(img, str(i), (width//2-100*len(str(i)), height//2+100), cv2.FONT_HERSHEY_DUPLEX, 10, (30, 255, 30), 20)
    #cv2.imshow('img',img)
    #cv2.waitKey(100)
    synthetic_out.write(img)

synthetic_out.release()
###############################################################################



filename = 'myvid.avi'
frames_per_second = 24.0
res = '720p'

def change_res(cap, width, height):
    cap.set(3, width)
    cap.set(4, height)

STD_DIMENSIONS =  {
    "480p": (640, 480),
    "720p": (1280, 720),
    "1080p": (1920, 1080),
    "4k": (3840, 2160),
}

def get_dims(cap, res='1080p'):
    width, height = STD_DIMENSIONS["480p"]
    if res in STD_DIMENSIONS:
        width,height = STD_DIMENSIONS[res]
    ## change the current capture device
    ## to the resulting resolution
    change_res(cap, width, height)
    return width, height

VIDEO_TYPE = {
    'avi': cv2.VideoWriter_fourcc(*'XVID'),
    #'mp4': cv2.VideoWriter_fourcc(*'H264'),
    'mp4': cv2.VideoWriter_fourcc(*'mp4v'),
}

def get_video_type(filename):
    filename, ext = os.path.splitext(filename)
    if ext in VIDEO_TYPE:
      return  VIDEO_TYPE[ext]
    return VIDEO_TYPE['avi']


# Read video from file instead of from camera.
cap = cv2.VideoCapture(intput_filename)
#cap = cv2.VideoCapture(0)

fourcc = get_video_type(filename)

# Get resolution of input video
width  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))


# out = cv2.VideoWriter(filename, get_video_type(filename), 25, get_dims(cap, res))

# The second argument of VideoWriter is FOURCC code
# Set the size of the output video to be same as the input (get_dims is not working).
out = cv2.VideoWriter(filename, fourcc, frames_per_second, (width, height))

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

    if not ret:
        # Break loop if ret is False
        break;

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

cap.release()
out.release()
cv2.destroyAllWindows()

Пожалуйста, дайте мне знать, если пример работает или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...