Запись видео с использованием opencv, но выходной файл не воспроизводится - PullRequest
1 голос
/ 12 марта 2019

Я хочу записать видеофайл, используя два видео рядом, но в конце выходной файл не воспроизводится ни в одном видеопроигрывателе.Это мой код:

from __future__ import print_function
import numpy as np
import argparse
import cv2
import tkinter as tk
from tkinter import filedialog
import os
import os.path

ap = argparse.ArgumentParser()
ap.add_argument("-o", "--output", type=str, default="sample.avi",
            help="path to output video file")
ap.add_argument("-f", "--fps", type=int, default=100.0,
            help="FPS of output video")
ap.add_argument("-c", "--codec", type=str, default="MJPG",
            help="codec of output video")
args = vars(ap.parse_args())

root = tk.Tk()
root.withdraw()

source_video = filedialog.askopenfilename(title="Select file")
sign = filedialog.askopenfilename(title="Select file")
print("[INFO] Capturing video...")
cap1 = cv2.VideoCapture(source_video)
cap2 = cv2.VideoCapture(sign)

fourcc = cv2.VideoWriter_fourcc(*args["codec"])
writer = None
(h, w) = (None, None)
zeros = None
i = 0 
try:
    while cap1.isOpened():
        ret, frame1 = cap1.read()
        if ret:
            frame1 = cv2.resize(frame1, (0, 0), fx=0.5, fy=0.5)
            (h, w) = frame1.shape[:2]

            ret, frame2 = cap2.read()
            if ret:
                frame2 = cv2.resize(frame2, (w, h))

        else:
            break

        if writer is None:
            writer = cv2.VideoWriter(args["output"], fourcc, args["fps"], 
(h, w*2), True)
            zeros = np.zeros((h, w*2), dtype="uint8")
        output = np.zeros((h, w*2, 3), dtype="uint8")

        if frame2 is None:
            output[0:h, 0:w] = frame1
            writer.write(output)
        else:
            output[0:h, 0:w] = frame1
            output[0:h, w:w * 2] = frame2
            writer.write(output)

        cv2.imshow('output', output)
        if cv2.waitKey(25) & 0xFF == ord('q'):
            break

    writer.release()
    cv2.destroyAllWindows()


except Exception as e:
        print(str(e))

Я не получаю никаких ошибок, все идет хорошо, но когда я пытаюсь воспроизвести выходной видеофайл из каталога, он не будет воспроизводиться.Я также проверяю размер файла, который составляет около 16 КБ.Я не знаю, где проблема существует.Помогите мне, пожалуйста.Я использую: Windows 10 64-битный Python3.7 Pycharm как IDE

1 Ответ

1 голос
/ 13 марта 2019

Параметр frameSize для VideoWriter - это (ширина, высота), который несколько скрыт в документах (например, здесь ). Так что в вашем коде это должно быть

writer = cv2.VideoWriter(args["output"], fourcc, args["fps"], (w*2, h), True)

После этого исправления ваш код создал рабочие видео для меня.

Я заметил, что ваш код "узнает" размер кадра из входного видео, но не частоту кадров, но я предполагаю, что это преднамеренно.

...