@ogasa13579

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

連続するフレーム画像をつなげて動画として保存したい

解決したいこと

連続するフレーム画像をつなげて動画として出力したいのですがうまくいきません。どのようにすればよいでしょうか?

発生している問題・エラー

import os                                                                                                                                                           
import cv2

num = 728
k=0
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
video = cv2.VideoWriter('BOS.mp4',fourcc, 20.0, (1920, 1080))

while k < num:
    img = cv2.imread('pic_'+str(k)+'.png', 0)

    # can't read image, escape
    if img is None:
        print("can't read")
        break

    # add
    video.write(img)
    print(k)
    
    k += 1

print('written')

-----------------------------------------------------------------
0
1
2
・
・
・
724
725
726
727
written
0 likes

3Answer

出ているエラーメッセージ not all arguments converted during string formatting で検索すれば分かることですが、文字列と数値の結合に % 演算子は使えません。 'pic_'%if'pic_{i}' に変えてください。

0Like

ありがとうございます。f'{ }'にしたところエラーは出なかったのですが、読み込みが上手くいきませんでした。ほかの記事を見たところfor文よりもwhile文のほうが処理回数が多いとき、処理が速いとゆうことだったのでwhile文にしてみたところエラーも出ず画像の読み込みもできていたのですが、保存されていませんでした。どのようにすればうまくいくでしょうか?上記のコードはwhile文に変更したものです。

0Like

@ogasa13579 読み込みがうまくいかなかったのはファイル名に拡張子をつけていなかったからでは? f'pic_{i}.png' ならいけるはずですが、今のコードでも動くのでいいでしょう。

for と while に速度の差はほとんどありません。何十万回もループして少し差がつくかどうか程度ですし、 for の方が速い場合もあります。

保存できない理由はコードからは分かりません。書き込む画像の幅と高さは、 VideoWriter に指定した (1920, 1080) に揃っている必要があるので、おかしいファイルがないか確認してください。

コードの最後に video.release() を実行すればうまくいくかもしれません。

0Like

Your answer might help someone💌