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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

0回答

1756閲覧

OpenCVのVideoWriterがエラーも吐かずに終了してしまう

shirokuromaguro

総合スコア4

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/01/16 09:27

編集2020/01/17 00:13

OpenCVを使った動画の作成を試みているのですが,
エラーも吐かずに計算が途中で止まってしまう問題が発生しまして,
原因がわからなかったのでここに質問することにしました.

横長の画像(4215*1728のpng画像)を読み込み,指定した高さに調整した後,
そこから16:9の画像を横にスライドさせながら左から順にトリミングしていき,
動画にするコードです.

ソースコード

import cv2 import numpy as np from tqdm import tqdm img = cv2.imread('./sample_pic.png') # 横長の画像を読み込み height = 1080 # 動画にした時の高さを指定 width = round(height/9*16) # 16:9になるように動画の幅を計算 img_height, img_width, img_channels = img.shape[:3] print('original width = ',img_width, 'original height = ', img_height) # 高さが変数:heightで指定した値になるようにリサイズ resize_scale = height/img_height img = cv2.resize(img,(round(img_width*resize_scale),height)) img_height, img_width, img_channels = img.shape[:3] print('resized width = ',img_width, 'resized height = ', img_height) # save as mp4 frame_count = img_width-width print('frame count = ',frame_count) frame_rate = 60.0 fmt = cv2.VideoWriter_fourcc('m','p','4','v') writer = cv2.VideoWriter('./video.mp4', fmt, frame_rate, (width, height)) for i in tqdm(range(frame_count)): frame = img[:, i:i+width, :] # if i%20 == 0: # cv2.imwrite('./sample/'+str(i)+'.png',frame) writer.write(frame) del frame writer.release() print('ok') cv2.destroyAllWindows()

しかし,以下のような実行結果となり,
動画が上手く出力されません.

PS C:\Users... \script> python .\create_movie.py original width = 4215 original height = 1728 resized width = 2634 resized height = 1080 frame count = 714 86%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▏ | 613/714 [00:07<00:01, 82.00it/s]

エラーも出力されていませんが,途中で計算が止まってしまい,動画ファイルができません.
いろいろ試したのですが,出力された動画の高さ:heightの値を変えると挙動に変化があることがわかりました.

height = 900

PS C:\Users... \script> python .\create_movie.py original width = 4215 original height = 1728 resized width = 2195 resized height = 900 frame count = 595 19%|██████████████████████████▍ | 113/595 [00:00<00:03, 124.90it/s]

height = 1000

PS C:\Users... \script> python .\create_movie.py original width = 4215 original height = 1728 resized width = 2439 resized height = 1000 frame count = 661 100%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 661/661 [00:07<00:00, 92.33it/s] ok

heightを1,000pxにすると全ての計算が行われ,無事動画が出力されました.
なぜ1000なら上手くいたのか,上手くいかないときもなぜエラーも吐かないのか,わかりません.
他のマシンでも動かしてみましたが,同じ結果になりました.
cpu環境でもgpu環境でも変わらなかったです.
使用する横長の画像を変えても同じでした.

全く同じ箇所で計算が止まります.

実行環境

Windows 10 Pro
Python: 3.6.6
opencv-python: 4.0.0.21
numpy: 1.15.4

たまたま私だけこうなったのでしょうか.
それとも,なにか決定的なミスがコードの中にあるのでしょうか.
はてまた,何か仕様上の問題なのでしょうか.

よろしくお願いします.

追記(2020/1/17)

説明不足で申し訳ありません.

変数img, img_widthはリサイズ時に更新されており,4215*1728のpng画像を読み込んだ場合,
frame_count = img_width-width
の箇所では 2634 - 1920 (= 714)の計算が行われています.
総フレーム数は714になります.

ループの中で
print(frame.shape)

print(img.shape)
と出力を試してみましたが,変化は見られませんでした.
フレーム毎に元画像の幅が縮まる現象は確認できていないです.
また,変数heightを1000に設定して高さ1000pxの動画を作ろうとすると,しっかり再生できる動画が出力されます.

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/16 21:54

プログラムの意図が良く読めない部分がありますので追加説明お願いします。 > frame_count = img_width-width フレーム数(動画の総フレーム数?)はimg_width(元画像の横サイズ)-width(指定のheight:1080に対する16:9の比率1920) つまり、 「frame_count (動画の総フレーム数?)= 4215-1920」という理解で合っていますか? > frame = img[:, i:i+width, :] frame = img[:, i:i+width, :] cv2.imshow("frame",frame) cv2.waitKey(0) とすると分かりやすいですが、これは結果としてフレーム毎に元画像を1フレーム毎に幅を縮めることに繋がります。フレーム毎にフレームサイズが異なる動画は再生できない動画になると思いますが、この理解で合っていますか?
退会済みユーザー

退会済みユーザー

2020/01/18 23:31 編集

Lenna.pngをwindowsのペイントで1728*1728にした後に余白をつけて4215*1728にしましたが通常通り動画ができました。900heighの場合もです。コーデックの問題かもしれません。 念のためこちらの動作環境を書きます。 OS: Win10 home Python: 3.7.5 OpenCV: 4.1.1.26 Numpy: 1.17.3+mkl
shirokuromaguro

2020/01/20 08:40

コーデックを変更し, fmt = cv2.VideoWriter_fourcc('W','M','V','1')や,('X','V','I','D')など, いろいろ試してみましたがやはり同じ結果になりました. 別の環境(Windows 10 pro, python 3.7.3, OpenCV 4.1.2.30, numpy 1.16.3)でも試しましたが同じです. 出力の高さを1080pxに設定すると86%のところでwriterが止まりました. そして1000pxや800pxのときは成功します. 同じサイズの入力画像をいくつか作って,もう少し試して原因を探ってみようと思います.
退会済みユーザー

退会済みユーザー

2020/01/20 17:02

ダメ押しで以下のように追跡できそうでしょうか?どの変数が何になった時に何行目でクラッシュする、までわかればある程度原因が絞れそうです。 1. try except(tracebackでエラーをトレース)で動作確認 2. for i の中の変数と処理の段階を逐一print()で表示…たとえば、一行処理すると毎にprint("A") print("B")のようにして追跡
tiitoi

2020/01/29 05:08

del frame はいらないのではないでしょうか。 元の numpy 配列の一部である view を del してしまっていいのか疑問
shirokuromaguro

2020/02/04 00:53

返答が遅れて申し訳ありません. やりたいこと自体は全く新しいコードを一から書き直して対応しました. しかし原因がわからないのは気になるので解決したいところです. 何かが起こっているのは,いずれのケースも writer.write(frame) の箇所です. ここをtry文で挟んでみることも試みましたが,exceptionに分岐することはありませんでした. しっかり全部elseに行っており,正常な処理ということになっているようです. 画像の差し替えもいろいろ試しましたが,大きな変化は見られなかったです.
退会済みユーザー

退会済みユーザー

2020/02/04 21:57

tiitoiさんの話にあるように、delのくだりは確かになくて良いと思います。次の周で上書きされますし、問題をシンプルにするためにも消した方が良さそうです。 >何かが起こっているのは,いずれのケースもwriter.write(frame) print(frame.shape)をwriter.writeの直前に入れて試していただけますか? 何らかの事情で中身がNoneやその他異常になっている恐れがあるためです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問