我想知道 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)