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

Python OpenCV:.imshow()与.VideoWriter()颜色不一致问题求助

解决OpenCV VideoWriter颜色异常问题

问题根源分析

你的代码中有两个核心问题导致视频颜色显示异常:

  1. VideoWriter尺寸参数顺序错误
    OpenCV的VideoWriter要求帧尺寸参数为(宽度, 高度),但你传入的是(cons.height, cons.width),和图像的(height, width, 3)形状顺序完全相反。这种尺寸不匹配会导致编码时像素排列错乱,直接引发颜色异常。

  2. 颜色通道逻辑混乱
    你初始化的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:13:17