Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion.

Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules.

 

Go Back   Doom9's Forum > Capturing and Editing Video > Avisynth Usage

Reply
 
Thread Tools Search this Thread Display Modes
Old 4th May 2021, 17:33   #21  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Making auto two pass thing is not so difficult, but will be added at the end.
I'm a bit busy doing other stuff, and slotting bits of this in between. Might be a day or two before I complete.

EDIT: I'll continue until I'm happy with the tint.
__________________
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
Old 4th May 2021, 18:29   #22  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Quote:
Originally Posted by StainlessS View Post
EDIT: I'll continue until I'm happy with the tint.

Wow! Are you an AI cluster, an entire group of humans at yourself, ET..?

Last edited by chmars; 4th May 2021 at 20:04. Reason: translation typos
chmars is offline   Reply With Quote
Old 5th May 2021, 08:11   #23  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Auto 2 Pass. [made simpler/bit faster, using YPlaneMax only, single script]

BLUELED_SingleInstance.avs
Code:
# BLUELED_SingleInstance.avs
############
# Requires Avs+, RT_Stats, Grunt(), FrameSel, plugins.
############
FN = "MBGV0403.MXF"     # Video FileName
##### Freq Changed Config #####
OP       = 1            # 0,1,2,3 ONLY. ::: 0=Tweak Test Area, 1=Create Frames file, 2=Extract Frames, 3=Auto Two pass, pass1 then pass2.
SHOW     = True         # True, shows metrics on OP==1 [False is quicker]
# Less Often changed
TEST_X   = 374          # Test AREA COORDS (Best Even only)
TEST_Y   = 210          #   Ditto
TEST_W   = 372          #   Ditto
TEST_H   = 700          #   Ditto
BITS8    = True         # (True) Metrics and DetTh are as 8 bit range [If change BITS8 then MUST also CHANGE DETTH, ie DETTH*4]
DETTH    = 50           # (50)   Detection Threshold [ 50 is 8 bit thresh, for 10 bit use eg (50*4) ]
YMAXTH   = 0.4          # (0.4)  YPlaneMax Threshold (100.0/256.0) about 0.4 % [Percentage of extreme (noise) pixels to ignore].
VFLIP    = True         # Vertical Flip if upside down
REJECT   = False        # Arg to Pass 2 Extract Frames. [Extract BLUE LED frames instead of good frames if TRUE]
############
Assert(0 <= OP <= 3,"BlueLED: 1 <= OP <= 3")           # Check Valid
FN     = FN.RT_GetFullPathName                         # Ensure full path if not already got one
Frames = FN.RT_FilenameSplit(7) + "_Frames.txt"       # If eg FN="...\MBGV0403.MXF" then Frames = "...\MBGV0403_Frames.txt"

LWLibavVideoSource(FN)                                 # Video Source

############
(VFLIP) ? FlipVertical : NOP

SHOW   = (OP==3) ? False : SHOW                        # Auto Switch OFF SHOW for pass 1 if two pass

if(OP==0)         { BlueLED_Tweak(TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,YMaxTh) }                          # Tweak Coords
else if(OP==1)    { BlueLED_Detect(Frames,TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,DetTh,YMaxTh,Show=SHOW) }  # Detect
else if(OP==2)    { BlueLED_FrameSel(Frames,REJECT) }                                                  # Extract Frames
else {                                                                                                 # Auto 2 Pass
    BlueLED_Detect(Frames,TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,DetTh,YMaxTh,Show=SHOW).RT_ForceProcess()
    BlueLED_FrameSel(Frames,REJECT)
}
Return  Last

############

# OP=0
Function BlueLED_Tweak(clip c,int x,int y,int w,int h,Bool "Bits8",Float "YMaxTh") {
# Shows YPlaneMax(YMaxTh) of Test Area (x,y,w,h, marked in yellow)
# If Bits8, then Test Area is converted to 8 bit Y8, and metrics shown in range 0->255
    Bits8  = Default(Bits8,False)                      # If True, then metrics are for 8 bit
    YMaxTh = Default(YMaxTh,0.4)                       # YPlaneMax Threshold (%)
    tc = c.Crop(x,y,w,h)                               # Test Area
    tc = Bits8 ? tc.ConvertBits(8).ConvertToY8 : tc    # 8 Bit if requested
    SSS="""
        Subtitle(String(current_frame) + "] YMax=" + String(tc.YPlaneMax(threshold=YMaxTh)) , Size=48)
    """
    c.ScriptClip(SSS, Args="tc,YMaxTh",Local = true)
    OverLay(c.BlankClip(Length=1,Width=w,Height=h,Color=$FFFF00),x=x,y=y,Opacity=0.1) # Mark Test Area in yellow
    Return Last
}

# OP=1
Function BlueLED_Detect(clip c,String Fn, int x,int y,int w,int h,Bool "Bits8",int "DetTh",Float "YMaxTh", Bool "Show") {
    bpc    = c.BitsPerComponent()                          # Bit Depth of c clip
    Bits8  = Default(Bits8,False)                          # If True, then DetTh and metrics are for 8 bit
    DetTh  = Default(DetTh,Bits8?50:50*BitLShift(1,bpc-8)) # Detect Threshold. Compliant with Bits8 arg.
    YMaxTh = Default(YMaxTh,0.4)                           # YPlaneMax Threshold (%)
    Show   = Default(Show,False)
    Assert(fn!="","BlueLED_Detect: Fn Cannot be ''")
    Fn = Fn.RT_GetFullPathName
    RT_FileDelete(Fn)
    tc = c.Crop(x,y,w,h)
    tc = Bits8 ? tc.ConvertBits(8).ConvertToY8 : tc
    SSS="""
        YMaxCur = tc.YPlaneMax(YMAXTH)                     # YMax for current frame
        YMaxPrv = tc.YPlaneMax(YMAXTH,offset=-1)           # YMax for previous frame
        T = (YMaxCur <  DetTh && (YMaxPrv >= DetTh || current_frame==0))
        (T) ? RT_WriteFile(Fn,"%d    # %d",current_frame,YMaxCur,Append=current_frame>0) : NOP
        if(Show) {
            s = RT_String("%d] %s\\nYMaxCur=%d\\nYMaxPrv=%d\\n(DetTh=%d)",current_frame,T?"Bingo":"",YMaxCur,YMaxPrv,DetTh)
            Subtitle(s,Size=48,lsp=0)
        }
        Return Last
    """
    c.ScriptClip(SSS, Args="tc,DetTh,YMaxTh,Fn,Show",Local = true)
    Return Last
}

# OP=2
Function BlueLED_FrameSel(clip c,String Frames,Bool "Reject") { # Extract Frames from clip c
    Reject = Default(Reject,False)
    Assert(Frames!="","BlueLED_FrameSel: Frames Cannot be ''")
    Frames = Frames.RT_GetFullPathName                 # Add full path if not already got one
    Return FrameSel(c,Cmd=Frames,Ordered=True,reject=Reject)
}
Updated
__________________
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; 14th May 2021 at 01:36. Reason: Updated
StainlessS is offline   Reply With Quote
Old 5th May 2021, 17:17   #24  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Gorgeous! Fast, Fluid, Clean, A Masterpiece!
I'd like to say something, a remark, demand....
But I don't find anything!
Only huge thanks!
chmars is offline   Reply With Quote
Old 5th May 2021, 17:40   #25  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Oh yes,
-automatic bitdepth
-detection zone always at the same place, relatively to the resolution.
But this is just to be maniac. We can also very easily comment/uncomment prepared lines.

The 403 sample file is 10 bit. Did you try the script while set on 8bit as it appears above? Seems to work too.

Cheers,


Edit:
I'd like to share the LED system, present the capture setup and so on, if it might interest someone.
But where?
"Avs usage", as it wouldn't work without AVS
or
"hardware players"? A super8 projector is a hardware player isn't it?

Last edited by chmars; 5th May 2021 at 17:54. Reason: forgot question
chmars is offline   Reply With Quote
Old 5th May 2021, 18:19   #26  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
I'm gonna go feed ducks now, but before I do,

If you would like to be able to group select a bunch of your video files and auto batch create scripts with names already inserted [using a template].
See here [Avisynthesizer_Mod]:- https://forum.doom9.org/showthread.php?t=166820
Install it, and run the "Install_SendTo.Cmd" command.

Then,
Config your working script as desired [probably auto mode],
then on very top of script change to [ony the "#ASYNTHER" line required first, and ,also the FN = "___FILE___" required somewhere]
Code:
#ASYNTHER BLUELED_MAGIC_STUFF
# Requires Avs+, RT_Stats, Grunt(), FrameSel, plugins.
############
FN = "___FILE___"
Then save in the Avisynthesizer_Mod TEMPLATE directory as "BlueLED_Magic.avst" # Some name ending with ".avst"

BLUELED_MAGIC_STUFF can be any valid name [no spaces, as for an avs variable name]

As above, the BLUELED_MAGIC_STUFF name will be presented in a dialog box as a script selection option,
where multiple script templates are in the template directory. [you get to pick which script template is wanted]
__________________
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; 5th May 2021 at 18:27.
StainlessS is offline   Reply With Quote
Old 6th May 2021, 22:07   #27  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Ok, thank you, instructions saved for later.
At the moment, too exited using your script which is the key to Fred's + variants (John's, MT...). Finally trying them after days of reading about them!
AND:
Your script confirmed the LED system is absolutely worth it: no frames loss, fast, no blended/duplicated frames, 100% frame accurate.
This is huge. Thanks again.
chmars is offline   Reply With Quote
Old 11th May 2021, 20:53   #28  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Changed from
Code:
Frames = FN.RT_FilenameSplit(14) + "_Frames.txt"       # If eg FN="...\MBGV0403.MXF" then Frames = "...\MBGV0403_Frames.txt"
to
Code:
Frames = FN.RT_FilenameSplit(15) + "_Frames.txt"       # If eg FN="...\MBGV0403.MXF" then Frames = "...\MBGV0403_Frames.txt"
(15) instead of (14) to have the whole path, including drive, in case the source is located in another drive than the script.

Can't say how much I 'm happy with this script!
chmars is offline   Reply With Quote
Old 11th May 2021, 21:37   #29  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Oh Shit!, it should have been
Code:
Frames = FN.RT_FilenameSplit(7) + "_Frames.txt"       # If eg FN="...\MBGV0403.MXF" then Frames = "...\MBGV0403_Frames.txt"
sorry,
Code:
RT_FilenameSplit(string filename,int "get"=15)
 Splits the un-named filename string into component parts selected by 'get' bit flags arg and returns the
 parts joined together.
 'Get' (default 15, 1 -> 15), If set, Bit 0=DRIVE, 1=Dir, 2=Name, 4=Extension.
 Add 1 for Drive (bit 0), add 2 for Dir (bit 1), add 4 for Name (bit 2), add 8 for Extension (bit 3).
 Some combinations do not make sense, eg Drive + Extension (1+8=9). Below sensible options.
   1  = Drive (includes trailing ':')
   2  = Dir (includes trailing '\')
   3  = Drive + Dir
   4  = Name
   6  = Dir + Name
   7  = Drive + Dir + Name
   8  = Extension (includes leading '.')
   12 = Name + Extension
   14 = Dir + Name + Extension
   15 = Drive + Dir + Name + Extension
 Assuming a current working directory of eg "D:\avs\avi\", 'filename'="test.avi" and 'get'=15, returns "D:\avs\avi\test.avi",
 so given a relative filename and default 'get'=15, is equivalent to RT_GetFullPathName(filename).
ie without extension, not without drive.

But 15 OK if you dont mind the ".MXF_Frames.txt"" part.
__________________
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; 11th May 2021 at 21:42.
StainlessS is offline   Reply With Quote
Old 11th May 2021, 21:47   #30  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Nono, you're right, I read too fast.
Now using with AVSPLUS370_x64: I don't know if it is correct but I also added in the beginning:
Code:
SetMemoryMax(6000)
threads = 5
SetFilterMTMode("DEFAULT_MT_MODE", 2)
and at the end (before functions):
Code:
Prefetch(threads)
Have to tweak the values though.
chmars is offline   Reply With Quote
Old 11th May 2021, 22:09   #31  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
It probably dont matter a damn with that script, assuming that you're writing result to disk.

EDIT:
Pass1, does little more than pull in frames from source (which needs to be sequential) filter,
only samples YMax for each frame via Scriptclip.
Pass2, does nothing but read frames flagged in frames file from the source filter.

SetMemoryMax(6000), just reserves loads of RAM that will not be needed, and
reduces RAM available to other processes.
Suggest skip all of that pre-script and post-script.

EDIT: OK, it also resizes and colorspace converts detect clip [which I forgot about] but maybe still not
a great deal of difference, you could test and see if any advantage at all.
__________________
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; 11th May 2021 at 22:23.
StainlessS is offline   Reply With Quote
Old 11th May 2021, 22:18   #32  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Ok Sir, thanks for explaining.
First think, then do...
chmars is offline   Reply With Quote
Old 12th May 2021, 23:25   #33  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
Made some tests to tax the LED system with StainleSSS script.

6 takes, same footage, same fstop, same focus, same everything except obturation speeds: from 1/100 to 1/6000.
Shot at 50 fps while projected at 19.2fps
6 H-Stacked together to compare.
Text in the middle to offer a stable reference when looking at the video frame by frame.
Autolevels, autowhite (no satisfaction/better than nothing), slight sharpening.

Low res screenshot:


Video here
The system works with all these speeds. At 1/50th of second, the led becomes to be present on too many pictures, of course, as shot at 50fps.

Two interesting phenomena:
.Disapointing: lot of gate-wave. The image is dancing more than I thought.
-Sharpness difference not so big.

IIRC, Johnmeyer said, he is shooting his footages at 1/1000, I thought slower speeds would be more unsharp because of vibrations or film instability. There is a difference however (frame 106).

Concerning the gate-wave, there might be a vibration maybe introduced by the truncated blade disk.
I saw the LED moving too on the full images, not only the film and the gate.
There is a part of the disk left to trigger the speed calculation by the microcontroler into the projector. Disk is complicated to remove on this model but a must do.

Last edited by chmars; 22nd May 2021 at 14:39.
chmars is offline   Reply With Quote
Old 13th May 2021, 21:13   #34  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Here is another version of the original DBase script, converted to act like the Auto 2 Pass script.
DB_BLUELED_SingleInstance.avs
Code:
# DB_BLUELED_SingleInstance.avs

/*
    Requires, AVS+, RT_Stats, Grunt(), FrameSel, CallCmd, plugins
    [CallCmd Optional, will auto delete DBase on clip closure if installed]
    Detects Blue LED's, selects mid frame of those frames between blue LEDs,
       when SEL2ND==True and frame count between Blue LEDs are even, then selects the later middle frame rather than default earlier middle frame.
    Writes only single middle frame between BLUE frames.
        Intent, with greater number of RAW I/P frames captured [greater than necessary], selects middle frame from all the good frames, so that
    more chance of selected frame being stationary [un-wobbly].

    May need to adjust AREA Coords where BLUE expected
    DBase Single Instance Version.
*/

############
FN = "MBGV0403.MXF"     # Video FileName
##### Freq Changed Config #####
OP       = 3            # 0,1,2,3 ONLY. ::: 0=Tweak Test Area, 1=Create Frames file, 2=Extract Frames, 3=Auto Two pass, OP=1 then OP=2.
SHOW     = True         # True, shows metrics on OP==1 [False is quicker, Will auto switch OFF SHOW when OP==3]
# Less Often changed
TEST_X   = 374          # Test AREA COORDS (Best Even only)
TEST_Y   = 210          #   Ditto
TEST_W   = 372          #   Ditto
TEST_H   = 700          #   Ditto
BITS8    = True         # (True) Metrics and DetTh are as 8 bit range [If change BITS8 then MUST also CHANGE DETTH, ie DETTH*4]
DETTH    = 50           # (50)   Detection Threshold [ 50 is 8 bit thresh, for 10 bit use eg (50*4) ]
YMAXTH   = 0.4          # (0.4)  YPlaneMax Threshold (100.0/256.0) about 0.4 % [Percentage of extreme (noise) pixels to ignore].
VFLIP    = True         # Vertical Flip if upside down
REJECT   = False        # Arg to Pass 2, Extract Frames. [Extract BLUE LED frames instead of good frames if TRUE]
###
SEL2ND   = False        # When NonBlue count is EVEN, false selects earlier middle frame, True select later middle frame.
############
Assert(0 <= OP <= 3,"DB_BLUELED_SingleInstance: 1 <= OP <= 3")           # Check Valid
FN     = FN.RT_GetFullPathName                         # Ensure full path if not already got one
Frames = FN.RT_FilenameSplit(7) + "_Frames.txt"        # If eg FN="...\MBGV0403.MXF" then Frames = "...\MBGV0403_Frames.txt"

LWLibavVideoSource(FN)                                 # Video Source

############
(VFLIP) ? FlipVertical : NOP

SHOW   = (OP==3) ? False : SHOW                        # Auto Switch OFF SHOW for pass 1 if two pass

if(OP==0)         { BlueLED_Tweak(TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,YMaxTh) }                                    # Tweak Coords
else if(OP==1)    { DB_BlueLED_Detect(Frames,TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,DetTh,YMaxTh,SEL2ND,Show=SHOW) }  # Detect
else if(OP==2)    { BlueLED_FrameSel(Frames,REJECT) }                                                            # Extract Frames
else {                                                                                                           # Auto 2 Pass
    DB_BlueLED_Detect(Frames,TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,DetTh,YMaxTh,SEL2ND,Show=SHOW).RT_ForceProcess()
    BlueLED_FrameSel(Frames,REJECT)
}
Return  Last

############

# OP=0
Function BlueLED_Tweak(clip c,int x,int y,int w,int h,Bool "Bits8",Float "YMaxTh") {
# Shows YPlaneMax(YMaxTh) of Test Area (x,y,w,h, marked in yellow)
# If Bits8, then Test Area is converted to 8 bit Y8, and metrics shown in range 0->255
    Bits8  = Default(Bits8,False)                      # If True, then metrics are for 8 bit
    YMaxTh = Default(YMaxTh,0.4)                       # YPlaneMax Threshold (%)
    tc = c.Crop(x,y,w,h)                               # Test Area
    tc = Bits8 ? tc.ConvertBits(8).ConvertToY8 : tc    # 8 Bit if requested
    SSS="""
        Subtitle(String(current_frame) + "] YMax=" + String(tc.YPlaneMax(threshold=YMaxTh)) , Size=48)
    """
    c.ScriptClip(SSS, Args="tc,YMaxTh",Local = true)
    OverLay(c.BlankClip(Length=1,Width=w,Height=h,Color=$FFFF00),x=x,y=y,Opacity=0.1) # Mark Test Area in yellow
    Return Last
}

# OP=1
Function DB_BlueLED_Detect(clip c,String Fn, int x,int y,int w,int h,Bool "Bits8",int "DetTh",Float "YMaxTh",Bool "SEL2ND", Bool "Show") {
# Fn = Frames file.
    bpc    = c.BitsPerComponent()                          # Bit Depth of c clip
    Bits8  = Default(Bits8,False)                          # If True, then DetTh and metrics are for 8 bit
    DetTh  = Default(DetTh,Bits8?50:50*BitLShift(1,bpc-8)) # Detect Threshold. Compliant with Bits8 arg.
    YMaxTh = Default(YMaxTh,0.4)                           # YPlaneMax Threshold (%)
    SEL2ND = Default(SEL2ND,False)
    Show   = Default(Show,False)
    Assert(fn!="","DB_BlueLED_Detect: Fn Cannot be ''")
    Fn = Fn.RT_GetFullPathName
    fn.RT_FileDelete
    tc = c.Crop(x,y,w,h)
    tc = Bits8 ? tc.ConvertBits(8).ConvertToY8 : tc
    DB = FN.RT_FilenameSplit(7) + ".DB"                    # If eg FN="...\MBGV0403.MXF" then DB = "...\MBGV0403.DB"
    TypeStr = "iiiii"
    RT_DBaseAlloc(DB,c.FrameCount,TypeStr)
    HasCallCmd  =RT_FunctionExist("CallCmd")
    ############ DBase Field Index's, Use Glbal Vars rather than numeric constants, easier during Development.
    Global STAT_FLD   = 0   # 0=Unknown, 1=BLUE, 2=Non Blue Frame(Not chosen),  3=Non Blue chosen Frame.
    Global YMAX_FLD   = 1   # YMax for current frame
                            # Below, Valid only When STAT==2 OR STAT==3 (NOT BLUE_LED Stat==1)
    Global FRM_S_FLD  = 2   #   Ditto, 1st frame of current non BLUE sequence
    Global FRM_M_FLD  = 3   #   Ditto  Chosen frame from current Non Blue sequence (writen to Frames file)
    Global FRM_E_FLD  = 4   #   Ditto Last frame of current non BLUE sequence
    SSS="""
        n=current_frame
        Stat = RT_DBaseGetField(DB,n,STAT_FLD)
        if(Stat == 0) { # Unknown
            YMaxCurr = tc.YPlaneMax(YMAXTH)
            if(YMaxCurr >= DetTh) { # BLUE
                Stat=1
                RT_DBaseSet(DB,n,Stat,YMaxCurr,   -1,-1,-1)          # set BLUE, + invalid fields
            } Else { # NOT BLUE
                RT_DBaseSetField(DB,n,YMAX_FLD,YMaxCurr)             # set non-BLUE YMax [set only single field]
                Frame_S = n
                For(i=n-1,0,-1) { # Step Backwards looking for previous BLUE
                    # i is Always either KNOWN BLUE or Unknown
                    Stat = RT_DBaseGetField(DB,i,STAT_FLD)
                    if(Stat == 0) { # Unknown
                        current_frame = i    # The Frame we will test for YMax
                        YMaxI = tc.YPlaneMax(YMAXTH)
                        if(YMaxI  >= DetTh) { # Is BLUE
                            RT_DBaseSet(DB,i,1,YMaxI,   -1,-1,-1)    # set BLUE, YMax, + invalid fields
                            Frame_S = i + 1 # Start frame = BLUE + 1
                            i = 0   # Break
                        } Else { # Non BLUE
                            RT_DBaseSetField(DB,i,YMAX_FLD,YMaxI)    # set non-BLUE YMax [set only single field]
                            Frame_S = i
                        }
                    } else { # KNOWN BLUE
                        Assert(Stat==1,"Internal Error #1 Stat="+String(Stat))
                        Frame_S = i + 1 # Start frame = BLUE + 1
                        i = 0   # Break
                    }
                }
                Frame_E = n
                For(i=n+1,FrameCount-1) { # Step Forwards looking for next BLUE
                    # i is Always either KNOWN BLUE or Unknown
                    Stat = RT_DBaseGetField(DB,i,STAT_FLD)
                    if(Stat == 0) { # Unknown
                        current_frame = i    # The Frame we will test for YMax
                        YMaxI = tc.YPlaneMax(YMAXTH)
                        if(YMaxI >= DetTh) {
                            RT_DBaseSet(DB,i,1,YMaxI,  -1,-1,-1)     # set BLUE, YMax, + invalid fields
                            Frame_E = i - 1 # End frame = BLUE - 1
                            i = FrameCount-1   # Break
                        } Else { # Non BLUE
                            RT_DBaseSetField(DB,i,YMAX_FLD,YMaxI)    # set non-BLUE YMax [set only single field]
                            Frame_E = i
                        }
                    } else { # KNOWN BLUE
                        Assert(Stat==1,"Internal Error #2 Stat="+String(Stat))
                        Frame_E = i - 1    # End frame = BLUE - 1
                        i = FrameCount-1   # Break
                    }
                }
                SelIx = (Frame_E - Frame_S) / 2
                Frame_M = (SEL2ND) ? Frame_E-SelIx : Frame_S + SelIx    # Earlier OR Later middle frame to pick
                for(i=Frame_S,Frame_E) { # Scan and set, all NON-BLUE sequence, using DB pre-written YMax
                    YMaxI = RT_DBaseGetField(DB,i,YMAX_FLD)   # Get pre-stored YMax for i frame
                    Stat = (i==Frame_M)?3:2 # Chosen frame mid frame ?
                    RT_DBaseSet(DB,i,Stat,YMaxI, Frame_S,Frame_M,Frame_E)  # Set all data for frame i, in current NON-BLUE sequence.
                }
                current_frame = n  # Restore current_frame
                Stat = (n==Frame_M)?3:2    # Status of current frame [Non Blue, 2=not chosen or 3=chosen]
            }
        } # End, if(Stat == 0)
        # Here, Stat=1=BLUE, =2=non-blue Frame - not chosen, =3=Chosen Frame
        if(Stat==1) { # BLUE
            if(SHOW) {
                YMax = RT_DBaseGetField(DB,n,YMAX_FLD)
                Subtitle(RT_String("%d] %d",n,YMax),Size=48)
            }
        } else if(Stat==3 || SHOW) {
            YMax = RT_DBaseGetField(DB,n,YMAX_FLD)
            Frame_S = RT_DBaseGetField(DB,n,FRM_S_FLD)
            Frame_E = RT_DBaseGetField(DB,n,FRM_E_FLD)
            if(Stat == 2) { # SHOW=true
                Subtitle(RT_String("%d]  %d : S=%d : E=%d : Len=%d",n,YMax,Frame_S,Frame_E,Frame_E-Frame_S+1),Size=48,lsp=0)
            } else { # Stat=3, # Write To Frames File
                if(SEL2ND && n != Frame_S + ((Frame_E - Frame_S) / 2)) {
                    RT_WriteFile(fn,"%d    # %d : S=%d : E=%d : Len=%d # 2nd of middle pair",n,YMax,Frame_S,Frame_E,Frame_E-Frame_S+1,Append=n!=0)
                    if(SHOW) {
                        Subtitle(RT_String("%d]  %d : S=%d : E=%d : Len=%d\\nWriting, 2nd of middle pair",
                            \ n,YMax,Frame_S,Frame_E,Frame_E-Frame_S+1),Size=48,lsp=0)
                    }
                } else {
                    RT_WriteFile(fn,"%d    # %d : S=%d : E=%d : Len=%d",n,YMax,Frame_S,Frame_E,Frame_E-Frame_S+1,Append=n!=0)
                    if(SHOW) {
                        Subtitle(RT_String("%d]  %d : S=%d : E=%d : Len=%d\\nWriting",
                            \ n,YMax,Frame_S,Frame_E,Frame_E-Frame_S+1),Size=48,lsp=0)
                    }
                }
            }
        }
        Return Last
    """
    c.ScriptClip(SSS, Args="tc,DetTh,YMaxTh,Fn,Show,DB,SEL2ND",Local = true)
    HasCallCmd?CallCmd(close=RT_String("""CMD /C chcp 1252 && del "%s" """,DB), hide=true, Synchronous=7):NOP  # Auto Delete DBase if CallCmd available
    Return Last
}

# OP=2
Function BlueLED_FrameSel(clip c,String Frames,Bool "Reject") { # Extract Frames from clip c
    Reject = Default(Reject,False)
    Assert(Frames!="","BlueLED_FrameSel: Frames Cannot be ''")
    Frames = Frames.RT_GetFullPathName                 # Add full path if not already got one
    Return FrameSel(c,Cmd=Frames,Ordered=True,reject=Reject)
}
Maybe I've misunderstood how the capture machine works [and I aint re-read description].
ie
Quote:
Writes only single middle frame between BLUE frames.
Intent, with greater number of RAW I/P frames captured [greater than necessary], selects middle frame from all the good frames, so that
more chance of selected frame being stationary [un-wobbly].
Maybe is never stationary. [but for any machine that works as I maybe mistakenly thought, this script should work fine]

Also, the SEL2ND arg (when true) shows that when 2 frames between BLUE LED frames, the earlier one is probably always the better one.
[ie set SEL2ND=true, shows bluish tinge on some frames, where LED not fully extinguished, whereas SEL2ND=False, ALL GOOD Black LED section of frame.]

EDIT: Fragment of Frames file, [Selected_Frame # In-Comments: YMax, then NonBLUE sequence info]
Code:
0    # 32 : S=0 : E=0 : Len=1
2    # 32 : S=2 : E=3 : Len=2
5    # 32 : S=5 : E=6 : Len=2
8    # 32 : S=8 : E=8 : Len=1
11    # 32 : S=11 : E=11 : Len=1
13    # 32 : S=13 : E=14 : Len=2
16    # 32 : S=16 : E=17 : Len=2
19    # 32 : S=19 : E=19 : Len=1
22    # 31 : S=22 : E=22 : Len=1
24    # 31 : S=24 : E=25 : Len=2
27    # 31 : S=27 : E=28 : Len=2
30    # 31 : S=30 : E=30 : Len=1
32    # 32 : S=32 : E=33 : Len=2
35    # 32 : S=35 : E=36 : Len=2
38    # 32 : S=38 : E=39 : Len=2
41    # 32 : S=41 : E=41 : Len=1
44    # 31 : S=44 : E=44 : Len=1
46    # 31 : S=46 : E=47 : Len=2
49    # 31 : S=49 : E=49 : Len=1
__________________
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; 13th May 2021 at 21:43.
StainlessS is offline   Reply With Quote
Old 13th May 2021, 21:40   #35  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
I think you understood correctly how it works. (At least your script did perfectly )
The footage moves normally, as in any projector. Only the blades are removed (in exception of a small part of one).
Excuse my question: What is the advantage of the DB version over the other one?
chmars is offline   Reply With Quote
Old 13th May 2021, 21:51   #36  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
If each frame exposed [ie BLUE LED NOT Lit up] for longer time, and so more nonBLUE frames between BLUE's, then pick middle of the
nonBLUE's, more chance of selected frame being still, maybe.
Maybe could arrage it so that you got eg 4 or 5 NonBLUE frames between BLUE frames, it picks the middle nonBLUE.
Where 4 NonBLUE [ie even number], SEL2ND=FALSE would pick 2nd frame, and TRUE would pick 3rd.
If eg 5 [Odd number of] NonBLUE frames, then would pick the middle 3RD one. [SEL2ND ignored, only used where EVEN]

EDIT: 4 or 5, are just numbers picked out of hat.
EDIT: Number of consecutive BLUE's dont matter.

Frames file fragment when SEL2ND=True [where YMAX > 32 then LED is a bit blueish]
Code:
0    # 32 : S=0 : E=0 : Len=1
3    # 32 : S=2 : E=3 : Len=2 # 2nd of middle pair
6    # 46 : S=5 : E=6 : Len=2 # 2nd of middle pair    ### A Bit Blu-ish
8    # 32 : S=8 : E=8 : Len=1
11    # 32 : S=11 : E=11 : Len=1
14    # 32 : S=13 : E=14 : Len=2 # 2nd of middle pair
17    # 37 : S=16 : E=17 : Len=2 # 2nd of middle pair    ### A Bit Blu-ish
19    # 32 : S=19 : E=19 : Len=1
22    # 31 : S=22 : E=22 : Len=1
25    # 35 : S=24 : E=25 : Len=2 # 2nd of middle pair    ### A Bit Blu-ish
28    # 38 : S=27 : E=28 : Len=2 # 2nd of middle pair    ### A Bit Blu-ish
30    # 31 : S=30 : E=30 : Len=1
33    # 31 : S=32 : E=33 : Len=2 # 2nd of middle pair
36    # 32 : S=35 : E=36 : Len=2 # 2nd of middle pair
39    # 44 : S=38 : E=39 : Len=2 # 2nd of middle pair    ### A Bit Blu-ish
41    # 32 : S=41 : E=41 : Len=1
44    # 31 : S=44 : E=44 : Len=1
47    # 31 : S=46 : E=47 : Len=2 # 2nd of middle pair
49    # 31 : S=49 : E=49 : Len=1
Above in BLUE is comment for D9 post, not in frames file.
EDIT: Above and comparison with SEL2ND=False in earleir post shows that where there are 2 detected
NonBLUE frames, the earlier one is the better choice. [SEL2ND=False]
It also looks like anything above 32 is probably BLUE LED, although a bit of a margin is probably a good idea.
(Based only on those first few frames)
__________________
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; 13th May 2021 at 22:41.
StainlessS is offline   Reply With Quote
Old 13th May 2021, 22:32   #37  |  Link
chmars
Registered User
 
Join Date: Apr 2021
Posts: 128
I don't want you to loose your time. Perfect as it is!
Quote:
Originally Posted by StainlessS View Post
If each frame exposed for longer time, and so more nonBLUE frames between BLUE's, then pick middle of the nonBLUE's, more chance of selected frame being still, maybe.
Maybe a good solution to get more stability.
But time consuming if projecting slower.
In this case, I'd more reconsider a solution like Fred's (frame by frame, machine vision cam) but would have to abandon my idea. First, I'll try to stabilize the projector better.

But... about the DB/noDB versions of your script, what is the advantage of using a DB?
EDIT: Oh, I see. The DB contains more precise informations to know what happens, debug or adjust better.

Last edited by chmars; 13th May 2021 at 22:36. Reason: didn't see last edit
chmars is offline   Reply With Quote
Old 13th May 2021, 22:53   #38  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Quote:
Originally Posted by chmars View Post
EDIT: Oh, I see. The DB contains more precise informations to know what happens, debug or adjust better.
Yes there is that too. With non DB version, we have no idea how long any BLUE or NONBLUE sequence is, although we could add YMax output to Frames File. [FrameSel() ignores '#' comments in Frames File]

You could use the DB ver$ if cap contraption changed, to see numbers,
and if you still always want first NONBLUE frame after any BLUE frame, then use the other script.
__________________
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
Old 14th May 2021, 01:38   #39  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Post #23, BLUELED_SingleInstance.avs [Non-DB] updated. Added YMax in comments to frames file.

Code:
0    # 32
2    # 32
5    # 32
8    # 32
11    # 32
13    # 32
16    # 32
19    # 32
22    # 31
24    # 31
27    # 31
30    # 31
32    # 32
35    # 32
38    # 32
41    # 32
44    # 31
46    # 31
49    # 31
EDIT: I wonder if the YMAX numbers from DB ver$ with SEL2ND=False/True, would indicate that the
LED is quicker at switching OFF, than it is at switching ON [LED brightness change speed].
(or maybe it just happens to be the timing of mechanical switching as implemented your LED cap contraption).
Ie, the 1st nonBLUE YMAX is pretty consistant about 31 or 32, whereas when SEL2ND=True and nonBLUE length==2,
2nd nonBLUE is sometimes a bit Blue-ish, somewhat greater than 32 [46 on frame 6, and 44 on frame 39, in post #36].

EDIT: You can see the blue-ish stuff [DB VER$, OP=3], by setting SEL2ND=False and viewing[not blue-ish],
then set SEL2ND=true, and view again[blue-ish].
__________________
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; 14th May 2021 at 02:27.
StainlessS is offline   Reply With Quote
Old 14th May 2021, 16:17   #40  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 11,042
Mod non DB version, not so much for chmars BLUE_LED gizmo, but flexible detector for maybe some other cap contraption.
DB mod version will follow at some point.
Code:
# BLUELED_SingleInstance_Mod.avs # https://forum.doom9.org/showthread.php?p=1942862#post1942862
############
# Requires Avs+, RT_Stats, Grunt(), FrameSel, plugins.
# Mod version:
#   Can use YMODE:=   0=YPlaneMin, 1=YPlaneMax, 2=YPlaneMinMaxDifference, 3=YPlaneMedian, 4=AverageLuma, detection modes on YPlane, result in YDet.
#   Also,   DETMODE:= 0="YDet<DetTh", 1="YDet>DetTh", 2="YDet<=DetTh", 3="YDet>=DetTh", 4="YDet==DetTh", 5="YDet!=DetTh", detect logic comparitor.
#      Whether above mods are of any other use, depends upon how your cap contraption indicates "A Moving Frame", or a "Still Frame".
#      Where YMODE=1 [YPlaneMax], and DETMODE=0 [YDet < DetTh], is same as original script version.
#         (eg, where White LED flags Good frame rather than bad moving frame, then could use YMODE=0 [YPlaneMin] and DEETMODE=1 [YDet > DetTh])
#  Intent, that the script can be of use with other cap contraption devices other than chmars BLUE_LED gizmo.
############
FN = "MBGV0403.MXF"     # Video FileName
##### Freq Changed Config #####
OP       = 0            # 0,1,2,3 ONLY. ::: 0=Tweak Test Area, 1=Create Frames file, 2=Extract Frames, 3=Auto Two pass, pass1 then pass2.
SHOW     = True         # True, shows metrics on OP==1 [False is quicker]
# Less Often changed
TEST_X   = 374          # Test AREA COORDS (Best Even only)
TEST_Y   = 210          #   Ditto
TEST_W   = 372          #   Ditto
TEST_H   = 700          #   Ditto
BITS8    = True         # (True) Metrics and DetTh are as 8 bit range [If change BITS8 then MUST also CHANGE DETTH, ie DETTH*4]
YMODE    = 1            # (1) 0=YPlaneMin, 1=YPlaneMax, 2=YPlaneMinMaxDifference, 3=YPlaneMedian, 4=AverageLuma.
                        #   For BLUELED we use YMODE=1 ie YDet=YPlaneMax on Area TEXT_X,TEST_Y,TEST_W,TEST_H.
                        #   YTh only used for YPlaneMin, YPlaneMax, YPlaneMinMaxDifference, others dont have a threshold arg.
YTH      = 0.4          # (0.4)  YPlaneMax Threshold (100.0/256.0) about 0.4 % [Percentage of extreme (noise) pixels to ignore].
DETMODE  = 0            # (0) Comparison mode for Detect of BLACK(non BLueLED) frames. Is BlueLED where NOT BLACK.
                        #     0="YDet<DetTh", 1="YDet>DetTh", 2="YDet<=DetTh", 3="YDet>=DetTh", 4="YDet==DetTh", 5="YDet!=DetTh"
DETTH    = 50           # (50)   Detection Threshold [ 50 is 8 bit thresh, for 10 bit use eg (50*4) ]
#
VFLIP    = True         # Vertical Flip if upside down
REJECT   = False        # Arg to Pass 2 Extract Frames. [Extract BLUE LED frames instead of good frames if TRUE]
############
Assert(0 <= OP <= 3,"BlueLED: 1 <= OP <= 3")           # Check Valid
Assert(0 <= YMODE <= 4,"BlueLED: 0 <= YMODE <= 4")     # Check Valid
Assert(0 <= DETMODE <= 5,"BlueLED: 0 <= DETMODE <= 5") # Check Valid
FN     = FN.RT_GetFullPathName                         # Ensure full path if not already got one
Frames = FN.RT_FilenameSplit(7) + "_Frames.txt"        # If eg FN="...\MBGV0403.MXF" then Frames = "...\MBGV0403_Frames.txt"

LWLibavVideoSource(FN)                                 # Video Source

############
(VFLIP) ? FlipVertical : NOP

SHOW   = (OP==3) ? False : SHOW                        # Auto Switch OFF SHOW for pass 1 if two pass

if(OP==0)         { BlueLED_Tweak(TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,YMODE,YTH) }                          # Tweak Coords
else if(OP==1)    { BlueLED_Detect(Frames,TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,YMODE,YTH,DETMODE,DetTh,Show=SHOW) }  # Detect
else if(OP==2)    { BlueLED_FrameSel(Frames,REJECT) }                                                  # Extract Frames
else {                                                                                                 # Auto 2 Pass
    BlueLED_Detect(Frames,TEST_X,TEST_Y,TEST_W,TEST_H,BITS8,YMODE,YTH,DETMODE,DetTh,Show=SHOW).RT_ForceProcess()
    BlueLED_FrameSel(Frames,REJECT)
}
Return  Last

############

# OP=0
Function BlueLED_Tweak(clip c,int x,int y,int w,int h,Bool "Bits8",Int "YMODE",Float "YTh") {
# Shows YPlane value (YPlane Mode selected by YMODE) of Test Area (x,y,w,h, marked in yellow)
# If Bits8, then Test Area is converted to 8 bit Y8, and metrics shown in range 0->255
    Bits8  = Default(Bits8,False)                      # If True, then metrics are for 8 bit
    YMODE  = Default(YMODE,1)                          # Default 1=YPLaneMax
    YTh    = Default(YTh,0.4)                          # YPlaneMax Threshold (%)
    Assert(0 <= YMODE <= 4,"BlueLED_Tweak: 0 <= YMODE <= 4")
    tc = c.Crop(x,y,w,h)                               # Test Area
    tc = Bits8 ? tc.ConvertBits(8).ConvertToY8 : tc    # 8 Bit if requested
    SSS="""
        YDet=
            \ (YMODE==0) ? tc.YPlaneMin(YTh) :
            \ (YMODE==1) ? tc.YPlaneMax(YTh) :
            \ (YMODE==2) ? tc.YPlaneMinMaxDifference(YTh) :
            \ (YMODE==3) ? tc.YPlaneMedian :
            \ tc.AverageLuma.Round
        Subtitle(String(current_frame) + "] YDet=" + String(YDet) , Size=48)
    """
    c.ScriptClip(SSS, Args="tc,YMODE,YTh",Local = true)
    OverLay(c.BlankClip(Length=1,Width=w,Height=h,Color=$FFFF00),x=x,y=y,Opacity=0.15) # Mark Test Area in yellow
    Return Last
}

# OP=1
Function BlueLED_Detect(clip c,String Fn, int x,int y,int w,int h,Bool "Bits8",Int "YMODE",Float "YTh",Int "DETMODE",int "DetTh", Bool "Show") {
    bpc    = c.BitsPerComponent()                          # Bit Depth of c clip
    Bits8  = Default(Bits8,False)                          # If True, then DetTh and metrics are for 8 bit
    YMODE  = Default(YMODE,1)                              # Default 1=YPLaneMax
    YTh = Default(YTh,0.4)                                 # YPlane Threshold (%) for YMODE=0,1,2, YPlaneMin, YPlaneMax, and YPLaneMinMaxDifference.
    DETMODE= Default(DETMODE,0)                            # Default 0="YDet<DetTh" for detect NOT BlueLED
    DetTh  = Default(DetTh,Bits8?50:50*BitLShift(1,bpc-8)) # Detect Threshold. Compliant with Bits8 arg.
    Show   = Default(Show,False)
    Assert(fn!="","BlueLED_Detect: Frames file Fn Cannot be ''")
    Fn = Fn.RT_GetFullPathName
    RT_FileDelete(Fn)
    tc = c.Crop(x,y,w,h)
    tc = Bits8 ? tc.ConvertBits(8).ConvertToY8 : tc
    SSS="""
        YDetCur=
            \ (YMODE==0) ? tc.YPlaneMin(YTh) :
            \ (YMODE==1) ? tc.YPlaneMax(YTh) :
            \ (YMODE==2) ? tc.YPlaneMinMaxDifference(YTh) :
            \ (YMODE==3) ? tc.YPlaneMedian :
            \              tc.AverageLuma.Round
        YDetPrv=
            \ (YMODE==0) ? tc.YPlaneMin(YTh,-1) :
            \ (YMODE==1) ? tc.YPlaneMax(YTh,-1) :
            \ (YMODE==2) ? tc.YPlaneMinMaxDifference(YTh,-1) :
            \ (YMODE==3) ? tc.YPlaneMedian(-1) :
            \ tc.AverageLuma(-1).Round

        T1 =
           \ (DETMODE==0) ? (YDetCur <DetTh)  :
           \ (DETMODE==1) ? (YDetCur >DetTh)  :
           \ (DETMODE==2) ? (YDetCur<=DetTh) :
           \ (DETMODE==3) ? (YDetCur>=DetTh) :
           \ (DETMODE==4) ? (YDetCur==DetTh) :
           \                (YDetCur!=DetTh)

        T2 =
           \ (DETMODE==0) ? (YDetPrv <DetTh)  :
           \ (DETMODE==1) ? (YDetPrv >DetTh)  :
           \ (DETMODE==2) ? (YDetPrv<=DetTh) :
           \ (DETMODE==3) ? (YDetPrv>=DetTh) :
           \ (DETMODE==4) ? (YDetPrv==DetTh) :
           \                (YDetPrv!=DetTh)

        T = (T1 && (!T2 || current_frame==0))  # True if current frame is detected non moving,and previous detected as moving.

        (T) ? RT_WriteFile(Fn,"%d    # %d",current_frame,YDetCur,Append=current_frame>0) : NOP
        if(Show) {
            s = RT_String("%d] %s\\nYDetCur=%d\\nYDetPrv=%d\\n(DetTh=%d)",current_frame,T?"Bingo":"",YDetCur,YDetPrv,DetTh)
            Subtitle(s,Size=48,lsp=0)
        }
        Return Last
    """
    c.ScriptClip(SSS, Args="tc,YMODE,YTh,DETMODE,DetTh,Fn,Show",Local=true)
    Return Last
}

# OP=2
Function BlueLED_FrameSel(clip c,String Frames,Bool "Reject") { # Extract Frames from clip c
    Reject = Default(Reject,False)
    Assert(Frames!="","BlueLED_FrameSel: Frames Cannot be ''")
    Frames = Frames.RT_GetFullPathName                 # Add full path if not already got one
    Return FrameSel(c,Cmd=Frames,Ordered=True,reject=Reject)
}
EDIT: Another user a couple of years back required detect and extract depending upon artificial border color,
another used arifical pure black to indicate frames to delete. The DB version similar to this could
achieve both those goals.
__________________
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; 14th May 2021 at 16:33.
StainlessS is offline   Reply With Quote
Reply

Tags
image analysis decimation

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 14:32.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2025, vBulletin Solutions Inc.