首页 > 解决方案 > 使用 openCV 保存的视频不显示任何内容

问题描述

我有一组二进制图像,1 或 0。为了提供更多上下文,这些图像是蒙版,因此图像大部分是黑色的,并且显示了一些白点。每张图像都是一个序列的一部分,我想将序列保存为视频,以查看斑点的演变过程。现在我只有很少的图像,在 7 或 20 之间,我有以下代码:

# predictedMasks is a list containing each mask that I want to see in the video
videoName = sequenceName + '.avi'
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
fps = 1
frame_width = np.size(predictedMasks[0], 1)
frame_height = np.size(predictedMasks[0], 0)
incolor = False
out = cv2.VideoWriter(videoName, fourcc, fps, (frame_width, frame_height), incolor)
for mask in predictedMasks:
    out.write(mask)
out.release()

现在,当我尝试从我的文件夹中打开视频时,它什么也没有显示,只有一个黑屏,尽管它应该显示我所理解的白点。我正在使用 Windows 10,我还尝试使用以下方法更改编解码器:

videoName = sequenceName + '.mp4'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')

这导致了同样的问题。有什么我做错了吗?

编辑:

感谢下面的答案,我发现问题在于我必须将布尔值更改为“uint8”,然后将图像中的所有 1 更改为 255!编辑后的代码如下所示:

   out = cv2.VideoWriter(videoName, fourcc, fps, (frame_width, frame_height), incolor)
    for mask in predictedMasks:
        mask = mask.astype('uint8')
        mask = np.where(mask == 1, 255, mask)
        out.write(mask)
    out.release()

标签: pythonnumpyopencvvideo

解决方案


我用一些示例数据值(帧)尝试了您的代码,并且效果很好。它在视频中相应地显示帧:

# sample values
data = np.array([[255,0,255,0],[255,0,255,0],[255,0,255,0]])
sequenceName = "test"

videoName = sequenceName + '.avi'
fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
fps = 1
frame_width = np.size(data, 1)
frame_height = np.size(data, 0)
incolor = False
out = cv2.VideoWriter(videoName, fourcc, fps, (frame_width, frame_height), incolor)
for i in range(100): # for 100 frames
    out.write(np.uint8(data))
out.release()

如果您也分享您预测的掩码,我们也许能够清楚地检测到问题。


推荐阅读