前提・実現したいこと
5k1000, 5k1001, 5k1002…と続いていく連番画像を動画化したいと考えています。
発生している問題・エラーメッセージ
特にエラーが発生しているわけではないのですが作成された動画が破損しているといわれて再生することができません
該当のソースコード
import cv2 import numpy as np import glob fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') video = cv2.VideoWriter('Img.mp4', fourcc, 20.0, (720, 480)) f = 0 while True: img = cv2.imread('5k1' + str(f) +'.jpg') if img is None: break img = cv2.resize(img, (720, 480)) video.write(img) print(f) f += 1 video.release()
補足情報(FW/ツールのバージョンなど)
初心者なので間違えている箇所はたくさんあると思います
画像はプログラムと同じ場所に置いてあるのですが移動したほうが良いとかはありますか?
python3.6
windows10
「作成された動画が破損しているといわれて」とはどういうことでしょうか?
動画が再生できないということです。
表示されているfはどのくらいまで進みますでしょうか。本ソースコード少し改造して1枚の画像で1000回ループしたところ普通に動きました(Windows10, Anaconda/Python 3.8.3, 映画&テレビで再生)。
動画は再生可能でしょうか?
可能です(もちろん1枚の画像なので動画ですが中身は止まっています)。エラーは出ません。
少し改造した内容を見せていただくことは可能でしょうか?
import cv2
fourcc = cv2.VideoWriter_fourcc("m", "p", "4", "v")
video = cv2.VideoWriter("Img.mp4", fourcc, 20.0, (720, 480))
img = cv2.imread("test.jpg")
for _ in range(1000):
img = cv2.resize(img, (720, 480))
video.write(img)
video.release()
Whileでのループよりforのループのほうがいいのでしょうか?
その辺がよくわかっていなくて申し訳ないです。
いえ、whileループで問題ないと思います。ちなみにOpenCVのバージョンは4.0.1です。
import cv2
print(cv2.__version__)
で表示されます。
では、間違えてるとしたら
img = cv2.imread('5k1' + str(f) +'.jpg')
ここの表記ということになるのでしょうか?
その部分を間違えていたら、エラーを出して停止し、video.release()が呼ばれないので動画はおかしくなる可能性が大ですが、エラーは出ていないのですよね?
エラーはなく動画が作成されて、その作成された動画を再生しようとするとファイルが破損していますと言われて再生できません。
問題点の切り分けのために、一枚の画像で動画を作って見るのはどうでしょう?先に貼り付けたfor文で回しているものです。
わかりました。それで試してみます。
ご丁寧にありがとうございます。
1枚ならできました。
これをループに出来るのでしょうか?
オリジナルのソースコードに戻ると、1000回ループなら
5k11.jpg
5k12.jpg
...
5k1999.jpg
となるので、それだけの画像が正しく存在するのであれば可能だと思います。
1000からのスタートなのですがその場合はどうすればいいのでしょうか?
5k1000.jpg
5k1001.jpg
...
のような感じでしょうか。桁数は必ず4桁でしょうか?4桁であればf=0のところをf=1000としてもらい、img = cv2.imread('5k' + str(f) +'.jpg')
とすれば良いです。
そうです!
何度も申し訳ありません!
ご丁寧にありがとうございます。
import cv2
import numpy as np
import glob
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
video = cv2.VideoWriter('Img.mp4', fourcc, 20.0, (720, 480))
f = 1000
##img = cv2.imread('5k1000.jpg')
for f in range(100):
img = cv2.imread('5k' + str(f) +'.jpg')
#img = cv2.imread('5k1' + {0:03d}.jpg".format(f))
img2 = cv2.resize(img, (720, 480))
video.write(img2)
print(f)
f += 1
video.release()
でプログラムを作成すると
cv2.error: OpenCV(4.1.1) C:\projects\opencv-python\opencv\modules\imgproc\src\resize.cpp:3720: error: (-215:Assertion failed) !ssize.empty() in function 'cv::resize'
というエラーが出ます。
リサイズのエラーですがこれはどうすれば改善するのでしょうか?
自分で解決できました!
ありがとうございます!
おめでとうございます。何が悪かったのかは謎のままですが、解決したようで良かったです。
回答1件
あなたの回答
tips
プレビュー