如何写入无插值的原始灰度视频?解决视频输出模糊问题
问题描述
我有形状为(30,30)的灰度图像numpy数组,使用以下代码写入视频时:cv2.VideoWriter(name + '.avi', cv2.VideoWriter_fourcc(*'FFV1'), fps=24, (30, 30), False)
或skvideo.io.FFmpegWriter("test.avi", outputdict={'-vcodec': 'libx264', '-crf': '0','-preset':'veryslow'})
原本通过plt.imshow()显示的原始图像,在生成的AVI视频中用VLC打开后出现插值模糊。我希望生成的视频完全无插值效果,已知cv2.INTER_NEAREST这类resize方法不适用。请问如何将原始图像写入视频格式?VLC播放器是否会影响视频显示?
解决方案
一、确保视频写入时无信息损失
- 检查图像数据类型:OpenCV和FFmpeg都要求输入帧为**8位无符号整数(uint8)**的单通道灰度图。如果你的numpy数组是float类型(比如0-1范围),先转换为uint8:
import numpy as np # 假设img是0-1范围的float数组 img = (img * 255).astype(np.uint8) - 强化写入参数的准确性:
- 使用OpenCV的
VideoWriter时,确认帧尺寸参数(30,30)和数组形状完全匹配(正方形尺寸无需担心宽高顺序问题)。 - 使用
skvideo.io.FFmpegWriter时,在outputdict中明确指定帧尺寸,避免自动推断出错:outputdict = { '-vcodec': 'libx264', '-crf': '0', '-preset': 'veryslow', '-s': '30x30' # 强制指定帧尺寸 }
-crf 0的libx264都是无损编码,只要参数匹配,写入的视频会完整保留原始像素信息。 - 使用OpenCV的
二、VLC播放器的显示问题
你看到的模糊大概率是VLC自动缩放导致的,不是视频本身的问题:
- 临时调整:右键视频画面→「视频」→「缩放」→选择「原始尺寸」,或按快捷键
Z切换到原始大小,此时会显示无插值的原始像素。 - 永久设置:打开VLC的「工具」→「偏好设置」→「视频」→找到「缩放」选项,设置为「原始尺寸」,以后打开小尺寸视频会默认以原始大小显示。
内容的提问来源于stack exchange,提问作者chicly
相关产品推荐
相关产品推荐

