【问题标题】:How to seek a frame in video using `imageio`?如何使用`imageio`在视频中寻找帧?
【发布时间】:2022-07-07 12:49:32
【问题描述】:

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

目前我做的是:

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 中完成的那样,如 here 所示?

【问题讨论】:

    标签: python opencv video-processing python-imageio


    【解决方案1】:

    您可以使用imreadindex 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)
    

    【讨论】:

      猜你喜欢
      • 2015-03-11
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多