OpenCVで編集した動画が保存できなくて、もう遠回りした


タグがカオスになってますね...笑

さて、環境ですが
MAC OS X 10.14.4
python 3.7.3
Opencv 3.4.2
PIL 5.4.1

やりたかったこと

プレゼンでキャニーエッジ処理をした動画を見せたくて保存したかったんですよ。
OpenCVを使うとキャニーエッジの処理がめっちゃ簡単にできるじゃないですか

out.write(frame)使って動画を作ると

動画が258バイトってありえないよねー。そもそも再生できないし。

色々調べたがもう保存できれば良いかと開き直った

ffmpegで連番画像を作成

    ↓

PILで画像を読み込み

    ↓

OpenCVでCannyEdge処理

    ↓

PILで画像を保存

    ↓

ffmpegで連番画像を動画に戻す

具体的な手順

input.mp4から連番画像を作成します。

ffmpeg -i input.mp4 -vcodec png image_%03d.png

連番画像
image_001.png
image_002.png
...
image_125.png
こんな感じでできます。

この連番画像をOpenCVで編集するわけですが、保存パートができなかったわけで
PILを利用して画像を保存します。

コードは以下

CannyEdge.py
import numpy as np
from PIL import Image
import cv2

#img file
pic_start = 1
pic_finish = 125

for i in np.arange(pic_start,pic_finish+1):
  #扱っている画像を表示
  print("\r{:}".format(i),end = "")

  #open image
  im = Image.open("image_{:0=3}.png".format(i))

  #OpenCVに渡すためにnumpyに変換
  open_im = np.asarray(im)

 #CannyEdge処理
  edges = cv2.Canny(open_im, 100, 150)

  #save image
  pil_im = Image.fromarray(edges)
  pil_im.save("image2_{:0=3}.png".format(i))

そして最後に新たな連番画像をffmpegにより動画に戻す。

ffmpeg -r 30 -i image2_%03d.png -vcodec libx264 -pix_fmt yuv420p -r 30 out.mp4

これによりキャニーエッジ処理したout.mp4が保存できます。
OpenCV便利なんだけどたまにな...