我想将一个scikit- image函数(特别是模板匹配函数match_template)应用于mp4视频的h264编码帧。对我的应用程序来说,跟踪每个帧的时间很重要,但是我知道帧速率,因此可以轻松地从帧号进行计算。
scikit- image
match_template
mp4
h264
请注意,我使用的资源较少,并且我希望保持依赖关系尽可能的小:numpy无论如何都是必需的,并且由于我打算使用scikit- image,所以我避免导入(和编译)openCV只是为了阅读视频。
numpy
openCV
我看到的底部这个页scikit- image可以seamleassly处理存储作为视频numpy阵列,从而获得这将是理想的。
Imageio python包应做您想要的。这是使用此软件包的python代码段:
import pylab import imageio filename = '/tmp/file.mp4' vid = imageio.get_reader(filename, 'ffmpeg') nums = [10, 287] for num in nums: image = vid.get_data(num) fig = pylab.figure() fig.suptitle('image #{}'.format(num), fontsize=20) pylab.imshow(image) pylab.show()
您还可以直接遍历文件中的图像(请参阅文档):
for i, im in enumerate(vid): print('Mean of frame %i is %1.1f' % (i, im.mean()))
要安装imageio,可以使用pip:
pip install imageio
另一种解决方案是使用moviepy(它使用类似的代码来读取视频),但是我认为imageio更轻便并且可以完成工作。
对第一条评论的回应
为了检查整个文件中的标称帧速率是否相同,您可以计算迭代器中的帧数:
count = 0 try: for _ in vid: count += 1 except RuntimeError: print('something went wront in iterating, maybee wrong fps number') finally: print('number of frames counted {}, number of frames in metada {}'.format(count, vid.get_meta_data()['nframes'])) In [10]: something went wront in iterating, maybee wrong fps number number of frames counted 454, number of frames in metada 461
为了显示每帧的时间戳:
try: for num, image in enumerate(vid.iter_data()): if num % int(vid._meta['fps']): continue else: fig = pylab.figure() pylab.imshow(image) timestamp = float(num)/ vid.get_meta_data()['fps'] print(timestamp) fig.suptitle('image #{}, timestamp={}'.format(num, timestamp), fontsize=20) pylab.show() except RuntimeError: print('something went wrong')