web-dev-qa-db-ja.com

scikit-imageで処理されるmp4ビデオの読み方

scikit-image関数(具体的にはテンプレートマッチング関数match_template)をmp4ビデオ、h264エンコードのフレームに適用したいと思います。アプリケーションが各フレームの時間を追跡することは重要ですが、フレームレートを知っているので、フレーム番号から簡単に計算できます。

私は低リソースで実行していることに注意してください、依存関係を可能な限りスリムに保ちたいと思います:numpyがとにかく必要であり、scikit-imageを使用する予定なので、避けますビデオを読み込むためだけにopenCVをインポート(およびコンパイル)します。

this ページの下部に、scikit-imagenumpy配列として保存されたビデオをseamleasslyで処理できることがわかります。したがって理想的です。

23
gaggio

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 hereenter image description here

ファイル内の画像を直接反復処理することもできます( ドキュメントを参照 ):

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')
47
head7

次のように 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に置き換えるだけです。

20
Alex I

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

2
Win GATE ECE