にわとり遊び
PC関連とエンコードの覚書き
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

WritePosition - 2つのクリップの開始フレームのズレを書き出す

function WritePosition (clip clip1,clip clip2,string filename,int "radius",int "depth",int "luma",bool "slip") {
slip=default(slip,false)
clip2=(slip) ? clip2.SeparateFields().Loop(0,0,0).AssumeFieldBased().Weave() : clip2
radius=default(radius,5)
depth=default(depth,30)
luma=default(luma,50)
clip1=clip1.blur(0,1)
clip2=clip2.blur(0,1)

function until_diff (clip diff,int depth,int "n") {
n=default(n,depth)
r=diff.framecount/n*(n-depth)+rand(diff.framecount/n,seed=true)
diff_frame=diff.Trim(r,-1)
clip=(depth==1) ? diff_frame : until_diff(diff,depth-1,n)
return ConditionalFilter(diff_frame,clip,diff_frame,"AverageLuma","=","0")
}

function add_radius (clip d0,clip clip1,clip clip2,int radius,int luma,int depth,int "radius_n") {
radius_n=default(radius_n,0)
d1=until_diff(mt_lutxy(clip1.Loop(0,0,radius_n),clip2,"x y - abs").Trim(10,clip1.framecount-10).mt_binarize(luma).mt_inpand,depth)
d2=until_diff(mt_lutxy(clip1,clip2.Loop(0,0,radius_n),"x y - abs").Trim(10,clip1.framecount-10).mt_binarize(luma).mt_inpand,depth)
d0=(radius==0) ? d0 : d0++d1++d2
return (radius_n+1<radius) ? add_radius(d0,clip1,clip2,radius,luma,depth,radius_n+1) : d0
}

d0=until_diff(mt_lutxy(clip1,clip2,"x y - abs").Trim(10,clip1.framecount-10).mt_binarize(luma).mt_inpand,depth)

add_radius(d0,clip1,clip2,radius,luma,depth)
return WriteFileif(filename,"AverageLuma==0",""" "n=" ""","round(current_frame/2.0)*round(((current_frame/2.0-current_frame/2)-0.25)*2)",append=false)
}


・2つのクリップを比較して、差分を検知できない開始フレームを外部ファイルに出力する
Adjust2clipと併用して開始位置を合わせることが可能

clip1 - 基準となるクリップ
clip2 - clip1と合わせるクリップ
filename - 出力ファイル名を設定する
radius - フレームをずらす範囲。1なら前後+-1フレームの計3フレーム。
depth - 差分を検知する処理の最大試行回数。差分を検知し次第、次の処理に以降する。正しい位置では差分を検知しないので、必ず最大回数まで試行する。
luma - 差分判定の閾値
slip - clip2を1フィールドずらした状態で処理を開始する

0_20150508195014def.png
→ depth (試行回数上限)

radius (試行フレームの範囲)




#使用例
#clip1
Import("BS11\Trim.avs")
clip1_1=c1.crop(8,250,-8,-160).Trim(0,c1.framecount-330)
clip1_2=c2.crop(8,250,-8,-160)
clip1_3=c3.crop(8,250,-8,-160)
clip1_4=c4.crop(8,250,-8,-160).Trim(0,c4.framecount-330)
#clip2
Import("MX\Trim.avs")
clip2_1=c1.Spline36Resize(1920,last.height,0.12,0,1440,0).crop(8,250,-8,-160).Trim(0,c1.framecount-330)
clip2_2=c2.Spline36Resize(1920,last.height,0.12,0,1440,0).crop(8,250,-8,-160)
clip2_3=c3.Spline36Resize(1920,last.height,0.12,0,1440,0).crop(8,250,-8,-160)
clip2_4=c4.Spline36Resize(1920,last.height,0.12,0,1440,0).crop(8,250,-8,-160).Trim(0,c4.framecount-330)

#Import("slip.txt")
o1=WritePosition(clip2_1,clip1_1,"1.txt")
o2=WritePosition(clip2_2,clip1_2,"2.txt")
o3=WritePosition(clip2_3,clip1_3,"3.txt")
o4=WritePosition(clip2_4,clip1_4,"4.txt")
o1++o2++o3++o4
return last


#使用例 活用編
#BS11
Import("BS11\Trim.avs")
clip1=c1.EraseLOGO(logofile="D:\Movie\logo\BS11_1920x1080.lgd", start=0, fadein=0, fadeout=0, end=framecount(c1)-331)
#MX
Import("MX\Trim.avs")
clip2=c1.EraseLOGO(logofile="D:\Movie\logo\MX_1440x1080.lgd", start=0, fadein=0, fadeout=0, end=-1)
clip2=clip2.Spline36Resize(1920,1080,0.12,0,1440,0)

n=clip2.framecount
Import("1.txt")
clip1=Adjust2clip(clip2,clip1,n,swapaudio=true)
stacksubtract(clip2,clip1,1)

#提供
clip2=clip2.ApplyRange(framecount(clip1)-330,framecount(clip1),"OverDiff3",clip1)#1920

#ANIME+
clip1=OverDiff3(clip1,clip2,0,820,100,1360,mode=1)
#テレビから離れて
clip1=OverDiff3(clip1,clip2,930,80,320,320,mode=1)

BS111=clip1
MX1=clip2
#Merge(clip1,clip2)
return last


スポンサーサイト
Adjust2clip - 2つのクリップの開始位置を合わせる
function Adjust2clip (clip clip1,clip clip2,int n,bool "slip",bool "swapaudio") {
slip=default(slip,false)
swapaudio=default(swapaudio,false)
clip2=(slip) ? clip2.SeparateFields().Loop(0,0,0).AssumeFieldBased().Weave() : clip2
clip2=(n==0) ? clip2 : (n>0) ? (n==1) ? clip1.Trim(0,-1)++clip2 : clip1.Trim(0,-1+n)++clip2 : clip2.Loop(0,0,-1+Abs(n))
clip=Merge(clip1,clip2,1)
return (swapaudio) ? AudioDub(clip,clip2) : clip
}

clip1 - 基準となるクリップ
clip2 - clip1に合わせるクリップ
n - clip2からフレーム数を増減する数値
slip - [default=false] clip2を1フィールドずらす
swapaudio - [default=false] clip2の音声を使う
2つのクリップの差分にマスクをかけて上書きする - OverDiff3 (その5)
1_2015050423291612f.png
OverDiff3(clip1,clip2,left=1380,top=300,bottom=100,uv=true,inpand=false,show=true)

function OverDiff3 (clip clip1,clip clip2,int "top",int "bottom",int "left",int "right",clip "c1",clip "c2",bool "uv",bool "inpand",int "mode",int "margin",bool "clamp",bool "show") {
show=default(show,false)
top=default(top,0)
bottom=default(bottom,0)
left=default(left,2)
right=default(right,6)
margin=default(margin,0)
clamp=default(clamp,false)
c1=default(c1,clip1.crop(left,top,-right,-bottom).blur(0,1))
c2=default(c2,clip2.crop(left,top,-right,-bottom).blur(0,1))
uv=default(uv,false)
inpand=default(inpand,true)
mode=default(mode,2)

check_diff=mt_lutxy(c1,c2,"x y - abs",chroma="process").mt_binarize(5).mt_inpand.mt_inpand.mt_inpand

over_mask=BlankClip(clip1,color=$ffffff).Letterbox(top,bottom,left,right).mt_binarize()
masked_1=mt_merge(clip1,clip2,over_mask,luma=true)
show_mask=Overlay(BlankClip(clip1),check_diff).Grayscale()
show_merge=merge(clip1,clip2)

clip_0=masked_1
clip_0=(show) ? merge(show_merge,over_mask) : clip_0

clip_1=ConditionalFilter(check_diff,clip1,masked_1,"AverageLuma","<","1",show=show)
clip_1_show=ConditionalFilter(check_diff,show_merge,show_merge,"AverageLuma","<","1",show=show)
clip_1=(show) ? StackVertical(merge(clip_1_show,over_mask),show_mask) : clip_1

c1=clip1.blur(0,1).Letterbox(top,bottom,left,right)
c2=clip2.blur(0,1).Letterbox(top,bottom,left,right)
c1u=c1.UToY.PointResize(c1.width,c1.height)
c2u=c2.UToY.PointResize(c2.width,c2.height)
c1v=c1.VToY.PointResize(c1.width,c1.height)
c2v=c2.VToY.PointResize(c2.width,c2.height)
small_0=mt_lutxy(c1,c2,"x y - abs",chroma="process").mt_binarize(40)
small_u=mt_lutxy(c1u,c2u,"x y - abs",chroma="process").mt_binarize(40)
small_v=mt_lutxy(c1v,c2v,"x y - abs",chroma="process").mt_binarize(40)
small_0=(uv) ? mt_logic(small_0,mt_logic(small_u,small_v,mode="or"),mode="or") : small_0
small=(margin==0) ? small_0 : mt_logic(small_0.Loop(0,0,margin-1),small_0.Loop(margin+1,0,0),mode="or")
small=(clamp) ? mt_logic(small_0,small,mode="or") : small
small=(inpand) ? small.mt_inpand : small
big=mt_lutxy(c1,c2,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
big_u=mt_lutxy(c1u,c2u,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
big_v=mt_lutxy(c1v,c2v,"x y - abs 1.5 ^",chroma="process").mt_binarize(20)
big=(uv) ? mt_logic(big,mt_logic(big_u,big_v,mode="or"),mode="or") : big
diff_mask=mt_hysteresis(small,big).mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand.mt_expand
masked_2=mt_merge(clip1,clip2,diff_mask,luma=true)
clip_2=ConditionalFilter(check_diff,clip1,masked_2,"averageluma","=","0",show=show)
clip_2_show=ConditionalFilter(check_diff,show_merge,show_merge,"averageluma","=","0",show=show)
clip_2=(show) ? StackVertical(merge(clip_2_show,diff_mask.Grayscale()),show_mask) : clip_2

return select(mode,clip_0,clip_1,clip_2)
}


clip1 - 差分を上書きしたいクリップ
clip2 - 上書きに用いるクリップ
top,bottom,left,right - 指定した外周を除外し、部分的なマスクを作成する
c1,c2 - 比較に用いるクリップ。指定した場合、c1とc2の差分から判定を行う。クリップの一部分だけを比較する場合に使う。
mode - [default=2]
0:差分の有無に関わらず、指定した部分マスクで上書きをする。
1:差分が認められた場合のみ、指定した部分マスクで上書きをする。
2:差分が認められた箇所に自動的にマスクを作成し、上書きをする。
margin - [default=0] 入力数値の前後フレームを参照してマスクをかける (フェードイン・アウトに有効)
clamp - [default=false] margin利用時に前後フレームだけでなく現在のフレームを反映させる (流れるテロップ以外では不要)
show - [default=false] 適用するマスクを透過表示し、差分判定を合わせて表示する

inpand - [default=true] 通常動作で消える微細な差分をマスクに適用する
uv - [default=false] 差分マスクに色差を加える

※前回からの変更
inpandとuv。有効にしなければ前回と同じ動作。
FlexibleMerge その4

function FlexibleMerge3 (clip clip1,clip clip2,float "weight",float "weight2",int "top",int "bottom",int "left",int "right",float "thr",int "nexc",float "nmin",float "nmaxA",float "nmaxB",int "show") {
thr=default(thr,10)
weight=default(weight,0.5)
weight2=default(weight2,0.9)
show=default(show,0)
nexc=default(nexc,3)
nmaxA=default(nmaxA,30)
nmaxB=default(nmaxB,30)
nmin=default(nmin,1)

top=default(top,0)
bottom=default(bottom,0)
left=default(left,0)
right=default(right,0)

blank1=BlankClip(clip1,color=$ffffff).Letterbox(top,bottom,left,right).mt_binarize()

mask1=CombMask(clip1, thY1 = thr, thY2 = thr)
mask2=CombMask(clip2, thY1 = thr, thY2 = thr)
nmask1=mt_logic(blank1,mt_invert(mask2),mode="and")#clip2がきれい
nmask2=mt_logic(blank1,mt_logic(mask2,mask1,mode="andn"),mode="and")#clip1にノイズ、clip2はきれい

clip1=(show==0) ? clip1 : clip1.subtitle("clip1",size=48)
clip2=(show==0) ? clip2 : clip2.subtitle("clip2",size=48,y=50)
clip3=Merge(clip1,clip2,weight)
clip4=Merge(clip1,clip2,weight2)
clip=mt_merge(clip1,clip3,nmask1,luma=true)
clip=mt_merge(clip,clip4,nmask2,luma=true)

clip2=mt_merge(clip1,clip2,blank1,luma=true)

#nexc
global global_nmaxA=nmaxA
global global_nmaxB=nmaxB
global global_nmin=nmin
Mask1_Mask2=Interleave(Mask1,Mask2)
nexc_max1=ConditionalFilter(Mask1,clip1,clip,"AverageLuma()","<","global_nmaxA")
nexc_max2=ConditionalFilter(Mask2,clip2,clip,"AverageLuma()","<","global_nmaxA")
nexc_max3=ConditionalFilter(Mask1_Mask2,nexc_max1,nexc_max2,"AverageLuma(SelectEven)","<","AverageLuma(SelectOdd)")
SelectClip=Select(nexc,clip,nexc_max1,nexc_max2,nexc_max3)
nexc_max=ConditionalFilter(Mask1_Mask2,clip,SelectClip,"Abs(AverageLuma(SelectEven)-AverageLuma(SelectOdd))","<","global_nmaxB")
nexc_min1=ConditionalFilter(Mask1,clip1,nexc_max,"AverageLuma()","<","global_nmin")
nexc_min2=ConditionalFilter(Mask2,clip2,nexc_max,"AverageLuma()","<","global_nmin")
nexc_min3=ConditionalFilter(Mask1,clip1,nexc_min2,"AverageLuma()","<","global_nmin")
nexc_min=Select(nexc,clip,nexc_min1,nexc_min2,nexc_min3)
clip=(nexc==0) ? clip : nexc_max

#show
show1=Combcheck(clip)
show2=StackHorizontal(Combcheck(clip1),Combcheck(clip2)).ReduceBy2.StackVertical(ReduceBy2(Combcheck(clip)).AddBorders(clip.width/4,0,clip.width/4,0))
show3=ConditionalFilter(Mask1_Mask2,nexc_min,nexc_min,"AverageLuma(SelectEven)","<","AverageLuma(SelectOdd)",show=true)
clip=Select(show,clip,show1,show2,show3)
return clip
}


clip1 - ベースとなるクリップ
clip2 - サブクリップ
weight - [default=0.5] clip1とclip2の両方にノイズがない部分に merge(clip1,clip2,weight) を適用する
weigth2 - [default=0.9] clip1にノイズがあり、clip2にノイズがない部分に merge(clip1,clip2,weight2) を適用する
top,bottom,left,right - [default=0] clip2の外周にマスクをかけ、mergeから除外する
thr - [default=10] CombMaskの閾値
nexc - [default=3,0-3] clip1,clip2のノイズの量に応じて出力クリップを選択する
0.ノイズに関わりなくmergeしたクリップを返す
1.clip1,clip2のノイズ量の差がnmaxB以上のときclip1を返す。clip1がnmin以下ならclip1を返す。
2.clip1,clip2のノイズ量の差がnmaxB以上のときclip2を返す。clip2がnmin以下ならclip2を返す。
3.clip1,clip2のノイズ量の差がnmaxB以上のときノイズ量の少ないクリップを返す。clip1かclip2がnmin以下なら該当するクリップを返す(両方が該当する場合はclip1が優先される)。
nmin - [default=1] clip1,clip2のどちらかのノイズ量がこれ以下の場合はmergeしない
nmaxA - [default=30] clip1,clip2のノイズ量がnminからnmaxAの間はnexcを介さずにmergeする
nmaxB - [default=30] clip1とclip2のノイズ量の差。nexcで使う。
show - [default=0, 0-3] FlexibleMergeの働きを視覚化する
1.出力クリップにCombcheckを適用する
2.入力クリップと出力クリップにCombcheckを適用し並べる
3.入力クリップのノイズ量を表示する


ノイズ量に応じて出力を変える部分を変更。


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。