LoginSignup
1
1

More than 5 years have passed since last update.

AvisynthでアニメのOPED差分を抽出する

Last updated at Posted at 2016-05-21

アニメに限定したのは、解像度が1920x1080でベタ打ちしてるから。
最終的にOverlay(v1,v2,mode="difference")で差分を出してるだけ

インタレの解除は限定的 というか、いわゆる24fps化はしてない。
アニメは違う話数でも映像が同じなら完璧に差分が消えるけど、24fps化とかのフィルタを試すと同じ映像ですら差分が出てしまったから。
この辺全然詳しくないからそこは各自改良して。

#ファイル読み込み
offset=61 # 値を小さくすると、左が戻る=右が進む
a="c:\a.ts"
b="c:\b.ts"

v1=DirectShowSource (a)
v2=DirectShowSource (b)

v1BlankLength = (0<offset) ? offset *  1 : 0
v2BlankLength = (offset<0) ? offset * -1 : 0

v1=AssumeTFF(v1)
v2=AssumeTFF(v2)

v1=AlignedSplice(BlankClip(v1,length=Int(v1BlankLength)),v1)
v2=AlignedSplice(BlankClip(v2,length=Int(v2BlankLength)),v2)

#ファイル読み込みここまで。v1とv2に入れる事

v1=Lanczos4Resize(v1,960,540)
v2=Lanczos4Resize(v2,960,540)
l1=StackHorizontal(v1,v2)

v3=BlankClip(v1,color=$303030)
v4=BlankClip(v1,color=$303030)
v3=Lanczos4Resize(v3,480,540)
v4=Lanczos4Resize(v4,480,540)
offset=Overlay(v1,v2,mode="difference").ColorYUV(off_y=-128) #差分を表示
offset=Lanczos4Resize(offset,960,540)

l2=StackHorizontal(v3,offset,v4)
v1=StackVertical(l1,l2)


return v1

おまけ。途中までaviutlの拡張編集で作っていたけど、カスタムオブジェクトだと映像の差分フィルタが使えない事に気がついたのでavisynthで作りなおした…

拡張編集のlua.txt
◇合成モード
    obj.setoption("blend",value[,option])
    value   : 0=通常 / 1=加算 / 2=減算 / 3=乗算 / 4=スクリーン
          5=オーバーレイ / 6=比較(明) / 7=比較(暗) / 8=輝度 / 9=色差
          以下は仮想バッファ専用の合成モードです。
          "alpha_add"=色情報は加重平均してアルファ値は加算します
          "alpha_max"=色情報は加重平均してアルファ値は大きい方を採用します
          "alpha_sub"=色情報は何もせずにアルファ値を減算します
          "alpha_add2"=色情報は重ね合わせしてアルファ値は加算します
    option  : "force"=強制指定モード
    フレームバッファへの描画の合成モードは元々の合成モードが通常の場合のみ反映されます。
    元々が通常以外の場合で反映させるには"force"オプションを指定してください。

これの利点は、二つの動画のオフセット調整がGUIのスライダーで出来る事。こっちで作りたかったぞー

OPED比較.obj
@OPED比較-A
--track0:offset,-100.0,100.0,0,0.01

function test(path,ox,oy,offset)
    obj.load("movie",path,obj.time+offset)
    local height = obj.h
    local width  = height / 9.0 * 16.0
    obj.effect("リサイズ","X",width,"Y",height,"ドット数でサイズ指定",1)
    obj.zoom = 0.5
    obj.draw(ox,oy)
end


a="C:\a.ts"
b="C:\a.ts"
if( 0 < obj.track0 ) then
    aOffset = obj.track0
    bOffset = 0.0
else
    aOffset = 0.0
    bOffset = obj.track0 * -1
end

test(a,-480,-270,aOffset)
test(b, 480,-270,bOffset)

test(a, 0,270,aOffset)
test(b, 0,270,bOffset)
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1