Commit b36a0561 authored by Andrey Filippov's avatar Andrey Filippov

Cleaning up, debugging blue sky

parent 02a4440e
...@@ -385,6 +385,7 @@ public class CLTParameters { ...@@ -385,6 +385,7 @@ public class CLTParameters {
public double photo_offs = 21946; // weighted average offset target value, if photo_offs_set (and not photo_offs_balance) public double photo_offs = 21946; // weighted average offset target value, if photo_offs_set (and not photo_offs_balance)
public boolean photo_debug = false;// Generate images and text public boolean photo_debug = false;// Generate images and text
public boolean photo_each_debug = false;// Debug after Blue Sky
public double tex_disp_adiffo = 0.10; // 0.35; // 0.3; disparity absolute tolerance to connect in ortho directions public double tex_disp_adiffo = 0.10; // 0.35; // 0.3; disparity absolute tolerance to connect in ortho directions
public double tex_disp_rdiffo = 0.08; // 0.12; // 0.1; disparity relative tolerance to connect in ortho directions public double tex_disp_rdiffo = 0.08; // 0.12; // 0.1; disparity relative tolerance to connect in ortho directions
...@@ -448,6 +449,8 @@ public class CLTParameters { ...@@ -448,6 +449,8 @@ public class CLTParameters {
public double maxZ = 20000; // maximal distance to far object public double maxZ = 20000; // maximal distance to far object
public boolean limitZ = true; // limit Z, if false - remove triangle public boolean limitZ = true; // limit Z, if false - remove triangle
public double infinityDistance = 10000; // Distance to generate backdrop (0 - use regular backdrop) public double infinityDistance = 10000; // Distance to generate backdrop (0 - use regular backdrop)
public double min_from_inf = 500; // farthest non-infinity closer than infinity
public int min_bgnd_tiles = 10; // Minimal number of background tiles to generate background public int min_bgnd_tiles = 10; // Minimal number of background tiles to generate background
public boolean gltf_emissive = false; // true; // Use emissive textures public boolean gltf_emissive = false; // true; // Use emissive textures
...@@ -1487,6 +1490,7 @@ public class CLTParameters { ...@@ -1487,6 +1490,7 @@ public class CLTParameters {
properties.setProperty(prefix+"photo_offs_set", this.photo_offs_set+""); // int properties.setProperty(prefix+"photo_offs_set", this.photo_offs_set+""); // int
properties.setProperty(prefix+"photo_offs", this.photo_offs+""); // double properties.setProperty(prefix+"photo_offs", this.photo_offs+""); // double
properties.setProperty(prefix+"photo_debug", this.photo_debug+""); // boolean properties.setProperty(prefix+"photo_debug", this.photo_debug+""); // boolean
properties.setProperty(prefix+"photo_each_debug", this.photo_each_debug+""); // boolean
properties.setProperty(prefix+"tex_disp_adiffo", this.tex_disp_adiffo+""); // double properties.setProperty(prefix+"tex_disp_adiffo", this.tex_disp_adiffo+""); // double
properties.setProperty(prefix+"tex_disp_rdiffo", this.tex_disp_rdiffo+""); // double properties.setProperty(prefix+"tex_disp_rdiffo", this.tex_disp_rdiffo+""); // double
...@@ -1551,6 +1555,7 @@ public class CLTParameters { ...@@ -1551,6 +1555,7 @@ public class CLTParameters {
properties.setProperty(prefix+"limitZ", this.limitZ+""); properties.setProperty(prefix+"limitZ", this.limitZ+"");
properties.setProperty(prefix+"infinityDistance", this.infinityDistance +""); properties.setProperty(prefix+"infinityDistance", this.infinityDistance +"");
properties.setProperty(prefix+"min_from_inf", this.min_from_inf +"");
properties.setProperty(prefix+"min_bgnd_tiles", this.min_bgnd_tiles+""); properties.setProperty(prefix+"min_bgnd_tiles", this.min_bgnd_tiles+"");
properties.setProperty(prefix+"gltf_emissive", this.gltf_emissive+""); properties.setProperty(prefix+"gltf_emissive", this.gltf_emissive+"");
...@@ -2467,6 +2472,7 @@ public class CLTParameters { ...@@ -2467,6 +2472,7 @@ public class CLTParameters {
if (properties.getProperty(prefix+"photo_offs_set")!=null) this.photo_offs_set=Integer.parseInt(properties.getProperty(prefix+"photo_offs_set")); if (properties.getProperty(prefix+"photo_offs_set")!=null) this.photo_offs_set=Integer.parseInt(properties.getProperty(prefix+"photo_offs_set"));
if (properties.getProperty(prefix+"photo_offs")!=null) this.photo_offs=Double.parseDouble(properties.getProperty(prefix+"photo_offs")); if (properties.getProperty(prefix+"photo_offs")!=null) this.photo_offs=Double.parseDouble(properties.getProperty(prefix+"photo_offs"));
if (properties.getProperty(prefix+"photo_debug")!=null) this.photo_debug=Boolean.parseBoolean(properties.getProperty(prefix+"photo_debug")); if (properties.getProperty(prefix+"photo_debug")!=null) this.photo_debug=Boolean.parseBoolean(properties.getProperty(prefix+"photo_debug"));
if (properties.getProperty(prefix+"photo_each_debug")!=null) this.photo_each_debug=Boolean.parseBoolean(properties.getProperty(prefix+"photo_each_debug"));
if (properties.getProperty(prefix+"tex_disp_adiffo")!=null) this.tex_disp_adiffo=Double.parseDouble(properties.getProperty(prefix+"tex_disp_adiffo")); if (properties.getProperty(prefix+"tex_disp_adiffo")!=null) this.tex_disp_adiffo=Double.parseDouble(properties.getProperty(prefix+"tex_disp_adiffo"));
if (properties.getProperty(prefix+"tex_disp_rdiffo")!=null) this.tex_disp_rdiffo=Double.parseDouble(properties.getProperty(prefix+"tex_disp_rdiffo")); if (properties.getProperty(prefix+"tex_disp_rdiffo")!=null) this.tex_disp_rdiffo=Double.parseDouble(properties.getProperty(prefix+"tex_disp_rdiffo"));
...@@ -2530,6 +2536,7 @@ public class CLTParameters { ...@@ -2530,6 +2536,7 @@ public class CLTParameters {
if (properties.getProperty(prefix+"limitZ")!=null) this.limitZ=Boolean.parseBoolean(properties.getProperty(prefix+"limitZ")); if (properties.getProperty(prefix+"limitZ")!=null) this.limitZ=Boolean.parseBoolean(properties.getProperty(prefix+"limitZ"));
if (properties.getProperty(prefix+"infinityDistance")!=null) this.infinityDistance=Double.parseDouble(properties.getProperty(prefix+"infinityDistance")); if (properties.getProperty(prefix+"infinityDistance")!=null) this.infinityDistance=Double.parseDouble(properties.getProperty(prefix+"infinityDistance"));
if (properties.getProperty(prefix+"min_from_inf")!=null) this.min_from_inf=Double.parseDouble(properties.getProperty(prefix+"min_from_inf"));
if (properties.getProperty(prefix+"min_bgnd_tiles")!=null) this.min_bgnd_tiles=Integer.parseInt(properties.getProperty(prefix+"min_bgnd_tiles")); if (properties.getProperty(prefix+"min_bgnd_tiles")!=null) this.min_bgnd_tiles=Integer.parseInt(properties.getProperty(prefix+"min_bgnd_tiles"));
if (properties.getProperty(prefix+"gltf_emissive")!=null) this.gltf_emissive=Boolean.parseBoolean(properties.getProperty(prefix+"gltf_emissive")); if (properties.getProperty(prefix+"gltf_emissive")!=null) this.gltf_emissive=Boolean.parseBoolean(properties.getProperty(prefix+"gltf_emissive"));
...@@ -3600,7 +3607,9 @@ public class CLTParameters { ...@@ -3600,7 +3607,9 @@ public class CLTParameters {
"Target weighted (by scales) average offset."); "Target weighted (by scales) average offset.");
gd.addCheckbox ("Debug photometric calibration", this.photo_debug, gd.addCheckbox ("Debug photometric calibration", this.photo_debug,
"Generate debug images an text output."); "Generate debug images an text output.");
gd.addCheckbox ("Debug photometric calibration 'each'", this.photo_each_debug,
"Generate debug images after Blue Sky.");
//
gd.addTab ("3D", "3D reconstruction"); gd.addTab ("3D", "3D reconstruction");
gd.addMessage ("Meshes clustering for texture generation"); gd.addMessage ("Meshes clustering for texture generation");
gd.addNumericField("Ortho tolerance absolute", this.tex_disp_adiffo, 5,7,"pix", gd.addNumericField("Ortho tolerance absolute", this.tex_disp_adiffo, 5,7,"pix",
...@@ -3726,6 +3735,8 @@ public class CLTParameters { ...@@ -3726,6 +3735,8 @@ public class CLTParameters {
gd.addNumericField("Distance to a backdrop", this.infinityDistance,8,8,"m", gd.addNumericField("Distance to a backdrop", this.infinityDistance,8,8,"m",
"Distance to generate backdrop (0 - use regular backdrop)."); "Distance to generate backdrop (0 - use regular backdrop).");
gd.addNumericField("Minimal distance from backdrop", this.min_from_inf,8,8,"m",
"Minimal distance of the fartest object from backdrop to be resolved.");
gd.addNumericField("Minimal background tiles", this.min_bgnd_tiles, 0,4,"", gd.addNumericField("Minimal background tiles", this.min_bgnd_tiles, 0,4,"",
"Minimal number of background tiles to generate background."); "Minimal number of background tiles to generate background.");
...@@ -4827,6 +4838,7 @@ public class CLTParameters { ...@@ -4827,6 +4838,7 @@ public class CLTParameters {
this.photo_offs_set = (int) gd.getNextNumber(); this.photo_offs_set = (int) gd.getNextNumber();
this.photo_offs = gd.getNextNumber(); this.photo_offs = gd.getNextNumber();
this.photo_debug = gd.getNextBoolean(); this.photo_debug = gd.getNextBoolean();
this.photo_each_debug = gd.getNextBoolean();
this.tex_disp_adiffo = gd.getNextNumber(); this.tex_disp_adiffo = gd.getNextNumber();
this.tex_disp_rdiffo = gd.getNextNumber(); this.tex_disp_rdiffo = gd.getNextNumber();
...@@ -4891,6 +4903,7 @@ public class CLTParameters { ...@@ -4891,6 +4903,7 @@ public class CLTParameters {
this.limitZ= gd.getNextBoolean(); this.limitZ= gd.getNextBoolean();
this.infinityDistance= gd.getNextNumber(); this.infinityDistance= gd.getNextNumber();
this.min_from_inf= gd.getNextNumber();
this.min_bgnd_tiles= (int) gd.getNextNumber(); this.min_bgnd_tiles= (int) gd.getNextNumber();
this.gltf_emissive= gd.getNextBoolean(); this.gltf_emissive= gd.getNextBoolean();
......
...@@ -136,28 +136,37 @@ public class IntersceneMatchParameters { ...@@ -136,28 +136,37 @@ public class IntersceneMatchParameters {
//------------ //------------
// Sky detection/filtering // Sky detection/filtering
public boolean sky_recalc = false; // force blue sky recalculation even if it exists
public double sky_highest_min = -50; // lowest absolute value should not be higher (requires photometric) public double sky_highest_min = -50; // lowest absolute value should not be higher (requires photometric)
public double cold_frac = 0.005; // this and lower will scale fom by cold_scale public double cold_frac = 0.005; // this and lower will scale fom by cold_scale
public double hot_frac = 0.9; // this and above will scale fom by 1.0 public double hot_frac = 0.9; // this and above will scale fom by 1.0
public double cold_scale = 0.2; // <=1.0. 1.0 - disables temperature dependence public double cold_scale = 0.2; // <=1.0. 1.0 - disables temperature dependence
public double sky_seed = 5.0; // start with product of strength by diff_second below this
public double sky_seed = 5.0; // 5.0 start with product of strength by diff_second below this
public double lma_seed = 2.0; // seed - disparity_lma limit double sky_lim = 15.0; // then expand to product of strength by diff_second below this public double lma_seed = 2.0; // seed - disparity_lma limit double sky_lim = 15.0; // then expand to product of strength by diff_second below this
public double seed_temp = 0.5; // seed colder that this point between min and max temp
public int sky_shrink = 2; public int sky_shrink = 2;
public int seed_rows = 5; // sky should appear in this top rows public int seed_rows = 5; // sky should appear in this top rows
public double max_disparity = 0.3; // maximal strong sky disparity
public double max_disparity_strength = 0.2; // maximal strength of high disparity sky
public double sky_lim = 15.0; // then expand to product of strength by diff_second below this public double sky_lim = 15.0; // then expand to product of strength by diff_second below this
public double lim_temp = 0.5; // sky colder that this point between min and max temp
public int sky_expand_extra = 0; // 1? public int sky_expand_extra = 0; // 1?
public int sky_bottleneck = 5; public int sky_bottleneck = 5;
public int sky_reexpand_extra = 9;// re-expand after bottleneck in addition to how it was shrank
public double min_strength = 0.08; public double min_strength = 0.08;
public int lowest_sky_row = 50; // appears that low - invalid, remove completely public int lowest_sky_row = 50; // appears that low - invalid, remove completely
public double sky_bottom_override = -300; // maximal average sky value to override lowest_sky_row test public double sky_bottom_override = -300; // maximal average sky value to override lowest_sky_row test
public int sky_override_shrink = 10; // shrink detected sky before finding hottest tile there public int sky_override_shrink = 6; // shrink detected sky before finding hottest tile there
// Increase fom if there are enough LMA-defined similar tiles around // Increase fom if there are enough LMA-defined similar tiles around
public double disp_boost_min = 0.5; public double disp_boost_min = 0.5;
public double disp_boost_diff = 0.35; public double disp_boost_diff = 0.35;
public int disp_boost_neibs = 2; public int disp_boost_neibs = 2;
public double disp_boost_amount = 2.0; public double disp_boost_amount = 2.0;
public double scale_combo_strength = 0.4; // reduce strength when it comes from combo, not DSI-MAIN
public boolean save_debug_images = true; // Save blue sky debug images in model directory
// Some "AGC" to adjust how much to discard // Some "AGC" to adjust how much to discard
public int margin = 1; // do not use tiles if their centers are closer to the image edge public int margin = 1; // do not use tiles if their centers are closer to the image edge
...@@ -519,6 +528,8 @@ public class IntersceneMatchParameters { ...@@ -519,6 +528,8 @@ public class IntersceneMatchParameters {
gd.addTab("Sky","Featureless sky areas detection and filtering (LWIR only)"); gd.addTab("Sky","Featureless sky areas detection and filtering (LWIR only)");
gd.addMessage ("Temperature-related filtering (requires photometric calibration)"); gd.addMessage ("Temperature-related filtering (requires photometric calibration)");
gd.addCheckbox ("Force blue sky recalculation", this.sky_recalc,
"Recalculate blue sky even if it already exists.");
gd.addNumericField("High limit of the scene coldest tile", this.sky_highest_min, 5,7,"", gd.addNumericField("High limit of the scene coldest tile", this.sky_highest_min, 5,7,"",
"Sky is normally cold. If the (globally offset) minimal scene absolutre pixel value is above - no sky in the scene (debug images still show it)"); "Sky is normally cold. If the (globally offset) minimal scene absolutre pixel value is above - no sky in the scene (debug images still show it)");
gd.addNumericField("Cold level fraction", this.cold_frac, 5,7,"", gd.addNumericField("Cold level fraction", this.cold_frac, 5,7,"",
...@@ -533,17 +544,27 @@ public class IntersceneMatchParameters { ...@@ -533,17 +544,27 @@ public class IntersceneMatchParameters {
"at infinity and 3 above parameters"); "at infinity and 3 above parameters");
gd.addNumericField("Seed maximal disparity", this.lma_seed, 5,7,"pix", gd.addNumericField("Seed maximal disparity", this.lma_seed, 5,7,"pix",
"Seed tiles should not have LMA-found disparity above this"); "Seed tiles should not have LMA-found disparity above this");
gd.addNumericField("Seed maximal relative temperature", this.seed_temp, 5,7,"",
"Seed tiles should be colder than this point between min and max scene temperature.");
gd.addNumericField("Shrink sky seed", this.sky_shrink, 0,3,"", gd.addNumericField("Shrink sky seed", this.sky_shrink, 0,3,"",
"Shrink sky seed tiles to eliminate too small (false) clusters. One shrinks in hor/vert, 2 - with diagonals, ..."); "Shrink sky seed tiles to eliminate too small (false) clusters. One shrinks in hor/vert, 2 - with diagonals, ...");
gd.addNumericField("Seed rows", this.seed_rows, 0,3,"", gd.addNumericField("Seed rows", this.seed_rows, 0,3,"",
"Sky is above and normally should appear in the top image rows. Applies after shrinking."); "Sky is above and normally should appear in the top image rows. Applies after shrinking.");
gd.addMessage ("Expand seed tiles"); gd.addMessage ("Expand seed tiles");
gd.addNumericField("Maximal strong sky disparity", this.max_disparity, 5,7,"",
"Maximal disparity of the sky tiles if they are strong enough.");
gd.addNumericField("Strength of the high disparity sky", this.max_disparity_strength, 5,7,"",
"Required tile strenghth to be considered strong to test against maximal disparity.");
gd.addNumericField("Expand FOM limit", this.sky_lim, 5,7,"", gd.addNumericField("Expand FOM limit", this.sky_lim, 5,7,"",
"Expand while FOM is below this value (usually to a high-contrast skyline)."); "Expand while FOM is below this value (usually to a high-contrast skyline).");
gd.addNumericField("Sky maximal relative temperature", this.lim_temp, 5,7,"",
"Sky tiles should be colder than this point between min and max scene temperature.");
gd.addNumericField("Expand extra", this.sky_expand_extra, 0,3,"", gd.addNumericField("Expand extra", this.sky_expand_extra, 0,3,"",
"Additionally expand sky area after reaching threshold in the previous step."); "Additionally expand sky area after reaching threshold in the previous step.");
gd.addNumericField("Bottleneck width", this.sky_bottleneck, 0,3,"", gd.addNumericField("Bottleneck width", this.sky_bottleneck, 0,3,"",
"Shrink/reexpand from the seed detected sky to prevent \"leaks\" through narrow gaps in the high-contrast sky limit."); "Shrink/reexpand from the seed detected sky to prevent \"leaks\" through narrow gaps in the high-contrast sky limit.");
gd.addNumericField("Re-expand extra after bottleneck", this.sky_reexpand_extra, 0,3,"",
"Additionally expand sky area after bottleneck shrink in excess of re-expanding by the same amount as shrank.");
gd.addNumericField("Modify strength to be at least this", this.min_strength, 5,7,"", gd.addNumericField("Modify strength to be at least this", this.min_strength, 5,7,"",
"Input strength has some with zero values resulting in zero FOM. Make them at least this."); "Input strength has some with zero values resulting in zero FOM. Make them at least this.");
gd.addNumericField("Lowest sky row", this.lowest_sky_row, 0,3,"", gd.addNumericField("Lowest sky row", this.lowest_sky_row, 0,3,"",
...@@ -562,9 +583,12 @@ public class IntersceneMatchParameters { ...@@ -562,9 +583,12 @@ public class IntersceneMatchParameters {
"Number of neighbors (of 8) to have small disparity difference to boost FOM."); "Number of neighbors (of 8) to have small disparity difference to boost FOM.");
gd.addNumericField("Boost amount", this.disp_boost_amount, 5,7,"x", gd.addNumericField("Boost amount", this.disp_boost_amount, 5,7,"x",
"Multiply FOM by this value if number of neighbors is exactly minimal. Scale proportional to the total number of neighbors."); "Multiply FOM by this value if number of neighbors is exactly minimal. Scale proportional to the total number of neighbors.");
gd.addTab ("Inter-Match", "Parameters for full-resolution scene matching"); gd.addNumericField("Scale if strength is combo, not main", this.scale_combo_strength, 5,7,"x",
"Reduce strength when it comes from combo, not DSI-MAIN.");
gd.addCheckbox ("Save debug images", this.save_debug_images,
"Save debug images for Blue Sky generation in model directory.");
gd.addTab ("Inter-Match", "Parameters for full-resolution scene matching");
gd.addMessage ("Interscene match parameters"); gd.addMessage ("Interscene match parameters");
gd.addNumericField("Image margin", this.margin, 0,5,"pix", gd.addNumericField("Image margin", this.margin, 0,5,"pix",
"Do not use tiles if their centers are closer to the virtual image edge"); "Do not use tiles if their centers are closer to the virtual image edge");
...@@ -924,17 +948,23 @@ public class IntersceneMatchParameters { ...@@ -924,17 +948,23 @@ public class IntersceneMatchParameters {
this.strong_strength = gd.getNextNumber(); this.strong_strength = gd.getNextNumber();
this.weak_strength = gd.getNextNumber(); this.weak_strength = gd.getNextNumber();
this.sky_recalc = gd.getNextBoolean();
this.sky_highest_min = gd.getNextNumber(); this.sky_highest_min = gd.getNextNumber();
this.cold_frac = gd.getNextNumber(); this.cold_frac = gd.getNextNumber();
this.hot_frac = gd.getNextNumber(); this.hot_frac = gd.getNextNumber();
this.cold_scale = gd.getNextNumber(); this.cold_scale = gd.getNextNumber();
this.sky_seed = gd.getNextNumber(); this.sky_seed = gd.getNextNumber();
this.lma_seed = gd.getNextNumber(); this.lma_seed = gd.getNextNumber();
this.seed_temp = gd.getNextNumber();
this.sky_shrink = (int) gd.getNextNumber(); this.sky_shrink = (int) gd.getNextNumber();
this.seed_rows = (int) gd.getNextNumber(); this.seed_rows = (int) gd.getNextNumber();
this.max_disparity = gd.getNextNumber();
this.max_disparity_strength = gd.getNextNumber();
this.sky_lim = gd.getNextNumber(); this.sky_lim = gd.getNextNumber();
this.lim_temp = gd.getNextNumber();
this.sky_expand_extra = (int) gd.getNextNumber(); this.sky_expand_extra = (int) gd.getNextNumber();
this.sky_bottleneck = (int) gd.getNextNumber(); this.sky_bottleneck = (int) gd.getNextNumber();
this.sky_reexpand_extra = (int) gd.getNextNumber();
this.min_strength = gd.getNextNumber(); this.min_strength = gd.getNextNumber();
this.lowest_sky_row = (int) gd.getNextNumber(); this.lowest_sky_row = (int) gd.getNextNumber();
this.sky_bottom_override = gd.getNextNumber(); this.sky_bottom_override = gd.getNextNumber();
...@@ -944,6 +974,8 @@ public class IntersceneMatchParameters { ...@@ -944,6 +974,8 @@ public class IntersceneMatchParameters {
this.disp_boost_diff = gd.getNextNumber(); this.disp_boost_diff = gd.getNextNumber();
this.disp_boost_neibs = (int) gd.getNextNumber(); this.disp_boost_neibs = (int) gd.getNextNumber();
this.disp_boost_amount = gd.getNextNumber(); this.disp_boost_amount = gd.getNextNumber();
this.scale_combo_strength = gd.getNextNumber();
this.save_debug_images = gd.getNextBoolean();
this.margin = (int) gd.getNextNumber(); this.margin = (int) gd.getNextNumber();
this.sensor_mask_inter= (int) gd.getNextNumber(); this.sensor_mask_inter= (int) gd.getNextNumber();
...@@ -1206,17 +1238,23 @@ public class IntersceneMatchParameters { ...@@ -1206,17 +1238,23 @@ public class IntersceneMatchParameters {
properties.setProperty(prefix+"strong_strength", this.strong_strength+""); // double properties.setProperty(prefix+"strong_strength", this.strong_strength+""); // double
properties.setProperty(prefix+"weak_strength", this.weak_strength+""); // double properties.setProperty(prefix+"weak_strength", this.weak_strength+""); // double
properties.setProperty(prefix+"sky_recalc", this.sky_recalc+""); // boolean
properties.setProperty(prefix+"sky_highest_min", this.sky_highest_min+""); // double properties.setProperty(prefix+"sky_highest_min", this.sky_highest_min+""); // double
properties.setProperty(prefix+"cold_frac", this.cold_frac+""); // double properties.setProperty(prefix+"cold_frac", this.cold_frac+""); // double
properties.setProperty(prefix+"hot_frac", this.hot_frac+""); // double properties.setProperty(prefix+"hot_frac", this.hot_frac+""); // double
properties.setProperty(prefix+"cold_scale", this.cold_scale+""); // double properties.setProperty(prefix+"cold_scale", this.cold_scale+""); // double
properties.setProperty(prefix+"sky_seed", this.sky_seed+""); // double properties.setProperty(prefix+"sky_seed", this.sky_seed+""); // double
properties.setProperty(prefix+"lma_seed", this.lma_seed+""); // double properties.setProperty(prefix+"lma_seed", this.lma_seed+""); // double
properties.setProperty(prefix+"seed_temp", this.seed_temp+""); // double
properties.setProperty(prefix+"sky_shrink", this.sky_shrink+""); // int properties.setProperty(prefix+"sky_shrink", this.sky_shrink+""); // int
properties.setProperty(prefix+"seed_rows", this.seed_rows+""); // int properties.setProperty(prefix+"seed_rows", this.seed_rows+""); // int
properties.setProperty(prefix+"max_disparity", this.max_disparity+""); // double
properties.setProperty(prefix+"max_disparity_strength",this.max_disparity_strength+"");// double
properties.setProperty(prefix+"sky_lim", this.sky_lim+""); // double properties.setProperty(prefix+"sky_lim", this.sky_lim+""); // double
properties.setProperty(prefix+"lim_temp", this.lim_temp+""); // double
properties.setProperty(prefix+"sky_expand_extra", this.sky_expand_extra+""); // int properties.setProperty(prefix+"sky_expand_extra", this.sky_expand_extra+""); // int
properties.setProperty(prefix+"sky_bottleneck", this.sky_bottleneck+""); // int properties.setProperty(prefix+"sky_bottleneck", this.sky_bottleneck+""); // int
properties.setProperty(prefix+"sky_reexpand_extra", this.sky_reexpand_extra+""); // int
properties.setProperty(prefix+"min_strength", this.min_strength+""); // double properties.setProperty(prefix+"min_strength", this.min_strength+""); // double
properties.setProperty(prefix+"lowest_sky_row", this.lowest_sky_row+""); // int properties.setProperty(prefix+"lowest_sky_row", this.lowest_sky_row+""); // int
properties.setProperty(prefix+"sky_bottom_override", this.sky_bottom_override+""); // double properties.setProperty(prefix+"sky_bottom_override", this.sky_bottom_override+""); // double
...@@ -1226,6 +1264,8 @@ public class IntersceneMatchParameters { ...@@ -1226,6 +1264,8 @@ public class IntersceneMatchParameters {
properties.setProperty(prefix+"disp_boost_diff", this.disp_boost_diff+""); // int properties.setProperty(prefix+"disp_boost_diff", this.disp_boost_diff+""); // int
properties.setProperty(prefix+"disp_boost_neibs", this.disp_boost_neibs+""); // double properties.setProperty(prefix+"disp_boost_neibs", this.disp_boost_neibs+""); // double
properties.setProperty(prefix+"disp_boost_amount", this.disp_boost_amount+""); // double properties.setProperty(prefix+"disp_boost_amount", this.disp_boost_amount+""); // double
properties.setProperty(prefix+"scale_combo_strength", this.scale_combo_strength+""); // double
properties.setProperty(prefix+"save_debug_images", this.save_debug_images+""); // boolean
properties.setProperty(prefix+"margin", this.margin+""); // int properties.setProperty(prefix+"margin", this.margin+""); // int
properties.setProperty(prefix+"sensor_mask_inter", this.sensor_mask_inter+""); // int properties.setProperty(prefix+"sensor_mask_inter", this.sensor_mask_inter+""); // int
...@@ -1441,17 +1481,25 @@ public class IntersceneMatchParameters { ...@@ -1441,17 +1481,25 @@ public class IntersceneMatchParameters {
if (properties.getProperty(prefix+"strong_strength")!=null) this.strong_strength=Double.parseDouble(properties.getProperty(prefix+"strong_strength")); if (properties.getProperty(prefix+"strong_strength")!=null) this.strong_strength=Double.parseDouble(properties.getProperty(prefix+"strong_strength"));
if (properties.getProperty(prefix+"weak_strength")!=null) this.weak_strength=Double.parseDouble(properties.getProperty(prefix+"weak_strength")); if (properties.getProperty(prefix+"weak_strength")!=null) this.weak_strength=Double.parseDouble(properties.getProperty(prefix+"weak_strength"));
if (properties.getProperty(prefix+"sky_recalc")!=null) this.sky_recalc=Boolean.parseBoolean(properties.getProperty(prefix+"sky_recalc"));
if (properties.getProperty(prefix+"sky_highest_min")!=null) this.sky_highest_min=Double.parseDouble(properties.getProperty(prefix+"sky_highest_min")); if (properties.getProperty(prefix+"sky_highest_min")!=null) this.sky_highest_min=Double.parseDouble(properties.getProperty(prefix+"sky_highest_min"));
if (properties.getProperty(prefix+"cold_frac")!=null) this.cold_frac=Double.parseDouble(properties.getProperty(prefix+"cold_frac")); if (properties.getProperty(prefix+"cold_frac")!=null) this.cold_frac=Double.parseDouble(properties.getProperty(prefix+"cold_frac"));
if (properties.getProperty(prefix+"hot_frac")!=null) this.hot_frac=Double.parseDouble(properties.getProperty(prefix+"hot_frac")); if (properties.getProperty(prefix+"hot_frac")!=null) this.hot_frac=Double.parseDouble(properties.getProperty(prefix+"hot_frac"));
if (properties.getProperty(prefix+"cold_scale")!=null) this.cold_scale=Double.parseDouble(properties.getProperty(prefix+"cold_scale")); if (properties.getProperty(prefix+"cold_scale")!=null) this.cold_scale=Double.parseDouble(properties.getProperty(prefix+"cold_scale"));
if (properties.getProperty(prefix+"sky_seed")!=null) this.sky_seed=Double.parseDouble(properties.getProperty(prefix+"sky_seed")); if (properties.getProperty(prefix+"sky_seed")!=null) this.sky_seed=Double.parseDouble(properties.getProperty(prefix+"sky_seed"));
if (properties.getProperty(prefix+"lma_seed")!=null) this.lma_seed=Double.parseDouble(properties.getProperty(prefix+"lma_seed")); if (properties.getProperty(prefix+"lma_seed")!=null) this.lma_seed=Double.parseDouble(properties.getProperty(prefix+"lma_seed"));
if (properties.getProperty(prefix+"seed_temp")!=null) this.seed_temp=Double.parseDouble(properties.getProperty(prefix+"seed_temp"));
if (properties.getProperty(prefix+"sky_shrink")!=null) this.sky_shrink=Integer.parseInt(properties.getProperty(prefix+"sky_shrink")); if (properties.getProperty(prefix+"sky_shrink")!=null) this.sky_shrink=Integer.parseInt(properties.getProperty(prefix+"sky_shrink"));
if (properties.getProperty(prefix+"seed_rows")!=null) this.seed_rows=Integer.parseInt(properties.getProperty(prefix+"seed_rows")); if (properties.getProperty(prefix+"seed_rows")!=null) this.seed_rows=Integer.parseInt(properties.getProperty(prefix+"seed_rows"));
if (properties.getProperty(prefix+"max_disparity")!=null) this.max_disparity=Double.parseDouble(properties.getProperty(prefix+"max_disparity"));
if (properties.getProperty(prefix+"max_disparity_strength")!=null)this.max_disparity_strength=Double.parseDouble(properties.getProperty(prefix+"max_disparity_strength"));
if (properties.getProperty(prefix+"sky_lim")!=null) this.sky_lim=Double.parseDouble(properties.getProperty(prefix+"sky_lim")); if (properties.getProperty(prefix+"sky_lim")!=null) this.sky_lim=Double.parseDouble(properties.getProperty(prefix+"sky_lim"));
if (properties.getProperty(prefix+"lim_temp")!=null) this.lim_temp=Double.parseDouble(properties.getProperty(prefix+"lim_temp"));
if (properties.getProperty(prefix+"sky_expand_extra")!=null) this.sky_expand_extra=Integer.parseInt(properties.getProperty(prefix+"sky_expand_extra")); if (properties.getProperty(prefix+"sky_expand_extra")!=null) this.sky_expand_extra=Integer.parseInt(properties.getProperty(prefix+"sky_expand_extra"));
if (properties.getProperty(prefix+"sky_bottleneck")!=null) this.sky_bottleneck=Integer.parseInt(properties.getProperty(prefix+"sky_bottleneck")); if (properties.getProperty(prefix+"sky_bottleneck")!=null) this.sky_bottleneck=Integer.parseInt(properties.getProperty(prefix+"sky_bottleneck"));
if (properties.getProperty(prefix+"sky_reexpand_extra")!=null) this.sky_reexpand_extra=Integer.parseInt(properties.getProperty(prefix+"sky_reexpand_extra"));
if (properties.getProperty(prefix+"min_strength")!=null) this.min_strength=Double.parseDouble(properties.getProperty(prefix+"min_strength")); if (properties.getProperty(prefix+"min_strength")!=null) this.min_strength=Double.parseDouble(properties.getProperty(prefix+"min_strength"));
if (properties.getProperty(prefix+"lowest_sky_row")!=null) this.lowest_sky_row=Integer.parseInt(properties.getProperty(prefix+"lowest_sky_row")); if (properties.getProperty(prefix+"lowest_sky_row")!=null) this.lowest_sky_row=Integer.parseInt(properties.getProperty(prefix+"lowest_sky_row"));
if (properties.getProperty(prefix+"sky_bottom_override")!=null) this.sky_bottom_override=Double.parseDouble(properties.getProperty(prefix+"sky_bottom_override")); if (properties.getProperty(prefix+"sky_bottom_override")!=null) this.sky_bottom_override=Double.parseDouble(properties.getProperty(prefix+"sky_bottom_override"));
...@@ -1461,6 +1509,8 @@ public class IntersceneMatchParameters { ...@@ -1461,6 +1509,8 @@ public class IntersceneMatchParameters {
if (properties.getProperty(prefix+"disp_boost_diff")!=null) this.disp_boost_diff=Double.parseDouble(properties.getProperty(prefix+"disp_boost_diff")); if (properties.getProperty(prefix+"disp_boost_diff")!=null) this.disp_boost_diff=Double.parseDouble(properties.getProperty(prefix+"disp_boost_diff"));
if (properties.getProperty(prefix+"disp_boost_neibs")!=null) this.disp_boost_neibs=Integer.parseInt(properties.getProperty(prefix+"disp_boost_neibs")); if (properties.getProperty(prefix+"disp_boost_neibs")!=null) this.disp_boost_neibs=Integer.parseInt(properties.getProperty(prefix+"disp_boost_neibs"));
if (properties.getProperty(prefix+"disp_boost_amount")!=null) this.disp_boost_amount=Double.parseDouble(properties.getProperty(prefix+"disp_boost_amount")); if (properties.getProperty(prefix+"disp_boost_amount")!=null) this.disp_boost_amount=Double.parseDouble(properties.getProperty(prefix+"disp_boost_amount"));
if (properties.getProperty(prefix+"scale_combo_strength")!=null) this.scale_combo_strength=Double.parseDouble(properties.getProperty(prefix+"scale_combo_strength"));
if (properties.getProperty(prefix+"save_debug_images")!=null) this.save_debug_images=Boolean.parseBoolean(properties.getProperty(prefix+"save_debug_images"));
if (properties.getProperty(prefix+"margin")!=null) this.margin=Integer.parseInt(properties.getProperty(prefix+"margin")); if (properties.getProperty(prefix+"margin")!=null) this.margin=Integer.parseInt(properties.getProperty(prefix+"margin"));
if (properties.getProperty(prefix+"sensor_mask_inter")!=null) this.sensor_mask_inter=Integer.parseInt(properties.getProperty(prefix+"sensor_mask_inter")); if (properties.getProperty(prefix+"sensor_mask_inter")!=null) this.sensor_mask_inter=Integer.parseInt(properties.getProperty(prefix+"sensor_mask_inter"));
...@@ -1694,17 +1744,23 @@ public class IntersceneMatchParameters { ...@@ -1694,17 +1744,23 @@ public class IntersceneMatchParameters {
imp.strong_strength = this.strong_strength; imp.strong_strength = this.strong_strength;
imp.weak_strength = this.weak_strength; imp.weak_strength = this.weak_strength;
imp.sky_recalc = this.sky_recalc;
imp.sky_highest_min = this.sky_highest_min; imp.sky_highest_min = this.sky_highest_min;
imp.cold_frac = this.cold_frac; imp.cold_frac = this.cold_frac;
imp.hot_frac = this.hot_frac; imp.hot_frac = this.hot_frac;
imp.cold_scale = this.cold_scale; imp.cold_scale = this.cold_scale;
imp.sky_seed = this.sky_seed; imp.sky_seed = this.sky_seed;
imp.lma_seed = this.lma_seed; imp.lma_seed = this.lma_seed;
imp.seed_temp = this.seed_temp;
imp.sky_shrink = this.sky_shrink; imp.sky_shrink = this.sky_shrink;
imp.seed_rows = this.seed_rows; imp.seed_rows = this.seed_rows;
imp.max_disparity = this.max_disparity;
imp.max_disparity_strength= this.max_disparity_strength;
imp.sky_lim = this.sky_lim; imp.sky_lim = this.sky_lim;
imp.lim_temp = this.lim_temp;
imp.sky_expand_extra = this.sky_expand_extra; imp.sky_expand_extra = this.sky_expand_extra;
imp.sky_bottleneck = this.sky_bottleneck; imp.sky_bottleneck = this.sky_bottleneck;
imp.sky_reexpand_extra = this.sky_reexpand_extra;
imp.min_strength = this.min_strength; imp.min_strength = this.min_strength;
imp.lowest_sky_row = this.lowest_sky_row; imp.lowest_sky_row = this.lowest_sky_row;
imp.sky_bottom_override = this.sky_bottom_override; imp.sky_bottom_override = this.sky_bottom_override;
...@@ -1714,6 +1770,8 @@ public class IntersceneMatchParameters { ...@@ -1714,6 +1770,8 @@ public class IntersceneMatchParameters {
imp.disp_boost_diff = this.disp_boost_diff; imp.disp_boost_diff = this.disp_boost_diff;
imp.disp_boost_neibs = this.disp_boost_neibs; imp.disp_boost_neibs = this.disp_boost_neibs;
imp.disp_boost_amount = this.disp_boost_amount; imp.disp_boost_amount = this.disp_boost_amount;
imp.scale_combo_strength = this.scale_combo_strength;
imp.save_debug_images = this.save_debug_images;
imp.margin = this.margin; imp.margin = this.margin;
imp.sensor_mask_inter = this.sensor_mask_inter; imp.sensor_mask_inter = this.sensor_mask_inter;
......
...@@ -3751,8 +3751,8 @@ public class OpticalFlow { ...@@ -3751,8 +3751,8 @@ public class OpticalFlow {
ds_photo[OpticalFlow.COMBO_DSN_INDX_STRENGTH] = dsi[TwoQuadCLT.DSI_STRENGTH_AUX]; ds_photo[OpticalFlow.COMBO_DSN_INDX_STRENGTH] = dsi[TwoQuadCLT.DSI_STRENGTH_AUX];
ds_photo[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY] = dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX]; ds_photo[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY] = dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX];
boolean photo_each_debug = !batch_mode; // false; // true; // false; boolean photo_each_debug = !batch_mode && clt_parameters.photo_each_debug; // false; // true; // false;
boolean photo_each_debug2 = !batch_mode; // false; // true; // false; boolean photo_each_debug2 = !batch_mode && clt_parameters.photo_each_debug; // false; // true; // false;
for (int nrecalib = 0; nrecalib < photo_num_full; nrecalib++) { // maybe need to correct just offsets? for (int nrecalib = 0; nrecalib < photo_num_full; nrecalib++) { // maybe need to correct just offsets?
int poly_order = photo_order; int poly_order = photo_order;
...@@ -3899,10 +3899,15 @@ public class OpticalFlow { ...@@ -3899,10 +3899,15 @@ public class OpticalFlow {
double cold_scale = clt_parameters.imp.cold_scale; double cold_scale = clt_parameters.imp.cold_scale;
double sky_seed = clt_parameters.imp.sky_seed; double sky_seed = clt_parameters.imp.sky_seed;
double lma_seed = clt_parameters.imp.lma_seed; double lma_seed = clt_parameters.imp.lma_seed;
double seed_temp = clt_parameters.imp.seed_temp;
int sky_shrink = clt_parameters.imp.sky_shrink; int sky_shrink = clt_parameters.imp.sky_shrink;
int sky_bottleneck = clt_parameters.imp.sky_bottleneck; int sky_bottleneck = clt_parameters.imp.sky_bottleneck;
int sky_reexpand_extra = clt_parameters.imp.sky_reexpand_extra;
int seed_rows = clt_parameters.imp.seed_rows; int seed_rows = clt_parameters.imp.seed_rows;
double max_disparity = clt_parameters.imp.max_disparity;
double max_disparity_strength=clt_parameters.imp.max_disparity_strength;
double sky_lim = clt_parameters.imp.sky_lim; double sky_lim = clt_parameters.imp.sky_lim;
double lim_temp = clt_parameters.imp.lim_temp;
int sky_expand_extra = clt_parameters.imp.sky_expand_extra; int sky_expand_extra = clt_parameters.imp.sky_expand_extra;
double min_strength = clt_parameters.imp.min_strength; double min_strength = clt_parameters.imp.min_strength;
int lowest_sky_row = clt_parameters.imp.lowest_sky_row; int lowest_sky_row = clt_parameters.imp.lowest_sky_row;
...@@ -3912,6 +3917,8 @@ public class OpticalFlow { ...@@ -3912,6 +3917,8 @@ public class OpticalFlow {
double disp_boost_diff = clt_parameters.imp.disp_boost_diff; // 0.35; double disp_boost_diff = clt_parameters.imp.disp_boost_diff; // 0.35;
int disp_boost_neibs = clt_parameters.imp.disp_boost_neibs; // 2; int disp_boost_neibs = clt_parameters.imp.disp_boost_neibs; // 2;
double disp_boost_amount = clt_parameters.imp.disp_boost_amount; // 2.0; double disp_boost_amount = clt_parameters.imp.disp_boost_amount; // 2.0;
QuadCLT dbg_scene = clt_parameters.imp.save_debug_images? quadCLT_ref: null; // use to save debug images if not null
boolean [] ref_blue_sky = null; // turn off "lma" in the ML output boolean [] ref_blue_sky = null; // turn off "lma" in the ML output
quadCLT_ref.preExpandCLTQuad3d( // returns ImagePlus, but it already should be saved/shown quadCLT_ref.preExpandCLTQuad3d( // returns ImagePlus, but it already should be saved/shown
clt_parameters, clt_parameters,
...@@ -3980,13 +3987,18 @@ public class OpticalFlow { ...@@ -3980,13 +3987,18 @@ public class OpticalFlow {
System.out.println("(Re)using photometric calibration from this sequence reference "+quadCLT_ref.getPhotometricScene()); System.out.println("(Re)using photometric calibration from this sequence reference "+quadCLT_ref.getPhotometricScene());
quadCLT_ref.setQuadClt(); // just in case ? quadCLT_ref.setQuadClt(); // just in case ?
} }
quadCLT_ref.setBlueSky ( quadCLT_ref.setBlueSky ( // initial BS from single scene
max_disparity,
max_disparity_strength,
sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this
lma_seed, lma_seed,
seed_temp, //double seed_temp, // 0.5; // seed colder that this point between min and max temp
sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
lim_temp, // double lim_temp, // 0.5; // sky colder that this point between min and max temp
sky_shrink, // int sky_shrink, // = 4; sky_shrink, // int sky_shrink, // = 4;
sky_expand_extra, // int sky_expand_extra, // = 100; // 1? sky_expand_extra, // int sky_expand_extra, // = 100; // 1?
sky_bottleneck, //int sky_bottleneck, // sky_bottleneck, //int sky_bottleneck, //
sky_reexpand_extra, //int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
cold_frac, // = 0.005; // this and lower will scale fom by cold_scale cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
hot_frac, // = 0.9; // this and above will scale fom by 1.0 hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -4004,6 +4016,7 @@ public class OpticalFlow { ...@@ -4004,6 +4016,7 @@ public class OpticalFlow {
dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread, dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread,
dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], // double [] spread, dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], // double [] spread,
dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val, dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val,
dbg_scene, // QuadCLT dbg_scene, // use to save debug images if not null
batch_mode? -1: 1); /// debugLevel); // int debugLevel) batch_mode? -1: 1); /// debugLevel); // int debugLevel)
if (ran_photo_each) { if (ran_photo_each) {
// quadCLT_ref.setBlueSky(null); // Reset blue sky - is it needed? // quadCLT_ref.setBlueSky(null); // Reset blue sky - is it needed?
...@@ -4067,16 +4080,23 @@ public class OpticalFlow { ...@@ -4067,16 +4080,23 @@ public class OpticalFlow {
final int debugLevel) { final int debugLevel) {
boolean photo_each = clt_parameters.photo_each; // true; // perform photogrammetric calibration to equalize pixel values boolean photo_each = clt_parameters.photo_each; // true; // perform photogrammetric calibration to equalize pixel values
boolean photo_to_main= clt_parameters.photo_to_main; // maybe it will not be needed, it will apply this calibration to the next scene sequence boolean photo_to_main= clt_parameters.photo_to_main; // maybe it will not be needed, it will apply this calibration to the next scene sequence
boolean sky_recalc = clt_parameters.imp.sky_recalc; // force blue sky recalculation even if it exists
double sky_highest_min = clt_parameters.imp.sky_highest_min; double sky_highest_min = clt_parameters.imp.sky_highest_min;
double cold_frac = clt_parameters.imp.cold_frac; double cold_frac = clt_parameters.imp.cold_frac;
double hot_frac = clt_parameters.imp.hot_frac; double hot_frac = clt_parameters.imp.hot_frac;
double cold_scale = clt_parameters.imp.cold_scale; double cold_scale = clt_parameters.imp.cold_scale;
double sky_seed = clt_parameters.imp.sky_seed; double sky_seed = clt_parameters.imp.sky_seed;
double lma_seed = clt_parameters.imp.lma_seed; double lma_seed = clt_parameters.imp.lma_seed;
double seed_temp = clt_parameters.imp.seed_temp;
int sky_shrink = clt_parameters.imp.sky_shrink; int sky_shrink = clt_parameters.imp.sky_shrink;
int sky_bottleneck = clt_parameters.imp.sky_bottleneck; int sky_bottleneck = clt_parameters.imp.sky_bottleneck;
int sky_reexpand_extra = clt_parameters.imp.sky_reexpand_extra;
int seed_rows = clt_parameters.imp.seed_rows; int seed_rows = clt_parameters.imp.seed_rows;
double max_disparity = clt_parameters.imp.max_disparity;
double max_disparity_strength=clt_parameters.imp.max_disparity_strength;
double sky_lim = clt_parameters.imp.sky_lim; double sky_lim = clt_parameters.imp.sky_lim;
double lim_temp = clt_parameters.imp.lim_temp;
int sky_expand_extra = clt_parameters.imp.sky_expand_extra; int sky_expand_extra = clt_parameters.imp.sky_expand_extra;
double min_strength = clt_parameters.imp.min_strength; double min_strength = clt_parameters.imp.min_strength;
int lowest_sky_row = clt_parameters.imp.lowest_sky_row; int lowest_sky_row = clt_parameters.imp.lowest_sky_row;
...@@ -4086,7 +4106,8 @@ public class OpticalFlow { ...@@ -4086,7 +4106,8 @@ public class OpticalFlow {
double disp_boost_diff = clt_parameters.imp.disp_boost_diff; // 0.35; double disp_boost_diff = clt_parameters.imp.disp_boost_diff; // 0.35;
int disp_boost_neibs = clt_parameters.imp.disp_boost_neibs; // 2; int disp_boost_neibs = clt_parameters.imp.disp_boost_neibs; // 2;
double disp_boost_amount = clt_parameters.imp.disp_boost_amount; // 2.0; double disp_boost_amount = clt_parameters.imp.disp_boost_amount; // 2.0;
double scale_combo_strength =clt_parameters.imp.scale_combo_strength; //0.4; // reduce strength when it comes from combo, not DSI-MAIN
QuadCLT dbg_scene = clt_parameters.imp.save_debug_images? quadCLT_ref: null; // use to save debug images if not null
// if (build_ref_dsi) { // if (build_ref_dsi) {
// need to read photometric from reference scene -INTERFRAME.corr-xml, and if it exists - set and propagate to main? // need to read photometric from reference scene -INTERFRAME.corr-xml, and if it exists - set and propagate to main?
if (photo_each && !quadCLT_ref.isPhotometricThis()) { if (photo_each && !quadCLT_ref.isPhotometricThis()) {
...@@ -4108,22 +4129,55 @@ public class OpticalFlow { ...@@ -4108,22 +4129,55 @@ public class OpticalFlow {
// read DSI_MAIN // read DSI_MAIN
double [][] dsi = quadCLT_ref.readDsiMain(); double [][] dsi = quadCLT_ref.readDsiMain();
quadCLT_ref.setDSI(dsi); // was not here! (11/26/2022) quadCLT_ref.setDSI(dsi); // was not here! (11/26/2022)
double [][] combo_dsi = null;
if (dsi[TwoQuadCLT.DSI_SPREAD_AUX] == null) { if (dsi[TwoQuadCLT.DSI_SPREAD_AUX] == null) {
System.out.println("DSI_MAIN file has old format and does not have spread data, will recalculate."); System.out.println("DSI_MAIN file has old format and does not have spread data, will recalculate.");
} else { } else {
// boolean [] ref_blue_sky = quadCLT_ref.getBlueSky(); // boolean used_combo = false;
if ((dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX] == null) || sky_recalc) { //
// Sets quadCLT_ref.dsi and blue sky (if exists)
combo_dsi = quadCLT_ref.restoreComboDSI(true); // result is full length, missing slices are null
if (combo_dsi != null) {
dsi[TwoQuadCLT.DSI_STRENGTH_AUX] = combo_dsi[COMBO_DSN_INDX_STRENGTH]; // double [] strength,
dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA]= combo_dsi[COMBO_DSN_INDX_LMA]; //double [] disp_lma,
dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX] = combo_dsi[COMBO_DSN_INDX_BLUE_SKY]; // if exist, already set to quadCLT_ref.dsi
// used_combo = true;
}
/*
if (quadCLT_ref.restoreInterDSI(true) > 0) {
double [][] combo_dsi = quadCLT_ref.dsi;
dsi[TwoQuadCLT.DSI_STRENGTH_AUX] = combo_dsi[COMBO_DSN_INDX_STRENGTH]; // double [] strength,
dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA]= combo_dsi[COMBO_DSN_INDX_LMA]; //double [] disp_lma,
dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX] = combo_dsi[COMBO_DSN_INDX_BLUE_SKY];
used_combo = true;
}
*/
}
double [] ref_blue_sky = dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX]; double [] ref_blue_sky = dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX];
if (ref_blue_sky == null) { if ((ref_blue_sky == null) || sky_recalc) {
if (debugLevel > -3) { if (debugLevel > -3) {
System.out.println("Blue Sky does not exist calculating and updating photometrics"); System.out.println("Blue Sky does not exist or recalculation is forced. Calculating and updating photometrics");
}
double [] bs_strength = dsi[TwoQuadCLT.DSI_STRENGTH_AUX].clone();
// try getting combo dsi
if ((combo_dsi != null) && (scale_combo_strength != 1.0) && dsi[TwoQuadCLT.DSI_STRENGTH_AUX]!= null) {
for (int i = 0; i < dsi[TwoQuadCLT.DSI_STRENGTH_AUX].length; i++) {
bs_strength[i] *= scale_combo_strength;
}
//scale_combo_strength
} }
quadCLT_ref.setBlueSky ( quadCLT_ref.setBlueSky (
max_disparity,
max_disparity_strength,
sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this
lma_seed, // 2.0; // seed - disparity_lma limit lma_seed, // 2.0; // seed - disparity_lma limit
seed_temp, //double seed_temp, // 0.5; // seed colder that this point between min and max temp
sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
lim_temp, // double lim_temp, // 0.5; // sky colder that this point between min and max temp
sky_shrink, // int sky_shrink, // = 4; sky_shrink, // int sky_shrink, // = 4;
sky_expand_extra, // int sky_expand_extra, // = 100; // 1? sky_expand_extra, // int sky_expand_extra, // = 100; // 1?
sky_bottleneck, //int sky_bottleneck, // sky_bottleneck, //int sky_bottleneck, //
sky_reexpand_extra, //int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
cold_frac, // = 0.005; // this and lower will scale fom by cold_scale cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
hot_frac, // = 0.9; // this and above will scale fom by 1.0 hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -4137,24 +4191,33 @@ public class OpticalFlow { ...@@ -4137,24 +4191,33 @@ public class OpticalFlow {
disp_boost_diff, //double disp_boost_diff, // = 0.35; disp_boost_diff, //double disp_boost_diff, // = 0.35;
disp_boost_neibs, //int disp_boost_neibs, // = 2; disp_boost_neibs, //int disp_boost_neibs, // = 2;
disp_boost_amount, //double disp_boost_amount, // = 2.0; disp_boost_amount, //double disp_boost_amount, // = 2.0;
dsi[TwoQuadCLT.DSI_STRENGTH_AUX], // double [] strength, bs_strength, // dsi[TwoQuadCLT.DSI_STRENGTH_AUX], // double [] strength,
dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread, dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread,
dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], //double [] disp_lma, dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], //double [] disp_lma,
dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val, dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val,
dbg_scene, // QuadCLT dbg_scene, // use to save debug images if not null
debugLevel); // int debugLevel) debugLevel); // int debugLevel)
if (debugLevel > -3) { if (debugLevel > -3) {
System.out.println("Calculated missing Blue Sky in "+quadCLT_ref.getImageName()+ System.out.println("Calculated missing Blue Sky in "+quadCLT_ref.getImageName()+
", re-running photoEach()"); ", re-running photoEach()");
} }
/* // save inter-lma if available
boolean [] blue_sky = quadCLT_ref.getBlueSky(); if (combo_dsi != null) {
if (dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX] == null) { if (debugLevel > -3) {
dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX] = new double [blue_sky.length]; System.out.println("Updating Blue Sky for scene "+quadCLT_ref.getImageName());
} }
for (int i = 0; i < blue_sky.length; i++) { String rslt_suffix = QuadCLTCPU.DSI_SUFFIXES[clt_parameters.correlate_lma?
dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX][i] = blue_sky[i]? 1.0:0.0; QuadCLTCPU.INDEX_INTER_LMA:QuadCLTCPU.INDEX_INTER];
// combo_dsi read from file always has all slices, missing are null
combo_dsi[COMBO_DSN_INDX_BLUE_SKY] = quadCLT_ref.dsi[TwoQuadCLT.DSI_BLUE_SKY_AUX];
quadCLT_ref.saveDoubleArrayInModelDirectory(
rslt_suffix, // String suffix,
OpticalFlow.COMBO_DSN_TITLES, // null, // String [] labels, // or null
combo_dsi, // dbg_data, // double [][] data,
quadCLT_ref.tp.getTilesX(), // tilesX, // int width,
quadCLT_ref.tp.getTilesY()); // int height)
} }
*/
photoEach( photoEach(
clt_parameters, // CLTParameters clt_parameters, clt_parameters, // CLTParameters clt_parameters,
colorProcParameters, // ColorProcParameters colorProcParameters, colorProcParameters, // ColorProcParameters colorProcParameters,
...@@ -4171,6 +4234,7 @@ public class OpticalFlow { ...@@ -4171,6 +4234,7 @@ public class OpticalFlow {
if (debugLevel > -3) { if (debugLevel > -3) {
System.out.println("Blue Sky is available, reusing it, no need for updating photometrics"); System.out.println("Blue Sky is available, reusing it, no need for updating photometrics");
} }
quadCLT_ref.setBlueSky(ref_blue_sky); // fixing old case where DSI-MAIN did not have bs while combo - did
} }
} }
} }
...@@ -4820,10 +4884,11 @@ public class OpticalFlow { ...@@ -4820,10 +4884,11 @@ public class OpticalFlow {
System.out.println("**** Running photometric equalization *****"); System.out.println("**** Running photometric equalization *****");
} }
if (combo_dsn_final == null) { // always re-read? if (combo_dsn_final == null) { // always re-read?
combo_dsn_final =quadCLTs[ref_index].readDoubleArrayFromModelDirectory( // always re-read? /// combo_dsn_final =quadCLTs[ref_index].readDoubleArrayFromModelDirectory( // always re-read?
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
combo_dsn_final =quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
} }
double [][] combo_dsn_final_filtered = double [][] combo_dsn_final_filtered =
...@@ -4890,10 +4955,12 @@ public class OpticalFlow { ...@@ -4890,10 +4955,12 @@ public class OpticalFlow {
disparity_raw = new double [tilesX * tilesY]; disparity_raw = new double [tilesX * tilesY];
Arrays.fill(disparity_raw,clt_parameters.disparity); Arrays.fill(disparity_raw,clt_parameters.disparity);
if (combo_dsn_final == null) { if (combo_dsn_final == null) {
combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory( /// combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory(
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
combo_dsn_final =quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
} }
double [][] dls = { double [][] dls = {
combo_dsn_final[COMBO_DSN_INDX_DISP], combo_dsn_final[COMBO_DSN_INDX_DISP],
...@@ -5346,10 +5413,12 @@ public class OpticalFlow { ...@@ -5346,10 +5413,12 @@ public class OpticalFlow {
if (export_images) { if (export_images) {
if (combo_dsn_final == null) { if (combo_dsn_final == null) {
combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory( /// combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory(
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
combo_dsn_final =quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
} }
double [][] dls = { double [][] dls = {
combo_dsn_final[COMBO_DSN_INDX_DISP], combo_dsn_final[COMBO_DSN_INDX_DISP],
...@@ -5586,10 +5655,12 @@ public class OpticalFlow { ...@@ -5586,10 +5655,12 @@ public class OpticalFlow {
if (export_dsi_image || show_dsi_image) { if (export_dsi_image || show_dsi_image) {
if (combo_dsn_final == null) { if (combo_dsn_final == null) {
combo_dsn_final =quadCLTs[ref_index].readDoubleArrayFromModelDirectory( /// combo_dsn_final =quadCLTs[ref_index].readDoubleArrayFromModelDirectory(
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
combo_dsn_final =quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
} }
// re-load , should create quadCLTs[ref_index].dsi // re-load , should create quadCLTs[ref_index].dsi
...@@ -5636,10 +5707,12 @@ public class OpticalFlow { ...@@ -5636,10 +5707,12 @@ public class OpticalFlow {
if (export_ml_files) { if (export_ml_files) {
if (combo_dsn_final == null) { // always re-read? if (combo_dsn_final == null) { // always re-read?
combo_dsn_final =quadCLTs[ref_index].readDoubleArrayFromModelDirectory( // always re-read? /// combo_dsn_final =quadCLTs[ref_index].readDoubleArrayFromModelDirectory( // always re-read?
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
combo_dsn_final =quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
} }
double [][] combo_dsn_final_filtered = double [][] combo_dsn_final_filtered =
conditionComboDsnFinal( conditionComboDsnFinal(
...@@ -5694,10 +5767,12 @@ public class OpticalFlow { ...@@ -5694,10 +5767,12 @@ public class OpticalFlow {
int tilesY = quadCLTs[ref_index].getTileProcessor().getTilesY(); int tilesY = quadCLTs[ref_index].getTileProcessor().getTilesY();
double [] disparity_raw = new double [tilesX * tilesY]; double [] disparity_raw = new double [tilesX * tilesY];
Arrays.fill(disparity_raw,clt_parameters.disparity); Arrays.fill(disparity_raw,clt_parameters.disparity);
double [][] combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory( /// double [][] combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory(
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
double [][] combo_dsn_final =quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
double [][] dls = { double [][] dls = {
combo_dsn_final[COMBO_DSN_INDX_DISP], combo_dsn_final[COMBO_DSN_INDX_DISP],
combo_dsn_final[COMBO_DSN_INDX_LMA], combo_dsn_final[COMBO_DSN_INDX_LMA],
...@@ -7342,6 +7417,10 @@ public class OpticalFlow { ...@@ -7342,6 +7417,10 @@ public class OpticalFlow {
"-DSI_INTER", "-DSI_INTER",
true // silent true // silent
) >=0 ) { ) >=0 ) {
/// if (ref_scene.restoreInterDSI( // if there is already calculated with interscene - us it
/// true // silent
/// ) >=0 ) {
System.out.println("IntersceneAccumulate(): Using previously calculated interscene DSI (*-DSI_INTER) as initial DSI"); System.out.println("IntersceneAccumulate(): Using previously calculated interscene DSI (*-DSI_INTER) as initial DSI");
combo_dsn[0] = ref_scene.dsi[ref_scene.is_aux?TwoQuadCLT.DSI_DISPARITY_AUX:TwoQuadCLT.DSI_DISPARITY_MAIN]; combo_dsn[0] = ref_scene.dsi[ref_scene.is_aux?TwoQuadCLT.DSI_DISPARITY_AUX:TwoQuadCLT.DSI_DISPARITY_MAIN];
combo_dsn[1] = ref_scene.dsi[ref_scene.is_aux?TwoQuadCLT.DSI_STRENGTH_AUX:TwoQuadCLT.DSI_STRENGTH_MAIN]; combo_dsn[1] = ref_scene.dsi[ref_scene.is_aux?TwoQuadCLT.DSI_STRENGTH_AUX:TwoQuadCLT.DSI_STRENGTH_MAIN];
...@@ -7720,10 +7799,13 @@ public class OpticalFlow { ...@@ -7720,10 +7799,13 @@ public class OpticalFlow {
double [][] combo_dsn = null; double [][] combo_dsn = null;
// USE reference scene if no individual DSI are available double [][] dsrbg = scene.getDSRBG(); Probably null for non-reference // USE reference scene if no individual DSI are available double [][] dsrbg = scene.getDSRBG(); Probably null for non-reference
// make sure to use already integrated if available // make sure to use already integrated if available
double [][] combo_dsn0 = scenes[indx_ref].readDoubleArrayFromModelDirectory( /// double [][] combo_dsn0 = scenes[indx_ref].readDoubleArrayFromModelDirectory(
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
double [][] combo_dsn0 =scenes[indx_ref].readComboDSI(true); // scenes[indx_ref].dsi and blue sky are NOT updated
if (combo_dsn0 == null) { if (combo_dsn0 == null) {
combo_dsn0 = prepareInitialComboDS( // 3 combo_dsn0 = prepareInitialComboDS( // 3
clt_parameters, // final CLTParameters clt_parameters, clt_parameters, // final CLTParameters clt_parameters,
...@@ -7731,6 +7813,13 @@ public class OpticalFlow { ...@@ -7731,6 +7813,13 @@ public class OpticalFlow {
indx_ref, // final int indx_ref, indx_ref, // final int indx_ref,
debug_level-2); // final int debug_level); debug_level-2); // final int debug_level);
} else { } else {
// set blue sky from read from file ONLY if no BS was calculated for this instance
if ((combo_dsn0[COMBO_DSN_INDX_BLUE_SKY] != null) && !scenes[indx_ref].hasBlueSky()) {
if (debug_level > -2) {
System.out.println("There was no calculated Blue Sky, but a file had it. Will use the loaded one");
scenes[indx_ref].setBlueSky(combo_dsn0[COMBO_DSN_INDX_BLUE_SKY]);
}
}
combo_dsn0 = conditionComboDsnFinal( combo_dsn0 = conditionComboDsnFinal(
true, // boolean use_conf, // use configuration parameters, false - use following true, // boolean use_conf, // use configuration parameters, false - use following
clt_parameters, // CLTParameters clt_parameters, clt_parameters, // CLTParameters clt_parameters,
...@@ -12256,10 +12345,12 @@ public class OpticalFlow { ...@@ -12256,10 +12345,12 @@ public class OpticalFlow {
int tilesY = quadCLTs[ref_index].getTileProcessor().getTilesY(); int tilesY = quadCLTs[ref_index].getTileProcessor().getTilesY();
double [] disparity_raw = new double [tilesX * tilesY]; double [] disparity_raw = new double [tilesX * tilesY];
Arrays.fill(disparity_raw,clt_parameters.disparity); Arrays.fill(disparity_raw,clt_parameters.disparity);
double [][] combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory( /// double [][] combo_dsn_final = quadCLTs[ref_index].readDoubleArrayFromModelDirectory(
"-INTER-INTRA-LMA", // String suffix, /// "-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all) /// 0, // int num_slices, // (0 - all)
null); // int [] wh); /// null); // int [] wh);
double [][] combo_dsn_final = quadCLTs[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
double [][] dls = { double [][] dls = {
combo_dsn_final[COMBO_DSN_INDX_DISP], combo_dsn_final[COMBO_DSN_INDX_DISP],
combo_dsn_final[COMBO_DSN_INDX_LMA], combo_dsn_final[COMBO_DSN_INDX_LMA],
......
...@@ -86,8 +86,8 @@ import loci.formats.FormatException; ...@@ -86,8 +86,8 @@ import loci.formats.FormatException;
public class QuadCLTCPU { public class QuadCLTCPU {
public static final String [] DSI_SUFFIXES = {"-INTER-INTRA-LMA","-INTER-INTRA","-DSI_MAIN"}; public static final String [] DSI_SUFFIXES = {"-INTER-INTRA-LMA","-INTER-INTRA","-DSI_MAIN"};
public static int INDEX_INTER = 0; public static int INDEX_INTER_LMA = 0;
public static int INDEX_INTER_LMA = 1; public static int INDEX_INTER = 1;
public static int INDEX_DSI_MAIN = 2; public static int INDEX_DSI_MAIN = 2;
public static final String [] FGBG_TITLES_ADJ = {"disparity","strength"}; public static final String [] FGBG_TITLES_ADJ = {"disparity","strength"};
// public static final String [] FGBG_TITLES = {"disparity","strength", "rms","rms-split","fg-disp","fg-str","bg-disp","bg-str"}; // public static final String [] FGBG_TITLES = {"disparity","strength", "rms","rms-split","fg-disp","fg-str","bg-disp","bg-str"};
...@@ -424,6 +424,8 @@ public class QuadCLTCPU { ...@@ -424,6 +424,8 @@ public class QuadCLTCPU {
* Expansion by 1 is horizontal/vertical only, by 2 includes diagonals, * Expansion by 1 is horizontal/vertical only, by 2 includes diagonals,
* and so on. * and so on.
* *
* @param max_disparity maximal disparity for the sky area
* @param max_disparity_strength maximal strength of the too high disparity to count
* @param sky_seed minimal value of strength*spread to seed sky areas * @param sky_seed minimal value of strength*spread to seed sky areas
* @param disparity_seed maximal disparity to seed sky areas (not needed for expand) * @param disparity_seed maximal disparity to seed sky areas (not needed for expand)
* @param sky_lim maximal value of strength*spread over which sky area will * @param sky_lim maximal value of strength*spread over which sky area will
...@@ -441,12 +443,17 @@ public class QuadCLTCPU { ...@@ -441,12 +443,17 @@ public class QuadCLTCPU {
* @return boolean 1d array of the pixels belonging to the blue sky. * @return boolean 1d array of the pixels belonging to the blue sky.
*/ */
public static boolean [] getBlueSky ( public static boolean [] getBlueSky (
double max_disparity,
double max_disparity_strength,
double sky_seed, // = 7.0; // start with product of strength by diff_second below this double sky_seed, // = 7.0; // start with product of strength by diff_second below this
double disparity_seed, // 2.0; // seed - disparity_lma limit double disparity_seed, // 2.0; // seed - disparity_lma limit
double seed_temp, // 0.5; // seed colder that this point between min and max temp
double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
double lim_temp, // 0.5; // sky colder that this point between min and max temp
int sky_shrink, // = 4; int sky_shrink, // = 4;
int sky_expand_extra, // = 100; // 1? int sky_expand_extra, // = 100; // 1?
int sky_bottleneck, // int sky_bottleneck, //
int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
double cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence double cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
double cold_frac, // = 0.005; // this and lower will scale fom by cold_scale double cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
double hot_frac, // = 0.9; // this and above will scale fom by 1.0 double hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -467,7 +474,7 @@ public class QuadCLTCPU { ...@@ -467,7 +474,7 @@ public class QuadCLTCPU {
double [] spread, double [] spread,
double [] disparity, double [] disparity,
double [] avg_val, double [] avg_val,
QuadCLT scene, // use to save debug images if not null
int debugLevel) { // >0 to show int debugLevel) { // >0 to show
if ((strength == null) || (spread==null)) { if ((strength == null) || (spread==null)) {
return null; return null;
...@@ -559,9 +566,9 @@ public class QuadCLTCPU { ...@@ -559,9 +566,9 @@ public class QuadCLTCPU {
String [] dbg_in_titles = {"fom", "strength", "spread", "disparity", "avg_val", "tscale"}; String [] dbg_in_titles = {"fom", "strength", "spread", "disparity", "avg_val", "tscale"};
String [] dbg_titles = {"sky", "seed", "max", "shrank","full_shrank","neck_shrank","reexpand"}; String [] dbg_titles = {"sky", "seed", "max", "expanded", "shrank","temp_shrank","neck_shrank","reexpand"};
double [][] dbg_img = (debugLevel>0) ? new double [dbg_titles.length][strength.length]:null; double [][] dbg_img = ((debugLevel>0) || (scene != null))? new double [dbg_titles.length][strength.length]:null;
TileNeibs tn = new TileNeibs(width,strength.length/width); TileNeibs tn = new TileNeibs(width,strength.length/width);
boolean [] sky_tiles = new boolean [strength.length]; boolean [] sky_tiles = new boolean [strength.length];
...@@ -600,14 +607,27 @@ public class QuadCLTCPU { ...@@ -600,14 +607,27 @@ public class QuadCLTCPU {
dbg_in_titles); // dsrbg_titles); dbg_in_titles); // dsrbg_titles);
} }
if (scene != null) {
scene.saveDoubleArrayInModelDirectory(
scene.getImageName() + "-sky_input",
dbg_in_titles, // String [] labels, // or null
new double[][] {fom, strength, spread, disparity, avg_val, temp_scales}, // double [][] data,
width, // int width,
fom.length/width); // int height)
}
double max_temp_seed = temp_cold * (1.0 - seed_temp) + temp_hot * seed_temp;
double max_temp_lim = temp_cold * (1.0 - lim_temp) + temp_hot * lim_temp;
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
prohibit_tiles[i] = (fom[i] >= sky_lim); prohibit_tiles[i] = (fom[i] >= sky_lim) ||
sky_tiles[i] = (fom[i] < sky_seed) && !(disparity[i] > disparity_seed); ((strength[i] >= max_disparity_strength) && (disparity[i] >= max_disparity)) ||
(avg_val[i] >= max_temp_lim);
sky_tiles[i] = (fom[i] < sky_seed) &&
!(disparity[i] > disparity_seed) &&
!prohibit_tiles[i] &&
(avg_val[i] < max_temp_seed);
} }
//seed_rows //seed_rows
if (dbg_img != null) { if (dbg_img != null) {
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
...@@ -616,7 +636,7 @@ public class QuadCLTCPU { ...@@ -616,7 +636,7 @@ public class QuadCLTCPU {
} }
} }
tn.shrinkSelection( tn.shrinkSelection(
sky_shrink, // int shrink, // grow tile selection by 1 over non-background tiles 1: 4 directions, 2 - 8 directions, 3 - 8 by 1, 4 by 1 more sky_shrink, // int shrink,
sky_tiles, // boolean [] tiles, sky_tiles, // boolean [] tiles,
null); // boolean [] prohibit) null); // boolean [] prohibit)
if (seed_rows > 0) { if (seed_rows > 0) {
...@@ -625,7 +645,7 @@ public class QuadCLTCPU { ...@@ -625,7 +645,7 @@ public class QuadCLTCPU {
boolean [] seed_sky = sky_tiles.clone(); boolean [] seed_sky = sky_tiles.clone();
if (dbg_img != null) { if (dbg_img != null) {
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
dbg_img[3][i] = sky_tiles[i]? 1 : 0; dbg_img[4][i] = sky_tiles[i]? 1 : 0;
} }
} }
...@@ -641,6 +661,12 @@ public class QuadCLTCPU { ...@@ -641,6 +661,12 @@ public class QuadCLTCPU {
sky_tiles, // boolean [] tiles, sky_tiles, // boolean [] tiles,
null); // boolean [] prohibit) null); // boolean [] prohibit)
} }
if (dbg_img != null) {
for (int i = 0; i < sky_tiles.length; i++) {
dbg_img[3][i] = sky_tiles[i]? 1 : 0;
}
}
//shrink_neck //shrink_neck
// Remove leaks through small holes // Remove leaks through small holes
if (sky_bottleneck > 0) { if (sky_bottleneck > 0) {
...@@ -654,17 +680,17 @@ public class QuadCLTCPU { ...@@ -654,17 +680,17 @@ public class QuadCLTCPU {
} }
sky_tiles = seed_sky.clone(); sky_tiles = seed_sky.clone();
tn.growSelection( tn.growSelection(
4*width , // int shrink, // grow tile selection by 1 over non-background tiles 1: 4 directions, 2 - 8 directions, 3 - 8 by 1, 4 by 1 more 4*width , // int shrink,
sky_tiles, // boolean [] tiles, sky_tiles, // boolean [] tiles,
prohibit_neck); // boolean [] prohibit) prohibit_neck); // boolean [] prohibit)
tn.growSelection( tn.growSelection(
sky_bottleneck , // int shrink, // grow tile selection by 1 over non-background tiles 1: 4 directions, 2 - 8 directions, 3 - 8 by 1, 4 by 1 more sky_bottleneck + sky_reexpand_extra , // int shrink,
sky_tiles, // boolean [] tiles, sky_tiles, // boolean [] tiles,
prohibit_tiles); // boolean [] prohibit) prohibit_tiles); // boolean [] prohibit)
if (dbg_img != null) { if (dbg_img != null) {
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
dbg_img[5][i] = prohibit_neck[i]? 0 : 1; dbg_img[6][i] = prohibit_neck[i]? 0 : 1;
dbg_img[6][i] = sky_tiles[i]? 1 : 0; dbg_img[7][i] = sky_tiles[i]? 1 : 0;
} }
} }
...@@ -686,7 +712,7 @@ public class QuadCLTCPU { ...@@ -686,7 +712,7 @@ public class QuadCLTCPU {
} }
if (dbg_img != null) { if (dbg_img != null) {
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
dbg_img[4][i] = shrank_sky[i]? 1 : 0; dbg_img[5][i] = shrank_sky[i]? 1 : 0;
} }
} }
} }
...@@ -695,6 +721,7 @@ public class QuadCLTCPU { ...@@ -695,6 +721,7 @@ public class QuadCLTCPU {
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
dbg_img[0][i] = sky_tiles[i]? 1 : 0; dbg_img[0][i] = sky_tiles[i]? 1 : 0;
} }
if (debugLevel>0) {
ShowDoubleFloatArrays.showArrays( ShowDoubleFloatArrays.showArrays(
dbg_img, dbg_img,
width, width,
...@@ -703,6 +730,15 @@ public class QuadCLTCPU { ...@@ -703,6 +730,15 @@ public class QuadCLTCPU {
"sky_selection", "sky_selection",
dbg_titles); // dsrbg_titles); dbg_titles); // dsrbg_titles);
} }
if (scene != null) {
scene.saveDoubleArrayInModelDirectory(
scene.getImageName() + "-sky_selection",
dbg_titles, // String [] labels, // or null
dbg_img, // double [][] data,
width, // int width,
fom.length/width); // int height)
}
}
for (int i = lowest_sky_row*width; i < sky_tiles.length; i++) { for (int i = lowest_sky_row*width; i < sky_tiles.length; i++) {
...@@ -722,10 +758,7 @@ public class QuadCLTCPU { ...@@ -722,10 +758,7 @@ public class QuadCLTCPU {
} }
return sky_tiles; return sky_tiles;
} }
// @Deprecated
// public boolean [] getBlueSky () {
// return this.blue_sky;
// }
public double [] getDoubleBlueSky() { public double [] getDoubleBlueSky() {
if (this.dsi == null) { if (this.dsi == null) {
return null; return null;
...@@ -770,12 +803,17 @@ public class QuadCLTCPU { ...@@ -770,12 +803,17 @@ public class QuadCLTCPU {
public void setBlueSky ( public void setBlueSky (
double max_disparity,
double max_disparity_strength,
double sky_seed, // = 7.0; // start with product of strength by diff_second below this double sky_seed, // = 7.0; // start with product of strength by diff_second below this
double lma_seed, // 2.0; // seed - disparity_lma limit double lma_seed, // 2.0; // seed - disparity_lma limit
double seed_temp, // 0.5; // seed colder that this point between min and max temp
double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
double lim_temp, // 0.5; // sky colder that this point between min and max temp
int sky_shrink, // = 4; int sky_shrink, // = 4;
int sky_expand_extra, // = 100; // 1? int sky_expand_extra, // = 100; // 1?
int sky_bottleneck, // int sky_bottleneck,
int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
double cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence double cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
double cold_frac, // = 0.005; // this and lower will scale fom by cold_scale double cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
double hot_frac, // = 0.9; // this and above will scale fom by 1.0 double hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -793,16 +831,22 @@ public class QuadCLTCPU { ...@@ -793,16 +831,22 @@ public class QuadCLTCPU {
double [] spread, double [] spread,
double [] disp_lma, double [] disp_lma,
double [] avg_val, double [] avg_val,
QuadCLT dbg_scene, // use to save debug images if not null
int debugLevel) { int debugLevel) {
int width = tp.getTilesX(); int width = tp.getTilesX();
// this.blue_sky = getBlueSky ( // this.blue_sky = getBlueSky (
setBlueSky(getBlueSky ( setBlueSky(getBlueSky (
max_disparity,
max_disparity_strength,
sky_seed, // = 7.0; // start with product of strength by diff_second below this sky_seed, // = 7.0; // start with product of strength by diff_second below this
lma_seed, // 2.0; // seed - disparity_lma limit lma_seed, // 2.0; // seed - disparity_lma limit
seed_temp, //double seed_temp, // 0.5; // seed colder that this point between min and max temp
sky_lim, // = 15.0; // then expand to product of strength by diff_second below this sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
lim_temp, //double lim_temp, // 0.5; // sky colder that this point between min and max temp
sky_shrink, // = 4; sky_shrink, // = 4;
sky_expand_extra, // = 100; // 1? sky_expand_extra, // = 100; // 1?
sky_bottleneck, // sky_bottleneck, //
sky_reexpand_extra, // int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
cold_frac, // = 0.005; // this and lower will scale fom by cold_scale cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
hot_frac, // = 0.9; // this and above will scale fom by 1.0 hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -821,12 +865,17 @@ public class QuadCLTCPU { ...@@ -821,12 +865,17 @@ public class QuadCLTCPU {
spread, spread,
disp_lma, disp_lma,
avg_val, avg_val,
dbg_scene, // use to save debug images if not null
debugLevel)); debugLevel));
} }
public void setDSI( double [][] dsi) { public void setDSI( double [][] dsi) {
this.dsi = dsi; // make sure available blue sky is not erased this.dsi = dsi; // make sure available blue sky is not erased
} }
/**
* Sets dsi from combo_dsi. Does not reset blue sky if it does not exist
* @param combo_dsi
*/
public void setDSIFromCombo( public void setDSIFromCombo(
double [][] combo_dsi) { double [][] combo_dsi) {
this.dsi = new double [TwoQuadCLT.DSI_SLICES.length][]; // will not have DSI_SPREAD_AUX this.dsi = new double [TwoQuadCLT.DSI_SLICES.length][]; // will not have DSI_SPREAD_AUX
...@@ -836,9 +885,11 @@ public class QuadCLTCPU { ...@@ -836,9 +885,11 @@ public class QuadCLTCPU {
combo_dsi[OpticalFlow.COMBO_DSN_INDX_STRENGTH]; combo_dsi[OpticalFlow.COMBO_DSN_INDX_STRENGTH];
this.dsi[is_aux?TwoQuadCLT.DSI_DISPARITY_AUX_LMA:TwoQuadCLT.DSI_DISPARITY_MAIN_LMA] = this.dsi[is_aux?TwoQuadCLT.DSI_DISPARITY_AUX_LMA:TwoQuadCLT.DSI_DISPARITY_MAIN_LMA] =
combo_dsi[OpticalFlow.COMBO_DSN_INDX_LMA]; combo_dsi[OpticalFlow.COMBO_DSN_INDX_LMA];
if ((combo_dsi.length > OpticalFlow.COMBO_DSN_INDX_BLUE_SKY) && (combo_dsi[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY] != null)) {
this.dsi[is_aux?TwoQuadCLT.DSI_BLUE_SKY_AUX:TwoQuadCLT.DSI_BLUE_SKY_MAIN] = this.dsi[is_aux?TwoQuadCLT.DSI_BLUE_SKY_AUX:TwoQuadCLT.DSI_BLUE_SKY_MAIN] =
combo_dsi[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY]; combo_dsi[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY];
} }
}
public boolean dsiExists() { public boolean dsiExists() {
...@@ -864,6 +915,67 @@ public class QuadCLTCPU { ...@@ -864,6 +915,67 @@ public class QuadCLTCPU {
return num_slices >= 0; return num_slices >= 0;
} }
@Deprecated
public int restoreInterDSI(boolean silent) {
for (int indx: new int[]{INDEX_INTER_LMA, INDEX_INTER}) {
int num_slices = restoreDSI(
DSI_SUFFIXES[indx], // String suffix, // "-DSI_COMBO", "-DSI_MAIN" (DSI_COMBO_SUFFIX, DSI_MAIN_SUFFIX)
null, // double [][] dsi, // if null - just check file exists
true); // boolean silent);
if (num_slices >= 0) {
this.dsi = new double [TwoQuadCLT.DSI_SLICES.length][];
return restoreDSI(
DSI_SUFFIXES[indx], // String suffix, // "-DSI_COMBO", "-DSI_MAIN" (DSI_COMBO_SUFFIX, DSI_MAIN_SUFFIX)
dsi, // double [][] dsi, // if null - just check file exists
silent); // boolean silent);
}
}
return 0;
}
/**
* Tries to read combo DSI, if successful - sets this.dsi and blue sky
* @param silent
* @return combo DSI if read, null if failed to read. Result has full lenghth
* (OpticalFlow.COMBO_DSN_TITLES.length), missing slices are null
*/
public double [][] restoreComboDSI (boolean silent) {
double [][] combo_dsi = new double [OpticalFlow.COMBO_DSN_TITLES.length][];
for (int indx: new int[]{INDEX_INTER_LMA, INDEX_INTER}) {
int num_slices = restoreDSI(
DSI_SUFFIXES[indx], // String suffix, // "-DSI_COMBO", "-DSI_MAIN" (DSI_COMBO_SUFFIX, DSI_MAIN_SUFFIX)
combo_dsi, // double [][] dsi, // if null - just check file exists
silent); // boolean silent);
if (num_slices >= 0) {
System.out.println ("restoreComboDSI(): used "+getX3dDirectory()+ Prefs.getFileSeparator() + image_name + DSI_SUFFIXES[indx] + ".tiff");
setDSIFromCombo(combo_dsi); // reformat
return combo_dsi;
}
}
return null;
}
public double [][] readComboDSI (boolean silent) {
double [][] combo_dsi = new double [OpticalFlow.COMBO_DSN_TITLES.length][];
for (int indx: new int[]{INDEX_INTER_LMA, INDEX_INTER}) {
int num_slices = restoreDSI(
DSI_SUFFIXES[indx], // String suffix, // "-DSI_COMBO", "-DSI_MAIN" (DSI_COMBO_SUFFIX, DSI_MAIN_SUFFIX)
combo_dsi, // double [][] dsi, // if null - just check file exists
silent); // boolean silent);
if (num_slices >= 0) {
System.out.println ("readComboDSI(): used "+getX3dDirectory()+ Prefs.getFileSeparator() +
image_name + DSI_SUFFIXES[indx] + ".tiff, instance.dsi and blue sky are not updated!");
setDSIFromCombo(combo_dsi); // reformat
return combo_dsi;
}
}
return null;
}
public int restoreDSI( public int restoreDSI(
String suffix, String suffix,
boolean silent) // "-DSI_COMBO", "-DSI_MAIN" (DSI_COMBO_SUFFIX, DSI_MAIN_SUFFIX) boolean silent) // "-DSI_COMBO", "-DSI_MAIN" (DSI_COMBO_SUFFIX, DSI_MAIN_SUFFIX)
...@@ -933,7 +1045,11 @@ public class QuadCLTCPU { ...@@ -933,7 +1045,11 @@ public class QuadCLTCPU {
} }
return -1; return -1;
} }
if (dsi == null) {
System.out.println("restoreDSI(): has "+imp.getStackSize()+" slices in file: "+file_path);
} else {
System.out.println("restoreDSI(): got "+imp.getStackSize()+" slices from file: "+file_path); System.out.println("restoreDSI(): got "+imp.getStackSize()+" slices from file: "+file_path);
}
if (imp.getStackSize() < 2) { if (imp.getStackSize() < 2) {
if (!silent) { if (!silent) {
System.out.println ("Failed to read "+file_path); System.out.println ("Failed to read "+file_path);
...@@ -1249,6 +1365,7 @@ public class QuadCLTCPU { ...@@ -1249,6 +1365,7 @@ public class QuadCLTCPU {
return rgba; return rgba;
} }
public QuadCLTCPU restoreFromModel( // restores dsi public QuadCLTCPU restoreFromModel( // restores dsi
CLTParameters clt_parameters, CLTParameters clt_parameters,
ColorProcParameters colorProcParameters, ColorProcParameters colorProcParameters,
...@@ -1715,13 +1832,10 @@ public class QuadCLTCPU { ...@@ -1715,13 +1832,10 @@ public class QuadCLTCPU {
} }
public double [][] readDoubleArrayFromModelDirectory( public double [][] readDoubleArrayFromModelDirectory(
String suffix, String suffix,
int num_slices, // (0 - all) int num_slices, // (0 - all)
int [] wh int [] wh)
)
{ {
// final int [] image_wh = geometryCorrection.getSensorWH(); // final int [] image_wh = geometryCorrection.getSensorWH();
String x3d_path = getX3dDirectory(); String x3d_path = getX3dDirectory();
......
...@@ -572,6 +572,10 @@ public class TexturedModel { ...@@ -572,6 +572,10 @@ public class TexturedModel {
final int tilesX, final int tilesX,
int debugLevel_in) int debugLevel_in)
{ {
if ((debugLevel_in > -2) && is_sky_cluster) {
System.out.println("buildTileCluster(): processing sky clusterm cluster_list.size()="+cluster_list.size());
}
final int dbg_tile = -2410; // 858; // -3868; // 28+48*80; final int dbg_tile = -2410; // 858; // -3868; // 28+48*80;
// final int num_layers = disparity_layers.length; // final int num_layers = disparity_layers.length;
final int tiles = source_disparity.length; final int tiles = source_disparity.length;
...@@ -1417,6 +1421,9 @@ public class TexturedModel { ...@@ -1417,6 +1421,9 @@ public class TexturedModel {
} }
// next_seed_tile_layer is now {tile, layer} // next_seed_tile_layer is now {tile, layer}
final boolean is_sky_cluster = (next_seed_tile_layer[1] == blue_sky_layer) && blue_sky[next_seed_tile_layer[0]]; final boolean is_sky_cluster = (next_seed_tile_layer[1] == blue_sky_layer) && blue_sky[next_seed_tile_layer[0]];
if ((debugLevel > -2) && is_sky_cluster) {
System.out.println("clusterizeFgBg(): processing sky clusterm cluster_list.size()="+cluster_list.size());
}
double [] cluster_initial_disparity = buildInitialCluster( double [] cluster_initial_disparity = buildInitialCluster(
disparity_layers, // final double [][] disparity_layers, // should not have same tile disparity on multiple layers disparity_layers, // final double [][] disparity_layers, // should not have same tile disparity on multiple layers
seams_layers, // final int [][] seams_layers, seams_layers, // final int [][] seams_layers,
...@@ -1655,7 +1662,7 @@ public class TexturedModel { ...@@ -1655,7 +1662,7 @@ public class TexturedModel {
final boolean showTri = !batch_mode && (debugLevel > -1) && (clt_parameters.show_triangles); final boolean showTri = !batch_mode && (debugLevel > -1) && (clt_parameters.show_triangles);
final boolean disp_hires_tri = !batch_mode && clt_parameters.tex_disp_hires_tri; final boolean disp_hires_tri = !batch_mode && clt_parameters.tex_disp_hires_tri;
final int dbg_scale_mesh = clt_parameters.tex_dbg_scale_mesh; // 4; // <=0 - do not show final int dbg_scale_mesh = clt_parameters.tex_dbg_scale_mesh; // 4; // <=0 - do not show
/// final double min_non_inf = 0.01; // relative to infinity disparity
final int sky_layer = 0; // source disparity layer that contains "blue sky" final int sky_layer = 0; // source disparity layer that contains "blue sky"
...@@ -1668,6 +1675,7 @@ public class TexturedModel { ...@@ -1668,6 +1675,7 @@ public class TexturedModel {
return false; // not used in lwir return false; // not used in lwir
} }
double infinity_disparity = ref_scene.getGeometryCorrection().getDisparityFromZ(clt_parameters.infinityDistance); double infinity_disparity = ref_scene.getGeometryCorrection().getDisparityFromZ(clt_parameters.infinityDistance);
double min_obj_disparity = ref_scene.getGeometryCorrection().getDisparityFromZ(clt_parameters.infinityDistance-clt_parameters.min_from_inf);
X3dOutput x3dOutput = null; X3dOutput x3dOutput = null;
WavefrontExport wfOutput = null; WavefrontExport wfOutput = null;
ArrayList<TriMesh> tri_meshes = null; ArrayList<TriMesh> tri_meshes = null;
...@@ -1683,17 +1691,17 @@ public class TexturedModel { ...@@ -1683,17 +1691,17 @@ public class TexturedModel {
System.out.println("As there was a problem with (wrong?) blue sky setting strength to 0.0001"); System.out.println("As there was a problem with (wrong?) blue sky setting strength to 0.0001");
combo_dsn_final = null; combo_dsn_final = null;
} }
if (combo_dsn_final == null) { if (combo_dsn_final == null) { // does not set scene.dsi from file !!!
combo_dsn_final =scenes[ref_index].readDoubleArrayFromModelDirectory( combo_dsn_final =scenes[ref_index].restoreComboDSI(true); // also sets quadCLTs[ref_index].dsi and blue sky
"-INTER-INTRA-LMA", // String suffix,
0, // int num_slices, // (0 - all)
null); // int [] wh);
} }
boolean [] sky_tiles = new boolean[combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY].length]; boolean [] sky_tiles = new boolean[combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY].length];
boolean [] sky_invert = new boolean[combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY].length]; int num_sky_tiles = 0;
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < sky_tiles.length; i++) {
sky_tiles[i] = combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY][i] > 0.0; sky_tiles[i] = combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY][i] > 0.0;
sky_invert[i] = !sky_tiles[i]; // not used num_sky_tiles += sky_tiles[i]? 1: 0;
}
if (debugLevel > -2) {
System.out.println("output3d(): num_sky_tiles="+num_sky_tiles);
} }
// re-load , should create quadCLTs[ref_index].dsi // re-load , should create quadCLTs[ref_index].dsi
double [][] dls_fg = { double [][] dls_fg = {
...@@ -1703,6 +1711,7 @@ public class TexturedModel { ...@@ -1703,6 +1711,7 @@ public class TexturedModel {
}; };
// currently conditionInitialDS() zeroes disparity for blue_sky. TODO: allow some FG over blue_sky? // currently conditionInitialDS() zeroes disparity for blue_sky. TODO: allow some FG over blue_sky?
// gets Blue Sky from scene.dsi , not from the file!
double [][] ds_fg = OpticalFlow.conditionInitialDS( double [][] ds_fg = OpticalFlow.conditionInitialDS(
true, // boolean use_conf, // use configuration parameters, false - use following true, // boolean use_conf, // use configuration parameters, false - use following
clt_parameters, // CLTParameters clt_parameters, clt_parameters, // CLTParameters clt_parameters,
...@@ -1714,7 +1723,7 @@ public class TexturedModel { ...@@ -1714,7 +1723,7 @@ public class TexturedModel {
combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_LMA_BG].clone(), combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_LMA_BG].clone(),
combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_STRENGTH_BG].clone() combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_STRENGTH_BG].clone()
}; };
for (int i = 0; i < sky_tiles.length; i++) if (Double.isNaN(dls_bg[0][i])){ for (int i = 0; i < dls_bg[0].length; i++) if (Double.isNaN(dls_bg[0][i])){
dls_bg[0][i] = dls_fg[0][i]; dls_bg[0][i] = dls_fg[0][i];
dls_bg[1][i] = dls_fg[1][i]; dls_bg[1][i] = dls_fg[1][i];
dls_bg[2][i] = dls_fg[2][i]; dls_bg[2][i] = dls_fg[2][i];
...@@ -1726,11 +1735,37 @@ public class TexturedModel { ...@@ -1726,11 +1735,37 @@ public class TexturedModel {
scenes[ref_index], // QuadCLT scene, scenes[ref_index], // QuadCLT scene,
debugLevel); // int debug_level) debugLevel); // int debug_level)
double[][] ds_fg_bg = {ds_fg[0], ds_bg[0].clone()}; double[][] ds_fg_bg = {ds_fg[0], ds_bg[0].clone()};
for (int i = 0; i < sky_tiles.length; i++) { for (int i = 0; i < dls_bg[0].length; i++) {
if (Math.abs(ds_fg_bg[1][i]-ds_fg_bg[0][i]) < tex_fg_bg) { if (Math.abs(ds_fg_bg[1][i]-ds_fg_bg[0][i]) < tex_fg_bg) {
ds_fg_bg[1][i] = Double.NaN; ds_fg_bg[1][i] = Double.NaN;
} }
} }
if (debugLevel > -2) {
System.out.println("Limiting non-infinity objects' disparity to "+min_obj_disparity+
", infinity_disparity = "+infinity_disparity);
}
for (int nl = 0; nl < ds_fg_bg.length; nl++) {
for (int i = 0; i < dls_bg[nl].length; i++) {
if ((nl != sky_layer) || !sky_tiles[i]) {
if (ds_fg_bg[nl][i] < min_obj_disparity) {
ds_fg_bg[nl][i] = min_obj_disparity;
}
}
}
}
if (debugLevel > -2) { // was > 0
String [] dbg_titles = {"FG","BG","BS"};
double [][] dbg_img = {ds_fg_bg[0], ds_fg_bg[1],combo_dsn_final[OpticalFlow.COMBO_DSN_INDX_BLUE_SKY]};
ShowDoubleFloatArrays.showArrays(
dbg_img,
tilesX,
dbg_img[0].length/tilesX,
true,
ref_scene.getImageName()+"-disparity_layers",
dbg_titles);
}
// Create data for consolidated textures (multiple texture segments combined in same "passes" // Create data for consolidated textures (multiple texture segments combined in same "passes"
TileCluster [] tileClusters = clusterizeFgBg( // wrong result type, not decided TileCluster [] tileClusters = clusterizeFgBg( // wrong result type, not decided
tilesX, // final int tilesX, tilesX, // final int tilesX,
...@@ -1951,6 +1986,8 @@ public class TexturedModel { ...@@ -1951,6 +1986,8 @@ public class TexturedModel {
boolean [] scan_selected = tileClusters[nslice].getSubSelected(sub_i); // limited to cluster bounds boolean [] scan_selected = tileClusters[nslice].getSubSelected(sub_i); // limited to cluster bounds
int [] scan_border_int = tileClusters[nslice].getSubBorderInt(sub_i); // limited to cluster bounds int [] scan_border_int = tileClusters[nslice].getSubBorderInt(sub_i); // limited to cluster bounds
int max_border = tileClusters[nslice].getBorderIntMax(); int max_border = tileClusters[nslice].getBorderIntMax();
boolean is_sky = tileClusters[nslice].isSky();
double min_disparity = is_sky? infinity_disparity : min_obj_disparity;
// skipping averaging disparity for a whole cluster (needs strength and does not seem to be useful) // skipping averaging disparity for a whole cluster (needs strength and does not seem to be useful)
try { try {
...@@ -2008,7 +2045,7 @@ public class TexturedModel { ...@@ -2008,7 +2045,7 @@ public class TexturedModel {
((dbg_mesh_imgs != null) ? dbg_mesh_imgs[nslice]:null), // double [] tri_img, // ((dbg_mesh_imgs != null) ? dbg_mesh_imgs[nslice]:null), // double [] tri_img, //
dbg_scaled_width, // int tri_img_width, dbg_scaled_width, // int tri_img_width,
// FIXME: make a separate parameter: // FIXME: make a separate parameter:
infinity_disparity, // 0.25 * clt_parameters.bgnd_range, // 0.3 infinity_disparity, //min_disparity, // infinity_disparity, // 0.25 * clt_parameters.bgnd_range, // 0.3
clt_parameters.grow_disp_max, // other_range, // 2.0 'other_range - difference from the specified (*_CM) clt_parameters.grow_disp_max, // other_range, // 2.0 'other_range - difference from the specified (*_CM)
clt_parameters.maxDispTriangle, clt_parameters.maxDispTriangle,
clt_parameters.maxZtoXY, // double maxZtoXY, // 10.0. <=0 - do not use clt_parameters.maxZtoXY, // double maxZtoXY, // 10.0. <=0 - do not use
...@@ -3663,7 +3700,8 @@ public class TexturedModel { ...@@ -3663,7 +3700,8 @@ public class TexturedModel {
sky_pixels, // final double [] data, sky_pixels, // final double [] data,
null, // final boolean [] prohibit, null, // final boolean [] prohibit,
sky_pixels_bounds.width, // int width, sky_pixels_bounds.width, // int width,
3 * Math.min(sky_pixels_bounds.width,sky_pixels_bounds.height) / 2, // 16, // final int grow, // 3 * Math.min(sky_pixels_bounds.width,sky_pixels_bounds.height) / 2, // 16, // final int grow,
2 * Math.max(sky_pixels_bounds.width,sky_pixels_bounds.height), // 16, // final int grow,
0.7, // double diagonal_weight, // relative to ortho 0.7, // double diagonal_weight, // relative to ortho
100, // int num_passes, 100, // int num_passes,
0.01, // final double max_rchange, // = 0.01 0.01, // final double max_rchange, // = 0.01
......
...@@ -8687,6 +8687,9 @@ ImageDtt.startAndJoin(threads); ...@@ -8687,6 +8687,9 @@ ImageDtt.startAndJoin(threads);
Arrays.fill(all_nan, Double.NaN); Arrays.fill(all_nan, Double.NaN);
return all_nan; return all_nan;
} }
if (davg2 == 0) {
davg2 = 1; // for sky with disparity ==0
}
final double fdavg = davg; final double fdavg = davg;
final double max_change = Math.abs(davg2 * max_rchange); final double max_change = Math.abs(davg2 * max_rchange);
......
...@@ -209,10 +209,15 @@ public class LwirWorld { ...@@ -209,10 +209,15 @@ public class LwirWorld {
double cold_scale = clt_parameters.imp.cold_scale; double cold_scale = clt_parameters.imp.cold_scale;
double sky_seed = clt_parameters.imp.sky_seed; double sky_seed = clt_parameters.imp.sky_seed;
double lma_seed = clt_parameters.imp.lma_seed; double lma_seed = clt_parameters.imp.lma_seed;
double seed_temp = clt_parameters.imp.seed_temp;
int sky_shrink = clt_parameters.imp.sky_shrink; int sky_shrink = clt_parameters.imp.sky_shrink;
int sky_bottleneck = clt_parameters.imp.sky_bottleneck; int sky_bottleneck = clt_parameters.imp.sky_bottleneck;
int sky_reexpand_extra = clt_parameters.imp.sky_reexpand_extra;
int seed_rows = clt_parameters.imp.seed_rows; int seed_rows = clt_parameters.imp.seed_rows;
double max_disparity = clt_parameters.imp.max_disparity;
double max_disparity_strength=clt_parameters.imp.max_disparity_strength;
double sky_lim = clt_parameters.imp.sky_lim; double sky_lim = clt_parameters.imp.sky_lim;
double lim_temp = clt_parameters.imp.lim_temp;
int sky_expand_extra = clt_parameters.imp.sky_expand_extra; int sky_expand_extra = clt_parameters.imp.sky_expand_extra;
double min_strength = clt_parameters.imp.min_strength; double min_strength = clt_parameters.imp.min_strength;
int lowest_sky_row = clt_parameters.imp.lowest_sky_row; int lowest_sky_row = clt_parameters.imp.lowest_sky_row;
...@@ -366,13 +371,19 @@ public class LwirWorld { ...@@ -366,13 +371,19 @@ public class LwirWorld {
System.out.println("(Re)using photometric calibration from this sequence reference "+quadCLTs[ref_index].getPhotometricScene()); System.out.println("(Re)using photometric calibration from this sequence reference "+quadCLTs[ref_index].getPhotometricScene());
quadCLTs[ref_index].setQuadClt(); // just in case ? quadCLTs[ref_index].setQuadClt(); // just in case ?
} }
QuadCLT dbg_scene = clt_parameters.imp.save_debug_images? quadCLTs[ref_index]: null; // use to save debug images if not null
quadCLTs[ref_index].setBlueSky ( quadCLTs[ref_index].setBlueSky (
max_disparity,
max_disparity_strength,
sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this
lma_seed, lma_seed,
seed_temp, //double seed_temp, // 0.5; // seed colder that this point between min and max temp
sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
lim_temp, // double lim_temp, // 0.5; // sky colder that this point between min and max temp
sky_shrink, // int sky_shrink, // = 4; sky_shrink, // int sky_shrink, // = 4;
sky_expand_extra, // int sky_expand_extra, // = 100; // 1? sky_expand_extra, // int sky_expand_extra, // = 100; // 1?
sky_bottleneck, //int sky_bottleneck, // sky_bottleneck, //int sky_bottleneck, //
sky_reexpand_extra, //int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
cold_frac, // = 0.005; // this and lower will scale fom by cold_scale cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
hot_frac, // = 0.9; // this and above will scale fom by 1.0 hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -390,6 +401,7 @@ public class LwirWorld { ...@@ -390,6 +401,7 @@ public class LwirWorld {
dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread, dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread,
dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], // double [] spread, dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], // double [] spread,
dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val, dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val,
dbg_scene, // QuadCLT dbg_scene, // use to save debug images if not null
batch_mode? -1: 1); /// debugLevel); // int debugLevel) batch_mode? -1: 1); /// debugLevel); // int debugLevel)
if (ran_photo_each) { if (ran_photo_each) {
double [] blue_sky = quadCLTs[ref_index].getDoubleBlueSky(); double [] blue_sky = quadCLTs[ref_index].getDoubleBlueSky();
...@@ -464,13 +476,19 @@ public class LwirWorld { ...@@ -464,13 +476,19 @@ public class LwirWorld {
if (dsi[TwoQuadCLT.DSI_SPREAD_AUX] == null) { if (dsi[TwoQuadCLT.DSI_SPREAD_AUX] == null) {
System.out.println("DSI_MAIN file has old format and does not have spread data, will recalculate."); System.out.println("DSI_MAIN file has old format and does not have spread data, will recalculate.");
} else { } else {
QuadCLT dbg_scene = clt_parameters.imp.save_debug_images? quadCLTs[ref_index]: null; // use to save debug images if not null
quadCLTs[ref_index].setBlueSky ( quadCLTs[ref_index].setBlueSky (
max_disparity,
max_disparity_strength,
sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this sky_seed, // double sky_seed, // = 7.0; // start with product of strength by diff_second below this
lma_seed, // 2.0; // seed - disparity_lma limit lma_seed, // 2.0; // seed - disparity_lma limit
seed_temp, //double seed_temp, // 0.5; // seed colder that this point between min and max temp
sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this sky_lim, // double sky_lim, // = 15.0; // then expand to product of strength by diff_second below this
lim_temp, // double lim_temp, // 0.5; // sky colder that this point between min and max temp
sky_shrink, // int sky_shrink, // = 4; sky_shrink, // int sky_shrink, // = 4;
sky_expand_extra, // int sky_expand_extra, // = 100; // 1? sky_expand_extra, // int sky_expand_extra, // = 100; // 1?
sky_bottleneck, //int sky_bottleneck, // sky_bottleneck, //int sky_bottleneck, //
sky_reexpand_extra, //int sky_reexpand_extra, // 9; re-expand after bottleneck in addition to how it was shrank
cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence cold_scale, // = 0.2; // <=1.0. 1.0 - disables temperature dependence
cold_frac, // = 0.005; // this and lower will scale fom by cold_scale cold_frac, // = 0.005; // this and lower will scale fom by cold_scale
hot_frac, // = 0.9; // this and above will scale fom by 1.0 hot_frac, // = 0.9; // this and above will scale fom by 1.0
...@@ -488,12 +506,12 @@ public class LwirWorld { ...@@ -488,12 +506,12 @@ public class LwirWorld {
dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread, dsi[TwoQuadCLT.DSI_SPREAD_AUX], // double [] spread,
dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], //double [] disp_lma, dsi[TwoQuadCLT.DSI_DISPARITY_AUX_LMA], //double [] disp_lma,
dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val, dsi[TwoQuadCLT.DSI_AVGVAL_AUX],// double [] avg_val,
dbg_scene, // QuadCLT dbg_scene, // use to save debug images if not null
debugLevel); // int debugLevel) debugLevel); // int debugLevel)
} }
} }
} // while (blue_sky == null) } // while (blue_sky == null)
/* */ /* */
return null; return null;
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment