You need to enable JavaScript to run this app. Python中cv2.VideoWriter更改设定颜色的原因及解决方法
优惠活动
大模型
产品
解决方案
定价
更多

Python中cv2.VideoWriter更改设定颜色的原因及解决方法

问题根源

  • OpenCV的VideoWriter默认要求输入帧为BGR通道顺序,而matplotlib画布输出的tostring_rgb()得到的是RGB顺序的像素数据,通道直接颠倒就会出现你碰到的颜色完全不符的问题。
  • 你当前的代码把VideoWriter初始化放在了循环内部,每生成一帧就会新建视频文件覆盖之前的内容,也会导致输出异常。
  • 补充核对:你标注的#fff300对应的实际RGB值是(255,243,0),如果你要的是(255,163,0)的色值,对应的十六进制应为#ffa300,可以先确认你实际需要的色值。

修复方案

按以下步骤修改代码即可解决问题:

  1. 将VideoWriter的初始化逻辑移到循环外部,全程只创建一次视频写入对象
  2. 拿到matplotlib输出的RGB数据后,翻转通道顺序为BGR再传入视频写入对象
  3. 不需要的话可以去掉plt.show()避免每次循环弹出绘图窗口

修正后的完整代码

import matplotlib.pyplot as plt
import numpy as np
from cv2 import VideoWriter, VideoWriter_fourcc


pixels = 600
my_dpi = 100
FPS = 1

# 视频写入对象初始化移到循环外
fourcc = VideoWriter_fourcc(*'MP42')
video = VideoWriter('1.mp4', fourcc, FPS, (pixels, pixels))

for i in range(5):
    fig = plt.figure(5, figsize=(pixels/my_dpi, pixels/my_dpi), facecolor='k', dpi=my_dpi)  
    plt.axes([0,0,1,1])
    # 这里如果需要(255,163,0)就把fc改成'#ffa300'
    rectangle = plt.Rectangle((-300, -300), 600, 600, fc='#fff300')
    plt.gca().add_patch(rectangle)
    plt.axis('off') # 可选,隐藏坐标轴避免多余内容
    plt.savefig('1.png', dpi=my_dpi)
    # plt.show() 不需要可以注释掉
    
    fig.canvas.draw()  # draw the figure 
       
    data = np.frombuffer(fig.canvas.tostring_rgb(), dtype=np.uint8)
    data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) 
    # 新增:RGB转BGR
    data = data[..., ::-1]
    
    video.write(data)
    plt.close() # 每次循环关闭画布避免内存溢出

video.release()

如果后续还有轻微色值偏差,可将编码格式换成无损编码fourcc = VideoWriter_fourcc(*'FFV1'),避免有损压缩带来的色值损耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 10:12:00