【python】imageio和cv2抽视频帧性能比较

最近需要用python对视频进行抽帧处理,网上给出的主要做法是两种,即调用imgeio或cv2的相关方法。但是却没看到有人对他们的性能进行对比,选择困难症的我决定写个demo测试一下。我的需求是抽取指定某帧,比如抽取第15帧,上诉两种方法都能实现,贴上代码如下:

import cv2
import time
import matplotlib.pyplot as plt
import imageio
import skimage
import numpy as np

position = [1, 5, 10, 15, 20, 25, 30] # 所要抽取帧的索引
imageio_start = time.time() # imgeio方法的时间计算
vid = imageio.get_reader("test.mp4", 'ffmpeg')
length = len(position)
frames2 = []
for i, img in enumerate(vid):
    if i in position: # 抽取指定帧
        image2 = skimage.img_as_float(img).astype(np.float32) # 转换为numpy数组
        frames2.append(image2)
        # plt.figure(0)
        # plt.imshow(image2)
        # plt.show()
    if len(frames2) == length:
        break
print('Time of imageio: ', time.time()-imageio_start)

######################################################################

cv2_start = time.time() # 计算cv2花费的时间
capture = cv2.VideoCapture("963861351.mp4")
frames = []
for i in position:
    capture.set(propId=cv2.CAP_PROP_POS_FRAMES, value=i) # 跳到指定帧
    hasframe, image1 = capture.read()
    frames.append(image1) # image1就是numpy数组
    # image1 = image1[:, :, :: -1] # 为了与imageio方法显示一致
    # plt.figure(0)
    # plt.imshow(image1)
    # plt.show()
print('Time of cv2: ', time.time()-cv2_start)

控制台结果:

Time of imageio:  0.5045185089111328
Time of cv2:  0.11601471900939941

补充:结果很明显,按照我的需求,cv2速度比imageio快很多。但是也有可能是我没有找对imageio更快的直接取指定帧的方法,而是用for循环去遍历vid,如果有小伙伴知道也请告诉我。另外,在cv2显示图片前加了image1 = image1[:, :, :: -1],是因为cv2是以(BGR)的顺序存储图像数据的,而一般我们所看到的图片和视频都是以(RGB)顺序存储,所以直接显示色调会不同。如下三张图分别是视频封面图,imageio显示图,cv2未加转换语句的直接显示图。

【python】imageio和cv2抽视频帧性能比较_第1张图片                     【python】imageio和cv2抽视频帧性能比较_第2张图片                      【python】imageio和cv2抽视频帧性能比较_第3张图片

你可能感兴趣的:(python)