Python中cv2.VideoWriter更改设定颜色的原因及解决方法
问题根源
- OpenCV的
VideoWriter默认要求输入帧为BGR通道顺序,而matplotlib画布输出的tostring_rgb()得到的是RGB顺序的像素数据,通道直接颠倒就会出现你碰到的颜色完全不符的问题。 - 你当前的代码把
VideoWriter初始化放在了循环内部,每生成一帧就会新建视频文件覆盖之前的内容,也会导致输出异常。 - 补充核对:你标注的
#fff300对应的实际RGB值是(255,243,0),如果你要的是(255,163,0)的色值,对应的十六进制应为#ffa300,可以先确认你实际需要的色值。
修复方案
按以下步骤修改代码即可解决问题:
- 将
VideoWriter的初始化逻辑移到循环外部,全程只创建一次视频写入对象 - 拿到matplotlib输出的RGB数据后,翻转通道顺序为BGR再传入视频写入对象
- 不需要的话可以去掉
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
相关产品推荐
相关产品推荐

