Python OpenCV:.imshow()与.VideoWriter()颜色不一致问题求助
解决OpenCV VideoWriter颜色异常问题
问题根源分析
你的代码中有两个核心问题导致视频颜色显示异常:
VideoWriter尺寸参数顺序错误
OpenCV的VideoWriter要求帧尺寸参数为(宽度, 高度),但你传入的是(cons.height, cons.width),和图像的(height, width, 3)形状顺序完全相反。这种尺寸不匹配会导致编码时像素排列错乱,直接引发颜色异常。颜色通道逻辑混乱
你初始化的image已经是BGR格式(通道0=蓝色、1=绿色、2=红色),但后续额外调用了cv2.COLOR_RGB2BGR转换。如果cons.rules中的粒子颜色是BGR格式,这步转换会把整个图像转成RGB格式;如果cons.rules是RGB格式,就会出现背景是BGR、粒子是RGB的混合状态,转换后背景颜色颠倒,叠加尺寸错误后颜色问题会更明显。
修复步骤
步骤1:修正VideoWriter尺寸参数
将初始化代码中的尺寸参数调换顺序:
output = cv2.VideoWriter('output.mp4', fourcc, cons.frame_rate, (cons.width, cons.height))
步骤2:统一颜色通道逻辑
根据cons.rules的颜色格式选择对应方案:
- 若cons.rules是BGR格式:
直接删除颜色转换语句,因为初始化的image已经是BGR格式,无需额外转换:
# 移除这行多余的转换代码 # image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
- 若cons.rules是RGB格式:
选择以下任一方式统一通道:
方案一:赋值粒子时直接转BGR
# 替换粒子赋值的代码行 rgb_color = cons.rules[cons.particles[i].id] image[int(cons.particles[i].position[1]), int(cons.particles[i].position[0])] = rgb_color[::-1] # RGB转BGR # 同时移除后续的cvtColor转换语句
方案二:统一设置为RGB后转BGR
# 初始化背景时改用RGB顺序 image[:, :, 0] = cons.r # R通道 image[:, :, 1] = cons.g # G通道 image[:, :, 2] = cons.b # B通道 # 统一转换为BGR供显示和写入 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
额外验证点
- 测试编解码器时必须保证尺寸参数正确,之前的格式测试可能因尺寸错误导致问题未解决。
- 检查
cons.b、cons.g、cons.r的值是否对应正确的通道,避免背景颜色本身设置错误。
内容的提问来源于stack exchange,提问作者Bastien Aeby
相关产品推荐
相关产品推荐

