Posted at

タイムラプス動画の自動速度調整の試み(後編)

More than 1 year has passed since last update.


前編

タイムラプス動画の自動速度調整の試み(前編)

上記記事の続きになります。

調べる力が足りなすぎたので、とりあえず手を動かしました。


phash (前編より)

https://youtu.be/BOHDtW9_tlQ

このタイムラプス動画のフレーム間ハッシュ距離がこんな感じになっていました。

clip = moviepy.editor.VideoFileClip("path to video file")

phashs = [imagehash.phash(PIL.Image.fromarray(frame)) for frame in clip.iter_frames()]
distances = [phashs[i+1] - phashs[i] for i in range(len(phashs)-1)]

アートボード_1.png


z score

とりあえず、z score とってみました。

z_scores = scipy.stats.zscore(distances)

z_scores.png


gaussian blur

z score にブラーをかけて、絶対値の平均のマイナスを閾値にしてみました。

blured = cv2.GaussianBlur(z_scores, (49, 49), 0)

threshold = numpy.average(numpy.sqrt(numpy.power(z_scores, 2)))

blured_z_scores.png

上図の閾値を下回っている1つの連なりを1つのイベントとして

動画再生を速度を変えたものが以下になります。

https://youtu.be/iPMuMYygbDg


課題

思い描いていたものには近いづいていますが、

イベントとして検出した部分の前後も徐々にスピードが落ちたり、早くなったりさせてちょっと境目にマージンを持たせたらもう少しましになるかもとは思いました。

今回 moviepy というpythonのライブラリを使いましたが

その使い方がもう少しわかったらチャレンジしてみたいと思います。

https://github.com/Zulko/moviepy

使ったライブラリをのせておきます。

# requirements.txt

ImageHash==3.1
matplotlib==1.3.1
moviepy==0.2.2.11
numpy==1.7.1
Pillow==3.4.2
progressbar2==3.11.0
scipy==0.13.2
seaborn==0.7.1

コードはこちら。

https://github.com/sosuke-k/timelapse-optimizer