【问题标题】:OpenCV VideoWriter writes an empty videoOpenCV VideoWriter 写入一个空视频
【发布时间】:2020-11-23 09:35:43
【问题描述】:
import cv2
import numpy as np
import time
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')


img = np.zeros((640,480))

center_x = 0
center_y = 256

videoFile1 = 'D:/Python/6. Const_Speed/sample1.mp4'

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (640, 480))

while True:
    img = np.zeros((640, 480))
    img = cv2.circle(img, (center_x, center_y), 20, 120, -1)

    cv2.imshow('img', img)
    out.write(img)

    center_x += 3
    time.sleep(1/30)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

out.release()
cv2.destroyAllWindows()

我想录制一个圆圈从屏幕左侧匀速移动到右侧的视频。上面的代码运行没有错误,但是结果视频是空的,只有黑屏。

我尝试了什么

  1. 我发现如果尺寸不同,视频不写。所以我将尺寸匹配为 (640,480)
  2. 我尝试将编解码器从 XVID 更改为不同的编解码器。最后,我发现 'XVID' 编解码器适用于 .avi 文件,所以我决定保留它。

【问题讨论】:

  • 为什么要定义videoFile1变量?
  • @Ahx 我调试的时候改了。原来VideoWriter的第一个变量是videoFile1。

标签: opencv


【解决方案1】:

您的代码存在三个问题。

问题#1


  • 如果你要创建.avi,我建议你使用MJPG

    • fourcc = cv2.VideoWriter_fourcc(*'MJPG')

问题#2

  • 你需要仔细定义VideoWriter

    • 定义大小时,应该是frame_widthframe_height

    • 例如,如果要创建大小为(640, 480) 的视频,则需要将VideoWriter 初始化为(480, 640)

    • out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (480, 640))
      
    • 另外,您正计划创建一个灰度视频,因此您需要将isColor 初始化为False

    • out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (480, 640), isColor=False)
      

问题#3:


  • 如果要创建黑色图像,则需要定义其类型:

    • while True:
          img = np.zeros((640, 480), dtype=np.uint8)
      

如果你解决了问题,结果将是:

代码:


import cv2
import numpy as np
import time
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')


img = np.zeros((640, 480))

center_x = 0
center_y = 256

videoFile1 = 'video.mp4'

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (480, 640), isColor=False)

while True:
    img = np.zeros((640, 480), dtype=np.uint8)
    img = cv2.circle(img, (center_x, center_y), 20, 120, -1)

    cv2.imshow('img', img)
    out.write(img)

    center_x += 3
    time.sleep(1/30)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

out.release()
cv2.destroyAllWindows()

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 2020-06-04
    • 2019-07-11
    • 2013-08-05
    • 2021-01-02
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2014-09-12
    相关资源
    最近更新 更多