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()
![enter image description here](https://i.stack.imgur.com/QVMyZ.png)
您也可以直接在文件中的圖像迭代(see the documentation):
for i, im in enumerate(vid):
print('Mean of frame %i is %1.1f' % (i, im.mean()))
要安裝的ImageIO就可以使用點子:
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')
嗯,我試過OpenCV的同時開發一個原型我的PC應用。但是,由於我要在覆盆子pi上提供應用程序,因此我正在評估更輕的替代方案,同時還考慮了在raspi上編譯opencv的努力和依賴關係。 – gaggio
參見我們正在爲用戶指南準備的[本概述](https://github.com/danielballan/scikit-image/blob/video-guide/doc/source/user_guide/video.txt)。 –
@StefanvanderWalt:這個概述實際上非常有用,謝謝。可以通過增加'imageio'來改進,這也可以解決訪問特定幀編號的問題,這也在您的評論中提到。 – gaggio