前編
上記記事の続きになります。
調べる力が足りなすぎたので、とりあえず手を動かしました。
phash (前編より)
このタイムラプス動画のフレーム間ハッシュ距離がこんな感じになっていました。
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)]
z score
とりあえず、z score とってみました。
z_scores = scipy.stats.zscore(distances)
gaussian blur
z score にブラーをかけて、絶対値の平均のマイナスを閾値にしてみました。
blured = cv2.GaussianBlur(z_scores, (49, 49), 0)
threshold = numpy.average(numpy.sqrt(numpy.power(z_scores, 2)))
上図の閾値を下回っている1つの連なりを1つのイベントとして
動画再生を速度を変えたものが以下になります。
課題
思い描いていたものには近いづいていますが、
イベントとして検出した部分の前後も徐々にスピードが落ちたり、早くなったりさせてちょっと境目にマージンを持たせたらもう少しましになるかもとは思いました。
今回 moviepy
というpythonのライブラリを使いましたが
その使い方がもう少しわかったらチャレンジしてみたいと思います。
使ったライブラリをのせておきます。
# 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