You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV保存二进制掩码序列视频出现黑屏的问题排查

解决OpenCV保存二进制掩码视频黑屏的问题

我之前也碰到过一模一样的问题!你遇到的黑屏情况,核心原因是掩码的数据类型和像素值不符合OpenCV VideoWriter的要求,我们来具体拆解:

问题根源

你的二进制掩码应该是布尔类型或者值仅为0/1的数组,但OpenCV的VideoWriter在处理帧时,默认期望的是8位无符号整数(uint8)格式的图像,而且标准的白色像素值是255,不是1。当你直接写入值为1的数组时,这个值在8位灰度图里几乎等同于黑色,所以播放视频时自然看不到白色区域。

修正后的完整代码

你已经找到了解决方案,这里再把完整的可运行代码整理一下,方便参考:

import cv2
import numpy as np

# 假设predictedMasks是你的掩码列表,sequenceName是自定义的序列名称
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  # 单通道灰度图,所以设为False

out = cv2.VideoWriter(videoName, fourcc, fps, (frame_width, frame_height), incolor)
for mask in predictedMasks:
    # 关键步骤1:转换为uint8类型,匹配OpenCV帧格式要求
    mask = mask.astype('uint8')
    # 关键步骤2:将1替换为255,让白色区域正常显示
    mask = np.where(mask == 1, 255, mask)
    # 也可以用更简洁的写法:mask = mask * 255(如果掩码原本就是0/1的数值型数组)
    out.write(mask)
out.release()

额外实用提示

  • 如果你的掩码已经是uint8类型,只是值为0/1,直接用mask = mask * 255就能完成转换,比np.where更高效。
  • 一定要确认incolor参数:因为你的掩码是单通道灰度图,所以必须设为False,如果误设为True,会因为通道数不匹配导致视频无法正常生成。
  • 编码格式方面,XVID(.avi)和mp4v(.mp4)都是Windows 10下兼容的格式,只要帧格式正确,两种编码都能正常工作。

内容的提问来源于stack exchange,提问作者BizarroJr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:12:30