scikit-image
関数(具体的にはテンプレートマッチング関数match_template
)をmp4
ビデオ、h264
エンコードのフレームに適用したいと思います。アプリケーションが各フレームの時間を追跡することは重要ですが、フレームレートを知っているので、フレーム番号から簡単に計算できます。
私は低リソースで実行していることに注意してください、依存関係を可能な限りスリムに保ちたいと思います:numpy
がとにかく必要であり、scikit-image
を使用する予定なので、避けますビデオを読み込むためだけにopenCV
をインポート(およびコンパイル)します。
this ページの下部に、scikit-image
がnumpy
配列として保存されたビデオをseamleasslyで処理できることがわかります。したがって理想的です。
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')
次のように scikit-video を使用できます。
from skvideo.io import VideoCapture
cap = VideoCapture(filename)
cap.open()
while True:
retval, image = cap.read()
# image is a numpy array containing the next frame
# do something with image here
if not retval:
break
これは、内部でavconvまたはffmpegを使用します。データをpythonに移動するためのわずかなオーバーヘッドがあり、avconvでビデオをデコードするだけの場合と比較して、パフォーマンスは非常に良好です。
Scikit-videoの利点は、APIがOpenCVのビデオ読み取り/書き込みAPIとまったく同じであることです。 cv2.VideoCaptureをskvideo.io.VideoCaptureに置き換えるだけです。
pythonでビデオを読む簡単な方法は、skviodeを使用することです。1行のコードでビデオ全体を読むことができます。
import skvideo.io
videodata = skvideo.io.vread("video_file_name")
print(videodata.shape)
http://mllearners.blogspot.in/2018/01/scikit-video-skvideo-tutorial-for.html