Python OpenCV视频写入文件工作正常,但视频为空

Python OpenCV视频写入文件工作正常,但视频为空,python,opencv,conv-neural-network,codec,Python,Opencv,Conv Neural Network,Codec,我正在使用opencv进行一些神经风格的传输技巧,但我在将视频保存到文件时遇到了问题。该文件已创建,但只有6KB大 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

我正在使用opencv进行一些神经风格的传输技巧,但我在将视频保存到文件时遇到了问题。该文件已创建,但只有6KB大

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))
你知道为什么我的代码不起作用吗?我尝试过许多编解码器和文件类型的组合,但我不认为存在问题。你们认为这可能是维度吗?(我现在有450600,因为我打印了output.shape,它返回了450600,3,所以我认为450x600听起来不错)

的评论可能是正确的。你可以阅读更多关于它的内容。为确保完整性,您可以通过以下方式进行修复:

  • out.write(np.uint8(输出))
    更改为
    out.write(np.uint8(输出*255))
  • 注释
    output/=255.0
    并将
    cv2.imshow(“output”,output)
    更改为
    cv2.imshow(“output”,output/255)。
  • 您应该根据是否希望
    输出位于(1)
    [0,1.]
    或(2)
    [0255]
    范围来选择解决方案。

    的注释可能是正确的。你可以阅读更多关于它的内容。为确保完整性,您可以通过以下方式进行修复:

  • out.write(np.uint8(输出))
    更改为
    out.write(np.uint8(输出*255))
  • 注释
    output/=255.0
    并将
    cv2.imshow(“output”,output)
    更改为
    cv2.imshow(“output”,output/255)。

  • 您应该根据是否希望
    output
    位于(1)
    [0,1.]
    或(2)
    [0255]
    范围来选择解决方案。

    如果您将
    np.uint8(output)
    写入视频,那么您应该
    imshow
    同样的内容。我看到
    output/=255.0
    ,所以我猜输出是一个浮点数组,其值在[0.0,1.0]范围内。将其转换为
    uint8
    将使其仅为0和1。但是,
    imshow
    (根据文档)会将浮点图像转换并缩放回0-255范围。@DanMašek是正确的。你可以阅读更多关于他所描述的内容。确保你的应用程序可以访问opencv\u ffmpeg dll(或共享库?),如果你在视频中写入
    np.uint8(输出)
    ,那么你应该
    imshow
    同样的内容。我看到
    output/=255.0
    ,所以我猜输出是一个浮点数组,其值在[0.0,1.0]范围内。将其转换为
    uint8
    将使其仅为0和1。但是,
    imshow
    (根据文档)会将浮点图像转换并缩放回0-255范围。@DanMašek是正确的。你可以阅读更多关于他所描述的内容。确保你的应用程序可以访问opencv_ffmpeg dll(或共享库?),因为
    output
    仅用于编写视频或显示图像,我想说,在显示的代码中,缩放是绝对无用的。因此,我建议采用方法3——抛弃
    输出/=255.0
    ,用
    输出=np.uint8(输出)
    替换它。然后,您可以将相同的图像传递给
    write
    imshow
    (我假设显示和写入图像的原因是能够准确地看到您所写的内容)。不管怎样,+1感谢你写了一个答案,尽管OP不愿意回复…很抱歉,我没有看到这个回复。明天早上我第一件事就是试用它。因为
    输出
    只用于编写视频或显示图像,所以在显示的代码中,缩放绝对没有用。因此,我建议采用方法3——抛弃
    输出/=255.0
    ,用
    输出=np.uint8(输出)
    替换它。然后,您可以将相同的图像传递给
    write
    imshow
    (我假设显示和写入图像的原因是能够准确地看到您所写的内容)。不管怎样,+1感谢你写了一个答案,尽管OP不愿意回复…很抱歉,我没有看到这个回复。明天早上我第一件事就是试试。