

quick timeのmov形式動画ファイルを読み込み、３次元のnumpy arrayに変換したいです。  
[フレーム、X、Y]というイメージです。  
下記で連番のjpgまで保存することはできている（あとは、このjpgを読み込んでnumpy
arrayにするだけ）のですが、このやり方だと毎回動画を実時間で再生しないといけないようです。（１時間の動画なら１時間かかる）

できれば、mov→numpy arrayに直接変換できて、しかもある程度高速な方法を何か教えて頂けますとありがたいです。

[code]

    import cv2
    import os
    
    path='***.mov'
    cd=os.path.dirname(path)
    os.chdir(cd)
    vidcap = cv2.VideoCapture(path)
    success,image = vidcap.read()
    count = 0
    image_array = []
    success = True
    while success:
      success,image = vidcap.read()
      cv2.imwrite("frame%d.jpg" % count, image)
      count += 1
    
[/code]


CC BY-SA 3.0
2017-12-24T05:52:53.753
40506
2018-12-10T06:03:10.690
2017-12-24T22:41:04.997
7837
26764
question
python opencv ffmpeg numpy mov
movファイルのnumpy arrayへの変換


`image`の型は既に`<type 'numpy.ndarray'>`なっています。ですから、一旦ファイルに保存して再読みする必要はありません。

また実時間で再生されているわけではなくて、jpgをディスクに保存するのにちょうど実時間程度、時間がかかっているだけです。cv2.imwriteの行をコメントアウトすれば10倍くらい早くなりますので、保存に時間がかかっていることがわかります。HDDではなくSSDだともうちょっと早いかもしれませんが。

もし動画のフレームを逐次処理する必要がないなら、動画を複数に分割して、それぞれの部分を別プロセスで処理することで高速化することをお勧めします。`cv2.CAP_PROP_POS_MSEC`や`cv2.CAP_PROP_POS_FRAMES`プロパティをvidcapにセットすることでシークすることができます。

他のアイデアとしてはスレッドやmultiprocessingモジュールを使うことですが、Pythonのスレッドは相変わらずパフォーマンスが出ませんし、`multiprocessing`モジュールを使ってもC言語の世界にあるnumpyのオブジェクトをプロセス間通信で送るのはオーバーヘッドがたかそうです。


CC BY-SA 3.0
2017-12-24T23:16:44.433
40515
2017-12-24T23:16:44.433
7837
40506
answer