YouTube投稿時に前後の余計な部分をトリミングするのが結構めんどくさい
上記動画1はうまいことバトル開始から始まっているのですが、実はこの直前に待合室みたいな場面があって、そこは要らないので削っています。
この作業がマウスでちまちまとやる作業でとってもめんどくさい。
自動化するならこんな感じ?
- バトル開始直後の暗転する場面の時間を取得
- 暗転からだとちょっと遅いので上記から1~2秒差し引く
- 算出した時間をffmpegに渡してトリミングしてもらう
まずはこれだけやろうかね。
暗転する場面の時間を取得
暗転と比較する用の画像(blank.png、640x360)をGIMPで作りました。
次にソースです。
OpenCVのインストールとか使い方とかその辺は割愛。もっと詳しい人がたくさんいるのでそっちを見てください。
import cv2
import sys
# 比較用画像
im_blank = cv2.imread('blank.png')
hist_blank = cv2.calcHist([im_blank], [0], None, [256], [0, 256])
# 動画読み込み
filename = sys.argv[1]
cap = cv2.VideoCapture(filename)
if not cap.isOpened():
print('Could not open cap', file=sys.stderr)
sys.exit(1)
fc = cap.get(cv2.CAP_PROP_FRAME_COUNT)
fps = cap.get(cv2.CAP_PROP_FPS)
# 比較用画像とほぼ一致する場面の時間を取得
startfc = 0
for i in range(0, int(fc)):
(ok, frame) = cap.read()
if ok:
hist = cv2.calcHist([frame], [0], None, [256], [0, 256])
ret = cv2.compareHist(hist_blank, hist, 0)
# 完全一致にならないのでヒストグラム化して99%一致でOKにする(よくわからん)
if ret > 0.99:
startfc = i
break
# 秒
print(startfc / fps)
cap.release()
cv2.destroyAllWindows()
frame
が配列型で返ってくるし比較対象も単純な暗転画面だし、単純に配列同士で比較してやればいいだろうと思ったら意外にもうまくいかなかったんですよね……
仕方ないので画像をヒストグラム化して比較、99%一致していたらOKという怪しい方法を取っています。
この99%という数字にも実は全く根拠がなくて。動画からいくつか静止画像を切り出してポチポチやっていたら、 85%よりは99%の方がなんとなくいい感じだ ってなっただけです。このへんは機械学習とかを専門にやっている人じゃないと何とも言えないんでしょうね。
めんどくさいことを避けようとしたらさらにめんどくさくなっている件。
-
(C) ARMOR PROJECT/BIRD STUDIO/SQUARE ENIX All Rights Reserved. ↩