Aak*_*mar 4 python arrays opencv numpy converters
将视频文件转换为 NumPy 数组的程序,反之亦然。我搜索了很多搜索引擎但未能找到答案。
人们为此使用了多个库(即,,,PyAV);我个人经常使用Python OpenCV(主要是使用PyTorch,但原理类似),所以我会谈谈我的经验。您可以使用将视频文件加载到数组中;理论上,您也可以将其写回,但实际上,我很难让它在我自己的项目中发挥作用。decordopencvcv2.VideoCapturenumpycv2.VideoWriter
tl;dr: 创建一个cv2.VideoCapture包装器;从视频中迭代加载图像(即帧)。
frames = []
path = "/path/to/my/video/file.mp4"
cap = cv2.VideoCapture(path)
ret = True
while ret:
ret, img = cap.read() # read one frame from the 'capture' object; img is (H, W, C)
if ret:
frames.append(img)
video = np.stack(frames, axis=0) # dimensions (T, H, W, C)
Run Code Online (Sandbox Code Playgroud)
请注意,图像将以 BGR 通道格式返回,而不是更常见的 RGB;如果您需要将其转换为 RGB 色彩空间,img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)就足够了。
理论上,我见过的使用cv2.VideoWritergo 的例子是这样的
# let `video` be an array with dimensionality (T, H, W, C)
num_frames, height, width, _ = video.shape
filename = "/path/where/video/will/be/saved.mp4"
codec_id = "mp4v" # ID for a video codec.
fourcc = cv2.VideoWriter_fourcc(*codec_id)
out = cv2.VideoWriter(filename, fourcc=fourcc, fps=20, frameSize=(width, height))
for frame in np.split(video, num_frames, axis=0):
out.write(frame)
Run Code Online (Sandbox Code Playgroud)
您还可以将帧保存到临时图像(存在许多np.ndarray-> 图像管道;我个人使用 Pillow),然后使用ffmpeg(命令行实用程序)将帧编码到视频文件中。但这会占用更多的空间,当我需要检查视频阵列的各个帧时,我会使用此方法(在这种情况下,我使用ffmpeg,但这是一个不同的对话)。
另一方面,您可能希望codec_id根据您想要对视频进行编码的方式来更改变量(如果这对您来说没有任何意义,请不要担心 - 它可能对您的应用程序来说并不重要);这只是一个四字节代码,用于标识用于生成视频的视频编解码器(请参阅此页;可用性可能因平台而异(。据我所知,H.264 是当今最常用的一种,由代码“给出”) H264”或“X264”,但我很难让它与 OpenCV 一起使用(更多详细信息请参见此处);但是,该方法可以从命令行array -> images -> video file无缝运行。ffmpeg