繁体   English   中英

如何使用`imageio`在视频中寻找帧?

[英]How to seek a frame in video using `imageio`?

我有一个视频,我想只从视频中提取特定的帧。

目前我做的是:

index = [1,2,3,4,5,6,7,8]
img_list = []
for i, frame in enumerate(iio.imiter("imageio:cockatoo.mp4")):
    if i in index:
        img_list.append(frame)

img_array = np.asarray(img_list)

有没有办法只“寻找”我想要的帧,就像在 opencv 中完成的那样,如此处所示

您可以使用 imread 的index imread获取特定帧:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM