質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5768閲覧

numpyに動画を読み込ませた時のMemoryErrorについて

V1T4N

総合スコア13

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/09/13 03:36

前提・実現したいこと

Pythonで動画を扱いたい

Pythonで分割されたAVIファイルを結合し、他の形式に変換するソフトウェアを作っています。
そこで、AVIファイルを順番に読み込み、numpyのarrayに積み上げていくという方式を取っているのですが、640*480の動画でおよそ合計1500フレーム程度でMemoryErrorで終了してしまいます。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "run.py", line 64, in <module> data_temp = np.concatenate([data_temp,data],axis = 0) MemoryError

該当のソースコード

Python

1data_temp = np.concatenate([data_temp,data],axis = 0)

dataが一つのaviファイルから取ったarrayで、ループでdata_tempに積み上げていっています。

試したこと

タスクマネージャーでPythonのメモリ使用量を監視しましたがMemorryErrorが出る直前でも1GB以下でした

補足情報(FW/ツールのバージョンなど)

Python3.6.6
Numpy 1.14.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

MemoryError について

プログラム実行前の時点でメモリはどの程度余裕があるのでしょうか。

python

1img = np.zeros((640, 480, 3), dtype=np.uint8) 2print('bytes of one frames', img.nbytes) # bytes of one frames 921600 3print('bytes of 1500 frames', img.nbytes * 1500) # bytes of 1500 frames 1382400000

1500 フレーム読み込んだ時点で 1.29 GB になります。

結合のやり方について

すべてのフレームをメモリに一度展開するのではなく、cv2.VideoCapture() でフレームを読み込みつつ、cv2.VideoWriter() で読み込んだフレームを書き込んでみてはどうでしょうか。

サンプルコードを記載
VideoWriter() に渡す fps、コーデック、出力サイズは適宜変更してください。

python

1import cv2 2 3in_paths = ['sample1.mp4', 'sample2.mp4'] 4out_path = 'output.mp4' 5 6# Video Writer を作成する。 7fps = 30.0 8codecs = 'H264' 9size = (1280, 720) 10fourcc = cv2.VideoWriter_fourcc(*codecs) 11writer = cv2.VideoWriter(out_path, fourcc, fps, size) 12 13frames = 0 14for in_path in in_paths: 15 print('processing...', in_path) 16 17 # Video Capture を作成する。 18 cap = cv2.VideoCapture(video_path) 19 20 while cap.isOpened(): 21 ret, frame = cap.read() 22 if not ret: 23 break # ビデオが終了 24 25 writer.write(frame) 26 frames += 1 27 cap.release() 28 29writer.release()

投稿2018/09/13 04:27

編集2018/09/13 04:40
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問