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の動画を作ろうとすると,しっかり再生できる動画が出力されます.
あなたの回答
tips
プレビュー