2017-06-01 27 views
0

フレームごとにビデオクリップをhdf5ファイルに保存しようとしています。 これまでのところ私のコードは動作していますが、ソースビデオファイルと比較して、hdf5ファイルのサイズは10倍以上になっています。Pythonはhdf5というファイルを大きなファイルサイズで保存します

入力ファイル:AVI 200×126px、持続時間:16分サイズ:82メガバイト

出力ファイル:HDF5、gzip圧縮、圧縮= 9、サイズ:1ギガバイト

フレームを格納するためのコードは非常に単純です:

import h5py 
from skvideo.io import VideoCapture 
frames = [] 
cap = VideoCapture('/home/ubuntu/PycharmProjects/video2H5Test/data/video_F100_scaled2.avi') 
cap.open() 

it = 0 
while True: 
    retval, image = cap.read() 
    if image != None: 
     frames.append(image) 
     it += 1 
     if (it % 1000 == 0): 
      print('Processed %d frames so far' % (it)) 
    if not retval: 
     break 

with h5py.File('./test3.hdf5','w') as h5File: 
    h5File.create_dataset('camera1',data=frames,compression='gzip',compression_opts=9) 

として、 gzipを使用してデータセットを圧縮していることがわかります。

メモリ消費を節約する方法はありますか?

答えて

1

最初の画像を使用してデータセットを初期化します。今

myDataSet.resize(myDataSet.len() + 1, axis=0) 
myDataSet[myDataSet.len() - 1] = image 
+0

圧縮を追加するのを忘れました。それがなければ、ファイルサイズはフレームごとに別々のデータセットを作成するのと同じですが、10倍以上長くなります – crazjo

0

出力hdfファイルのチャンクスキームは何ですか?圧縮はチャンクで行われるため、ビデオの情報のほとんどがフレームごとに変化しないことを考慮すると、同じチャンク内に異なるフレームが存在する場合は、より高い圧縮率が得られるはずです。あなたがサンプルビデオファイルを提供すれば試してみることができます。同じ問題に出くわした人のために

+0

:単純にデータセット全体のサイズを変更するイメージを追加するには

myDataSet = myFile.create_dataset('someName', data=image[None, ...], maxshape=( None, image.shape[0], image.shape[1], image.shape[2]), chunks=True) 

チャンクはありません。 whileループにデータセットを保存する方法はありますか?ビデオファイルが大きい場合は、フレームリストが非常に大きくなる可能性があります。 – johni07

+0

はい、hdfファイルを部分的に書くことができます。これは実際にはこのファイル形式の利点の1つです。 – kakk11

+0

@ kakk11:https://stackoverflow.com/questions/46278714/how-to-compress-the-data-that-saved-in-hdf5の質問をご覧ください。私は上記と同じ問題があります – user8264

関連する問題