View Single Post
Old 6th January 2015, 16:33   #11  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Dynamically changing borders detector (PART 2)

Code:
    ROBOCROP_DEBUG=False
    DBUG=FALSE
    c
    myName="DBSC_DynaCrop: "
    Valid=DBSC_ScanValidate(ScanDB,MustExist=True,name=myName)          
    Assert(Valid,RT_String("%sInvalid ScanDB\n%s",myName,ScanDB))    
    Records=RT_DBaseRecords(ScanDB)
    Assert(Records==FrameCount,RT_String("%sScanDB Records != FrameCount",myName))
    SpliceDB=Default(SpliceDB,"")    
    c2 = 0
    _W_=Default(W,width) _H_=Default(H,height)
    Resizer=Default(Resizer,"Spline64Resize(_W_,_H_)")  # Resizer to use
    TResizer="t."+Resizer
    CropThresh=Float(Default(CropThresh,-32.0))         # Absolute Thresh
    ATM=Float(Default(ATM,16.0))                        # ATM Switched almost OFF
    RLBT=Default(RLBT,15)
    Assert(RLBT>=1 && RLBT<=15,RT_String("%sRLBT 1->15 Only",myName))
    LeftAdd=Default(LeftAdd,0) TopAdd=Default(TopAdd,0) RightAdd=Default(RightAdd,0) BotAdd=Default(BotAdd,0)
    CSX=RT_ColorSpaceXMod(c)  CSY=RT_ColorSpaceYMod(c,laced=False)
    CropLimit=Default(CropLimit,16) 
    CropLimit_Left = (Default(CropLimit_Left,CropLimit) + CSX/2) / CSX * CSX
    CropLimit_Top  = (Default(CropLimit_Top,CropLimit)  + CSY/2) / CSY * CSY  
    CropLimit_Right= (Default(CropLimit_Right,CropLimit)+ CSX/2) / CSX * CSX
    CropLimit_Bot  = (Default(CropLimit_bot,CropLimit)  + CSY/2) / CSY * CSY
    DissolveSkip=Default(DissolveSkip,5)
    Assert(DissolveSkip>=0 && DissolveSkip<=10,RT_String("%sDissolveSkip 0->10 only",myName))
    LogFn=Default(LogFn,"DBSC_DynaCrop.log")
    LogTMPT=Default(LogTMPT,RT_String("V_NNNN_ = Trim(_S_,_E_).Crop(_CX_,_CY_,_-CW_,_-CH_)._RSZ_\t\t# Crop_W= _CW_ Crop_H= _CH_"))
    Show=Default(Show,False) Debug=Default(Debug,false)
    (Exist(LogFn)) ? RT_FileDelete(LogFn) : NOP         # Delete existing Log
    EOL=Chr(10)
    FND=RT_String("_RSZ_\n_NNNN_\n_S_\n_E_\n_CX_\n_CY_\n_CW_\n_CH_\n_-CW_\n_-CH_\n_W_\n_H_\n_IW_\n_IH_\n")
    TmpLog="~DynaCropTmp_"+RT_LocalTimeString+".log"
    (Exist(TmpLog)) ? RT_FileDelete(TmpLog) : NOP       # Delete existing TmpLog
    GScript("""
        if(SpliceDB!="") {
            if(Exist(SpliceDB)) {
                Fields=RT_DBaseFields(SpliceDB)
                Assert(Fields>=13,RT_String("%sInvalid SpliceDB, at least 12 Int fields and 1 String[256] field\n%s",myName,SpliceDB))
                for(i=0,11) {
                    Assert(RT_DBaseFieldType(SpliceDB,i)==1,RT_String("%sSpliceDB field %d is NOT type Int\n%s",myName,i,SpliceDB))
                }
                Assert(RT_DBaseFieldType(SpliceDB,12)==3,RT_String("%sSpliceDB field 12 is NOT type String\n%s",myName,SpliceDB))
                if(RT_DBaseRecords(SpliceDB) != 0) {
                    TypeString="iiiiiiiiiiiis"
                    if(Fields>13) {
                        for(i=13,Fields-1) {
                            Type=RT_DBaseFieldType(SpliceDB,i)
                            sz=RT_DBaseFieldSize(SpliceDB,i)
                            TypeString=TypeString+Select(Type,"b","i","f",RT_String("s%d",sz),"b","f")
                        }
                    }
                    (DEBUG)?RT_DebugF("Re-Alloc zero record SpliceDB, TypeString=%s",TypeString,name=myName):NOP 
                    RT_DBaseAlloc(SpliceDB,0,TypeString)        
                } else {
                    (DEBUG)?RT_DebugF("Using existing zero record SpliceDB:- %s",SpliceDB,name=myName):NOP 
                }                
            } else {
                (DEBUG)?RT_DebugF("Allocating Default format SpliceDB:- %s",SpliceDB,name=myName):NOP 
                RT_DBaseAlloc(SpliceDB,0,"iiiiiiiiiiiis")        
            }
        }
        RoboCrop(SAMPLES=Max(Round(Records/100.0),32),ignore=0.2,laced=False,rlbt=RLBT,LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG)
        Wid=Width Hit=Height
        ts=RT_ReadTxtFromFile(TmpLog)       Outer_x=RT_NumberValue(ts)
        ts=MidStr(ts,FindStr(ts," ")+1)     Outer_y=RT_NumberValue(ts)
        ts=MidStr(ts,FindStr(ts," ")+1)     Outer_w=RT_NumberValue(ts)
        ts=MidStr(ts,FindStr(ts," ")+1)     Outer_h=RT_NumberValue(ts)
        Outer_XR=c.Width-Outer_x-Outer_w Outer_YB=c.Height-Outer_y-Outer_h
        (DEBUG)?RT_DebugF("Outermost crop Coords = %d,%d,%d,%d (%dx%d)",Outer_x,Outer_y,Outer_XR,Outer_YB,Outer_w,Outer_h,name=myName):NOP
        Start=0 End=-1 SceneNo=0 SceneCount=RT_DBaseGetField(ScanDB,Records-1,3)+1 
        for(n=0,Records-1) {
            Start=n  End=RT_DBaseGetField(ScanDB,n,1)
            if(End-Start+1 >= DissolveSkip*4) {
                DStart=Start+DissolveSkip   DEnd=End-DissolveSkip    
            } Else {
                DStart=Start                DEnd=End
            }
            IGNORE=2.0 # Allow for significant CGI text
            CropC = RoboCrop(thresh=CROPTHRESH,atm=ATM,ignore=IGNORE,laced=False,rlbt=RLBT,start=DStart,end=DEnd,
                \ LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG,LeftAdd=LeftAdd,TopAdd=TopAdd,RightAdd=RightAdd,BotAdd=BotAdd)
            ts=RT_ReadTxtFromFile(TmpLog)       XL=RT_NumberValue(ts)
            ts=MidStr(ts,FindStr(ts," ")+1)     YT=RT_NumberValue(ts)
            ts=MidStr(ts,FindStr(ts," ")+1)     CW=RT_NumberValue(ts)
            ts=MidStr(ts,FindStr(ts," ")+1)     CH=RT_NumberValue(ts)
            XR=(Wid-XL-CW) YB=(Hit-YT-CH)
            (DBUG)?RT_DebugF("XL=%d YT=%d XR=%d YB=%d",XL,YT,XR,YB,name=myName):NOP
            if(XL>CropLimit_Left || YT>CropLimit_Top || XR>CropLimit_Right || YB>CropLimit_Bot) {
                RT_DebugF("*** Trim(%d,%d) Scene #%d, %d,%d,%d,%d",Start,End,SceneNo+1,XL,YT,XR,YB,name=myName)
                    (DEBUG)?RT_DebugF("*** RoboCrop, CROP LIMIT EXCEEDED, Repeating Call with RoboCrop Default AutoThresh & ATM & Ignore=1.0",name=myName):NOP
                    IGNORE=1.0  # Allow for lil bit CGI text
                    CropC = RoboCrop(ignore=IGNORE,laced=False,rlbt=RLBT,start=DStart,end=DEnd,
                        \ LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG,LeftAdd=LeftAdd,TopAdd=TopAdd,RightAdd=RightAdd,BotAdd=BotAdd)
                    ts=RT_ReadTxtFromFile(TmpLog)       TXL=RT_NumberValue(ts)
                    ts=MidStr(ts,FindStr(ts," ")+1)     TYT=RT_NumberValue(ts)
                    ts=MidStr(ts,FindStr(ts," ")+1)     TCW=RT_NumberValue(ts)
                    ts=MidStr(ts,FindStr(ts," ")+1)     TCH=RT_NumberValue(ts)
                    TXR=(Wid-TXL-TCW) TYB=(Hit-TYT-CH)
                    (DBUG)?RT_DebugF("TMP: XL=%d YT=%d XR=%d YB=%d",TXL,TYT,TXR,TYB,name=myName):NOP
                    XL=(XL<=CropLimit_Left) ? XL : (TXL<=CropLimit_Left) ? TXL : Min(XL,TXL)
                    YT=(YT<=CropLimit_Top)  ? YT : (TYT<=CropLimit_Top)  ? TYT : Min(YT,TYT)                
                    XR=(XR<=CropLimit_Right)? XR : (TXR<=CropLimit_Right)? TXR : Min(XR,TXR)
                    YB=(YB<=CropLimit_Bot)  ? YB : (TYB<=CropLimit_Bot)  ? TYB : Min(YB,TYB)
                    (DBUG)?RT_DebugF("XL=%d YT=%d XR=%d YB=%d",XL,YT,XR,YB,name=myName):NOP
                if(XL>CropLimit_Left || YT>CropLimit_Top || XR>CropLimit_Right || YB>CropLimit_Bot) {
                    (DEBUG)?RT_DebugF("**** RoboCrop, LIMIT EXCEEDED, Repeating Call with RoboCrop Default AutoThresh & ATM=1.0 & Ingore=0.2",name=myName):NOP
                    IGNORE=0.2 # No CGI text
                    CropC = RoboCrop(ignore=IGNORE,laced=False,rlbt=RLBT,start=DStart,end=DEnd,ATM=1.0,
                        \ LogFn=TmpLog,LogAppend=false,Debug=ROBOCROP_DEBUG,LeftAdd=LeftAdd,TopAdd=TopAdd,RightAdd=RightAdd,BotAdd=BotAdd)
                    ts=RT_ReadTxtFromFile(TmpLog)       TXL=RT_NumberValue(ts)
                    ts=MidStr(ts,FindStr(ts," ")+1)     TYT=RT_NumberValue(ts)
                    ts=MidStr(ts,FindStr(ts," ")+1)     TCW=RT_NumberValue(ts)
                    ts=MidStr(ts,FindStr(ts," ")+1)     TCH=RT_NumberValue(ts)
                    TXR=(Wid-TXL-TCW) TYB=(Hit-TYT-CH)
                    (DBUG)?RT_DebugF("TMP: XL=%d YT=%d XR=%d YB=%d",TXL,TYT,TXR,TYB,name=myName):NOP
                    XL=(XL<=CropLimit_Left) ? XL : (TXL<=CropLimit_Left) ? TXL : CropLimit_Left 
                    YT=(YT<=CropLimit_Top)  ? YT : (TYT<=CropLimit_Top)  ? TYT : CropLimit_Top                
                    XR=(XR<=CropLimit_Right)? XR : (TXR<=CropLimit_Right)? TXR : CropLimit_Right
                    YB=(YB<=CropLimit_Bot)  ? YB : (TYB<=CropLimit_Bot)  ? TYB : CropLimit_Bot
                    (DBUG)?RT_DebugF("XL=%d YT=%d XR=%d YB=%d",XL,YT,XR,YB,name=myName):NOP
                }
            }
            Curr_w=Wid-XL-XR Curr_h=Hit-YT-YB     
            (DEBUG)?RT_DebugF("Trim(%d,%d) Scene #%d, %d,%d,%d,%d (W=%d,H=%d)",Start,End,SceneNo+1,XL,YT,-XR,-YB,Curr_w,Curr_h,name=myName):NOP
            XX=Outer_x+XL YY=Outer_y+YT WW=Curr_w -(c.Width -Outer_x-XL) HH=Curr_h -(c.Height-Outer_y-YT)
            REP =
                \ Resizer                           + EOL +
                \ RT_NumberString(SceneNo,width=4)  + EOL +
                \ RT_NumberString(Start)            + EOL +
                \ RT_NumberString(End)              + EOL +
                \ RT_NumberString(XX)               + EOL +
                \ RT_NumberString(YY)               + EOL +
                \ RT_NumberString(Curr_w)           + EOL +
                \ RT_NumberString(Curr_h)           + EOL +
                \ RT_NumberString(WW)               + EOL +
                \ RT_NumberString(HH)               + EOL +
                \ RT_NumberString(_W_)              + EOL +
                \ RT_NumberString(_H_)              + EOL +
                \ RT_NumberString(c.Width)          + EOL +
                \ RT_NumberString(c.Height)         + EOL
            LOG=RT_StrReplaceMulti(LogTMPT,FND,REP)
            RT_WriteFile(LogFn,"%s",LOG,append=True)
            if(SpliceDB!="") {
                RT_DBaseExtend(SpliceDB)                       # Add a single record to DBase
                RT_DBaseSetField(SpliceDB,SceneNo,0,Start)     # Scene start frame
                RT_DBaseSetField(SpliceDB,SceneNo,1,End)       # Scene End frame
                RT_DBaseSetField(SpliceDB,SceneNo,2,c.Width)   # Input clip width (same for all DB).
                RT_DBaseSetField(SpliceDB,SceneNo,3,c.Height)  # Input clip Height (same for all DB).                
                RT_DBaseSetField(SpliceDB,SceneNo,4,_W_)       # Output clip resize width (same for all DB).
                RT_DBaseSetField(SpliceDB,SceneNo,5,_H_)       # Output clip resize height (same for all DB).
                RT_DBaseSetField(SpliceDB,SceneNo,6,XX)        # Scene Crop left offset
                RT_DBaseSetField(SpliceDB,SceneNo,7,YY)        # Scene Crop top offset
                RT_DBaseSetField(SpliceDB,SceneNo,8,Curr_w)    # Scene Abs Crop width
                RT_DBaseSetField(SpliceDB,SceneNo,9,Curr_h)    # Scene Abs Crop height
                RT_DBaseSetField(SpliceDB,SceneNo,10,WW)       # Scene signed crop width (width relative)
                RT_DBaseSetField(SpliceDB,SceneNo,11,HH)       # Scene signed crop Height (height relative)
                RT_DBaseSetField(SpliceDB,SceneNo,12,Resizer)  # Resizer String, Same for all DB                                                
            }
            t=c.Trim(Start,End).Crop(XX,YY,WW,HH)
            t=Eval(TResizer)                                            # Resize using optional resizer
            t = (Show) ? t.RT_Subtitle("#%d/%d S=%d E=%d L=%d\nCrop(\aQ%d+\a-%d,\aQ%d+\a-%d,\aQ-%d\a--%d,\aQ-%d\a--%d) : %dx%d",
                    \ SceneNo+1,SceneCount,Start,End,End-Start+1,Outer_x,XL,Outer_y,YT,Outer_XR,XR,Outer_YB,YB,Curr_w,Curr_h,align=5) : t
            c2 = (c2.IsClip()) ? c2++t : t                             # Splice
            SceneNo=SceneNo+1
            n = End                                                        # Next iteration n = End + 1, ie Start of Next Scene        
        }
        RT_DBaseSetID(SpliceDB,0,DBSC_Str2ID("DYNS"))       
        (Exist(TmpLog)) ? RT_FileDelete(TmpLog) : NOP   # Delete temp Log
    """)
    return c2
}
__________________
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 ???

Last edited by StainlessS; 4th February 2015 at 08:04. Reason: Update
StainlessS is offline   Reply With Quote