您可以使用imread的index kwarg 获取特定帧:
import imageio.v3 as iio
import numpy as np
index = [1,2,3,4,5,6,7,8]
img_list = []
for idx in index:
img_list.append(iio.imread("imageio:cockatoo.mp4", index=idx))
img_array = np.stack(img_list)
如果您想要更高的性能,您可以使用pyav 作为后端,而不是默认的imageio-ffmpeg。
import imageio.v3 as iio
import numpy as np
index = [1,2,3,4,5,6,7,8]
img_list = []
for idx in index:
img_list.append(iio.imread("imageio:cockatoo.mp4", index=idx, plugin="pyav"))
img_array = np.stack(img_list)
计时(每次重复 10 次):
>>> timeit.timeit('[iio.imread("imageio:cockatoo.mp4", index=idx) for idx in index]', setup="from __main__ import index, iio", number=10)
9.865169799999876
>>> timeit.timeit('[iio.imread("imageio:cockatoo.mp4", index=idx, plugin="pyav") for idx in index]', setup="from __main__ import index, iio", number=10)
2.250104900000224
这个,ofc,有每次重新打开文件的缺点,你可以避免使用imopen:
import imageio.v3 as iio
import numpy as np
index = [1,2,3,4,5,6,7,8]
with iio.imopen("imageio:cockatoo.mp4", "r") as img_file:
img_list = [img_file.read(index=idx) for idx in index]
img_array = np.stack(img_list)
不幸的是,imopen 路由目前不适用于 pyav,因为我在编写插件时错过了一个错误。不过,既然我现在知道了,我应该可以在接下来的几天里写一个修复:)
编辑:该错误现在有一个 PR 可以解决该问题。合并发布后,还可以使用
import imageio.v3 as iio
import numpy as np
index = [1,2,3,4,5,6,7,8]
with iio.imopen("imageio:cockatoo.mp4", "r", plugin="pyav") as img_file:
img_list = [img_file.read(index=idx) for idx in index]
img_array = np.stack(img_list)