naya4510
@naya4510

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!

【Python】任意の順に並べた画像の動画化

スクリーンショット 2021-09-28 22.29.20.png

上記のテキストをもとに、a,i,u,i,oにそれぞれ対応した画像を並べたものを動画に変換したく以下のようなコードを書きました

作成したコード

imgs=[]
for l in new_text:
    if l=="a":
        imgs.append(cv2.imread("a.jpg"))
    if l=="i":
        imgs.append(cv2.imread("i.jpg"))
    if l=="u":
        imgs.append(cv2.imread("u.jpg"))
    if l=="e":
        imgs.append(cv2.imread("e.jpg"))
    if l=="o":
        imgs.append(cv2.imread("o.jpg"))
name = 'test.mp4'
out = cv2.VideoWriter_fourcc(name, cv2.VideoWriter(*"mp4v"),0.5, (640,480))

#print(imgs)
for i in range(len(imgs)):
    img=cv2.resize(640,480)
    out.write(imgs[i])
out.release()

現在の問題

.mp4ファイルで動画が保存されたのですがPCで開こうとするとQuickTimePlayerとの互換性がないと表示され、スマホで開こうとしてもできませんでした。
解決方法がわかる方いらっしゃいましたらコメントよろしくお願いいたします。

0

1Answer

原因の一つは@naya4510さんがお気づきのとおり、cv2.VideoWriterおよびcv2.VideoWriter_fourccです。

問題はもう一つあります。
それは、cv2.resizeです。

cv2.resizeは画像imgとサイズ(width, height)が引数です。

img=cv2.resize(640,480)

これではcv2.resizeは何に対してリサイズしているかわからないところからも問題がありそうだと気づけますね。


余談ですが、@naya4510さんのコードではnew_textのサイズが大きくなるにつれて処理速度は大きく低下してしまいます。

原因は、「不必要なメモリ使用」と「cv2.readの呼び出し回数」です。

  • 不必要なメモリ使用

必要な画像は数枚にもかかわらず、new_textのサイズと同じだけ画像のオブジェクトが生成されており、メモリを不必要に圧迫しています。最初に必要な画像を読み込んで用意し、必要に応じて呼び出すとメモリの圧迫を回避できます。

  • cv2.readの呼び出し回数

ファイルの読み込み(Input)および書き出し(Output)は処理速度を著しく低下させます。できる限り、ファイルI/Oは避けるコーディングが望ましいです。これも上の原因と同じく、必要な画像を最初に読み込んでおくことで回避できます。

以上の問題を解消すると以下のようなコードになります。

# coding: utf-8
import cv2

# 画像のファイル名
keys = ["a", "i", "u", "e", "o"]

# 画像読込
imgs = {}
for key in keys:
	imgs[key] = cv2.imread(key + ".jpg")

# 動画の設定
name = 'test.mp4'
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
fps = 0.5
width, height = 640, 480
movie = cv2.VideoWriter(name, fourcc, fps, (width,height))

# 動画に画像を埋め込んでいく
new_text = ["a", "i", "u", "e", "o", "a", "i"]
for l in new_text:
	img = cv2.resize(imgs[l],(width,height))
	movie.write(img)

# 動画を生成
movie.release()

私の環境でテストしたところ、問題なく動きました。

0Like

Comments

  1. @naya4510

    Questioner

    できました。ありがとうございます。

Your answer might help someone💌