View Single Post
Old 5th September 2016, 08:06   #22  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
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.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???
StainlessS is offline   Reply With Quote