我有一个视频,其中有很多无用的帧(即几秒钟/几分钟没有移动)。我只想保留一些带来新信息的框架。我目前最好的解决方案是逐帧读取一个帧,并仅保留从上一个保存的帧开始其ssim-index低于0.99的帧:
#basic package
import numpy as np
import tqdm
import os
#work with image/videos
import cv2
import imageio
from skimage.measure import compare_ssim
import matplotlib.pyplot as plt
import skvideo.io
#open video
vid = imageio.get_reader('path/filename.mp4')
#create a director if not existing to save each image
p = os.path.join(path_output, video_name.split('.')[0])
if not os.path.exists(p):
os.makedirs(p)
#register only informative images
li_images = []
im_compared = color.rgb2gray(vid.get_data(0))
t = 0
T = vid.get_meta_data()['fps']
for num, im in tqdm.tqdm(enumerate(vid.iter_data())):
try:
#converting to grayscale to gain time
im = color.rgb2gray(im)
#SSIM: smaller values indicate less similarity (but rayon de soleil can bring the 0.98 drop to 0.78)
sim = compare_ssim(im_compared, im)
#if not that similar
if sim<0.99:
#save image
li_images.append(im_compared)
scipy.misc.imsave(os.path.join(p,str(round(t,3)).replace('.','-')+'.jpg'), im_compared)
#updated benchmarking image
im_compared = im.copy()
t = float(num)/ T
except:
print(i)
但是,这确实效率不高,因为一小时的视频需要1小时才能输出要保存为视频的图像列表。帧非常小(大约200x200),因此我希望有一个解决方案,而不是简单地减小尺寸。 有人有什么建议吗?任何帮助都非常感谢。