Запись видео OpenCV в файл работает, но видео пустое - PullRequest
0 голосов
/ 01 января 2019

Я использую opencv для некоторого трюка с нейронным стилем передачи, но у меня возникают проблемы с сохранением видео в файл.Файл создан, но его размер составляет всего 6 КБ.

from imutils.video import VideoStream
from imutils import paths
import itertools
import argparse
import imutils
import time
import cv2
import numpy as np

ap = argparse.ArgumentParser()
ap.add_argument("-m", "--models", required=True,
    help="path to directory containing neural style transfer models")
args = vars(ap.parse_args())


modelPaths = paths.list_files(args["models"], validExts=(".t7",))
modelPaths = sorted(list(modelPaths))


models = list(zip(range(0, len(modelPaths)), (modelPaths)))

modelIter = itertools.cycle(models)
(modelID, modelPath) = next(modelIter)


print("[INFO] loading style transfer model...")
net = cv2.dnn.readNetFromTorch(modelPath)


print("[INFO] starting video stream...")
vs = VideoStream(src=0).start()
time.sleep(2.0)
print("[INFO] {}. {}".format(modelID + 1, modelPath))



out = cv2.VideoWriter('output2.avi', cv2.VideoWriter_fourcc(*'XVID'), 5, (451, 600))
while True:

    frame = vs.read()




    frame = imutils.resize(frame, width=600)
    orig = frame.copy()
    (h, w) = frame.shape[:2]


    blob = cv2.dnn.blobFromImage(frame, 1.0, (w, h),
        (103.939, 116.779, 123.680), swapRB=False, crop=False)
    net.setInput(blob)
    output = net.forward()


    output = output.reshape((3, output.shape[2], output.shape[3]))
    output[0] += 103.939
    output[1] += 116.779
    output[2] += 123.680
    output /= 255.0
    output = output.transpose(1, 2, 0)

    out.write(np.uint8(output))

    cv2.imshow("Input", frame)
    cv2.imshow("Output", output)
    key = cv2.waitKey(1) & 0xFF

    if key == ord("n"):

        (modelID, modelPath) = next(modelIter)
        print("[INFO] {}. {}".format(modelID + 1, modelPath))
        net = cv2.dnn.readNetFromTorch(modelPath)
        print(frame.shape)

    elif key == ord("q"):
        break


cv2.destroyAllWindows()
vs.stop()

Основные вещи происходят по адресу:

out = cv2.VideoWriter('output2.avi', cv2.VideoWriter_fourcc(*'XVID'), 5, (450, 600))
output = net.forward() # which computes the neural styled output image

и чтобы сохранить вывод / кадр в файл, я сделал:

out.write(np.uint8(output))

Любые идеи о том, почемумой код не работает?Я пробовал много кодеков и комбинаций типов файлов, и я не думаю, что проблема в этом.Ребята, вы думаете, это может быть измерение?(У меня сейчас 450, 600, потому что я напечатал output.shape, и он вернул 450 600,3, так что я думаю, что 450 x 600 звучат правильно).

1 Ответ

0 голосов
/ 02 января 2019

@ Dan Mašek комментарий, вероятно, правильный.Вы можете прочитать больше об этом здесь .Для полноты вы можете исправить это следующим образом:

  1. Изменение out.write(np.uint8(output)) на out.write(np.uint8(output * 255))

или

Комментарий output /= 255.0 и изменение cv2.imshow("Output", output) на cv2.imshow("Output", output / 255.)

Вы должны выбрать решение, исходя из того, хотите ли вы, чтобы output было на (1) [0., 1.] или (2) [0, 255] диапазон.

...