HeartlessS Usurer
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
|
No solutions to your AvsPMod problem here, sorry.
The Real.Finder linked script performs really very well (at least on two identical clips, but one with added subtitles).
Here, another excursion into insanity
Code:
Function RectMarker(clip c,int W, Int H,Bool "Hit") {
Hit=Default(hit,False)
InFix = (Hit)
\ ? RT_string("(((x<=1|x>=%d|y<=1|y>=%d)&(x<4|x>=%d)&(y<4|y>=%d)|(x==0|x==%d|y==0|y==%d)))?255:0", W-2,H-2,W-4,H-4,W-1,H-1)
\ : RT_string("((x<=1|x>=%d|y<=1|y>=%d)&(x<4|x>=%d)&(y<4|y>=%d))?255:0", W-2,H-2,W-4,H-4)
c.Blankclip(width=W,height=H,Length=1,pixel_type="YV12").Killaudio
return mt_lutspa(relative = false,yExpr=mt_Polish(InFix), chroma = "128")
}
Function ShowMarker(clip c,int x,int y,int w,int h,Int color,bool type,Float "Opacity") {
Opacity=Default(Opacity,1.0)
W=(W<=0) ? c.Width-X+W : W H=(H<=0) ? c.Height-Y+H : H
Msk = c.RectMarker(W+2,H+2,type) Mrk=Msk.BlankClip(Color=Color)
Return c.Overlay(Mrk,x=X-1,y=Y-1,Mask=Msk,Mode="Blend",Opacity=Opacity)
}
Function FindSub(clip c,int "X",int "Y",int "W",int "H",Int "TextCol",Int "HaloCol",Int "ChanVar",Int "Text_w",Int "Text_h",Int "Halo_w",Int "Halo_h",Bool "ShowArea") {
GSCript("""
Function _FindSub_Lo(clip c,int X,int Y,int W,int H,Int TextCol,Int HaloCol,Int ChanVar,Int Text_w,Int Text_h,Int Halo_w,Int Halo_h) {
c
TcB=RT_BitAnd(TextCol,$FF) TextCol=TextCol/256 TcG=RT_BitAnd(TextCol,$FF) TextCol=TextCol/256 TcR=RT_BitAnd(TextCol,$FF)
HcB=RT_BitAnd(HaloCol,$FF) HaloCol=HaloCol/256 HcG=RT_BitAnd(HaloCol,$FF) HaloCol=HaloCol/256 HcR=RT_BitAnd(HaloCol,$FF)
TcBLo=Max(TcB-ChanVar,0) TcGLo=Max(TcG-ChanVar,0) TcRLo=Max(TcR-ChanVar,0)
TcBHi=Min(TcB+ChanVar,255) TcGHi=Min(TcG+ChanVar,255) TcRHi=Min(TcR+ChanVar,255)
HcBLo=Max(HcB-ChanVar,0) HcGLo=Max(HcG-ChanVar,0) HcRLo=Max(HcR-ChanVar,0)
HcBHi=Min(HcB+ChanVar,255) HcGHi=Min(HcG+ChanVar,255) HcRHi=Min(HcR+ChanVar,255)
Thresh=Min(Text_W*100.0/W,Text_H*100.0/H)
GotText=RT_RgbInRangeLocate(x=X,y=Y,w=W,h=H,Thresh=Thresh,
\ RLo=TcRLo,RHi=TcRHi,GLo=TcGLo,GHi=TcGHi,BLo=TcBLo,BHi=TcBHi,Prefix="TXT_",Baffle_w=Text_W,Baffle_h=Text_H)
n=current_frame
if(GotText) {
KX=TXT_X-Halo_w KY=TXT_Y-Halo_h
GotHalo=RT_RgbInRangeLocate(x=KX,y=KY,w=TXT_W+2*Halo_w,h=TXT_H+2*Halo_h,Thresh=Thresh,
\ RLo=HcRLo,RHi=HcRHi,GLo=HcGLo,GHi=HcGHi,BLo=HcBLo,BHi=HcBHi,Prefix="HAL_",Baffle_w=Halo_W,Baffle_h=Halo_H)
if(GotHalo) {
TXT_X2=TXT_X+TXT_W-1 TXT_Y2=TXT_Y+TXT_H-1
HAL_X2=HAL_X+HAL_W-1 HAL_Y2=HAL_Y+HAL_H-1
GudK=(HAL_X<=TXT_X && HAL_Y<=TXT_Y && HAL_X2>=TXT_X2 && HAL_Y2>=TXT_Y2)
if(GudK) {
OverLay(Last.BlankClip(color=$00FF00,width=HAL_W,height=HAL_H),x=HAL_X,y=HAL_Y,opacity=0.5) # Green Halo marker ON HALO
RT_Subtitle("%d] Text='YES' : x=%d y=%d w=%d h=%d",n,TXT_X,TXT_Y,TXT_W,TXT_H)
RT_Subtitle("Halo='YES' : x=%d y=%d w=%d h=%d",HAL_X,HAL_Y,HAL_W,HAL_H,y=20)
} Else {
OverLay(Last.BlankClip(color=$FFFF00,width=TXT_W,height=TXT_H),x=TXT_X,y=TXT_Y,opacity=0.5) # Yellow Text marker
OverLay(Last.BlankClip(color=$FF0000,width=HAL_W,height=HAL_H),x=HAL_X,y=HAL_Y,opacity=0.5) # Red BAD halo marker
RT_Subtitle("%d] Text='YES' : x=%d y=%d w=%d h=%d",n,TXT_X,TXT_Y,TXT_W,TXT_H)
RT_Subtitle("Halo='FAIL' : x=%d y=%d w=%d h=%d",HAL_X,HAL_Y,HAL_W,HAL_H,y=20)
}
} Else {
OverLay(Last.BlankClip(color=$FFFF00,width=TXT_W,height=TXT_H),x=TXT_X,y=TXT_Y,opacity=0.5) # Yellow Text marker
RT_Subtitle("%d] Text='YES' : x=%d y=%d w=%d h=%d\nHalo='NO'",n,TXT_X,TXT_Y,TXT_W,TXT_H)
}
} else {RT_Subtitle("%d]",n)}
Return Last
}
""")
c
X=Default(X,0) Y=Default(Y,0) W=Default(W,0) H=Default(H,0)
W=(W<=0) ? c.Width-X+W : W H=(H<=0) ? c.Height-Y+H : H
TextCol=Default(TextCol,$FEFEFE) HaloCol=Default(HaloCol,$020202) ChanVar=Default(ChanVar,2)
Halo_w=Default(Halo_w,4) Halo_h=Default(Halo_h,4)
Text_w=Default(Text_w,2) Text_h=Default(Text_h,2)
(SHOWAREA)?ShowMarker(Last,X,Y,W,H,$FF80FF,true,0.4):NOP
args="X,Y,W,H,TextCol,HaloCol,ChanVar,Text_w,Text_h,Halo_w,Halo_h"
ScriptClip("_FindSub_Lo("+args+")",args=args)
return Last
}
#---------------------
AVISource("D:\V\Cabaret.avi") # Some Clip with appropriate Subtitle SRT file. (Cabaret, border cropped, 668x396, 25FPS, 177640 frames)
ConvertToRGB24
SRT="Cabaret.srt" # Subtitle for Above Clip
### Subtitle Search area
X = 100
Y = Height-120
W = -X
H = -8
#
TEXT_W = 2 # minimum text pixel 'thickness' Horizontal
TEXT_H = 2 # minimum text pixel 'thickness' Vertical
HALO_W = 4 # Halo width in pixels (horizontal minimum, Could still be more Halo outside of detected area)
HALO_H = 4 # Halo height in pixels (vertical minimum, Could still be more Halo outside of detected area)
TEXTCOL = $FEFEFE
HALOCOL = $010101
CHANVAR = 1 # Text and Halo RGB channels can vary by as much as CHANVAR, eg $FEFEFE with CHANVAR=1 ranges $FDFDFD -> $FFFFFF
SHOWAREA = True # Set True to mark subtitle scan area
BLANKCOL = $808080 # Color used if DOBLANK ie Blankclip color
DOBLANK = False # Use only BlankClip not video
DOAUDIO = True # Use audio
###
Blank=AudioDub(Last.BlankClip(Color=BLANKCOL),Last) # Same size, FPS and frames as Template clip
Last=(DOBLANK)?Blank:Last
!DOAUDIO?KillAudio:NOP
TextSub(SRT) # Add subtitles to frame
FindSub(x=X,y=Y,w=W,h=H,TextCol=TEXTCOL,HaloCol=HALOCOL,Text_W=TEXT_W,Text_h=TEXT_H,halo_w=HALO_W,halo_h=HALO_H,showarea=SHOWAREA)
Return Last
Could probably still do better.
|