使用Dask逐帧读取视频文件?

时间:2020-09-17 22:31:24

标签: dask dask-distributed

我想知道Dask是否是处理视频文件的好工具。在本地,我正在使用OpenCV一次读取每一帧并进行处理。我认为,如果每个视频帧都由单独的Dask任务处理,那将是理想的选择。另外,对于多个时间同步的视频文件,我想知道如何一次从每个摄像机读取一帧并在一个任务中处理两个摄像机的帧。

我不认为Dask支持生成器功能,但是如果以某种方式实现,我认为那将是理想的。生成器任务可以一次在任务图中生成一帧视频。

这是一个示例脚本,与我正在执行的操作类似。它从多个视频文件中的每一个获取一帧,裁剪并调整每个文件的大小为标准尺寸,然后将它们聚合为一个视频。在此示例中,我使用固定的[0:512,0:512]裁剪,但是在实际脚本中,这会因相机和帧而异。

import glob

import cv2
import progressbar
import numpy as np

video_files = {f[0]: f for f in glob.glob('*.MOV')}

in_videos = {}
for letter, in_video_filename in video_files.items():
    in_videos[letter] = cv2.VideoCapture(in_video_filename)

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter('video.mp4', fourcc, 120, (256, 256 * len(in_videos)))

for frame_id in progressbar.progressbar(range(18000)):
    image = np.zeros((256 * len(in_videos), 256, 3), dtype=np.uint8)
    for i, (letter, in_video) in enumerate(in_videos.items()):
        success, in_image = in_video.read()
        image[i * 256:(i + 1) * 256, :, :] = cv2.resize(in_image[0:512, 0:512], (256, 256))

    video.write(image)

1 个答案:

答案 0 :(得分:0)

我的猜测是您正在寻找Dask DelayedDask Futures