使用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
相关产品推荐
相关产品推荐

