Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
I
imagej-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
3
Issues
3
List
Board
Labels
Milestones
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
Elphel
imagej-elphel
Commits
96562ce2
Commit
96562ce2
authored
Oct 22, 2023
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Next snapshot, debugging
parent
019655f7
Changes
5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
610 additions
and
54 deletions
+610
-54
Interscene.java
...main/java/com/elphel/imagej/tileprocessor/Interscene.java
+30
-22
IntersceneMatchParameters.java
...lphel/imagej/tileprocessor/IntersceneMatchParameters.java
+73
-1
OpticalFlow.java
...ain/java/com/elphel/imagej/tileprocessor/OpticalFlow.java
+37
-11
TDCorrTile.java
...main/java/com/elphel/imagej/tileprocessor/TDCorrTile.java
+26
-4
StructureFromMotion.java
.../elphel/imagej/tileprocessor/sfm/StructureFromMotion.java
+444
-16
No files found.
src/main/java/com/elphel/imagej/tileprocessor/Interscene.java
View file @
96562ce2
...
...
@@ -258,6 +258,9 @@ public class Interscene {
quadCLTs
[
cent_index
].
saveInterProperties
(
// save properties for interscene processing (extrinsics, ers, ...) // null pointer
null
,
// String path, // full name with extension or w/o path to use x3d directory
debugLevel
+
1
);
if
(
debugLevel
>
-
3
)
{
System
.
out
.
println
(
"setInitialOrientationsCenterIms(): return earliest_scene2="
+
earliest_scene2
);
}
return
earliest_scene2
;
}
...
...
@@ -448,6 +451,7 @@ public class Interscene {
clt_parameters
,
// CLTParameters clt_parameters,
use_lma_dsi
,
// clt_parameters.imp.use_lma_dsi,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
true
,
// boolean disable_ers,
min_max
,
// double [] min_max, // null or pair of minimal and maximal offsets
fail_reason
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
quadCLTs
[
ref_index
],
// QuadCLT reference_QuadCLT,
...
...
@@ -820,6 +824,7 @@ public class Interscene {
clt_parameters
,
// CLTParameters clt_parameters,
use_lma_dsi
,
// clt_parameters.imp.use_lma_dsi,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
true
,
// boolean disable_ers,
min_max
,
// double [] min_max, // null or pair of minimal and maximal offsets
fail_reason
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
quadCLTs
[
ref_index
],
// QuadCLT reference_QuadCLT,
...
...
@@ -966,6 +971,7 @@ public class Interscene {
public
static
int
reAdjustPairsLMAInterscene
(
// after combo dgi is available and preliminary poses are known
CLTParameters
clt_parameters
,
double
mb_max_gain
,
boolean
disable_ers
,
boolean
[]
reliable_ref
,
// null or bitmask of reliable reference tiles
QuadCLT
[]
quadCLTs
,
int
ref_index
,
...
...
@@ -1363,6 +1369,7 @@ public class Interscene {
clt_parameters
,
// CLTParameters clt_parameters,
false
,
// boolean initial_adjust,
fpn_disable
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
disable_ers
,
// boolean disable_ers,
min_max
,
// double [] min_max, // null or pair of minimal and maximal offsets
fail_reason
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
quadCLTs
[
ref_index
],
// QuadCLT reference_QuadCLT,
...
...
@@ -1484,6 +1491,7 @@ public class Interscene {
CLTParameters
clt_parameters
,
boolean
use_lma_dsi
,
boolean
fpn_disable
,
// disable fpn filter if images are known to be too close
boolean
disable_ers
,
double
[]
min_max
,
// null or pair of minimal and maximal offsets
int
[]
fail_reason
,
// null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
QuadCLT
reference_QuadClt
,
...
...
@@ -1533,6 +1541,7 @@ public class Interscene {
clt_parameters
,
// CLTParameters clt_parameters,
true
,
// boolean initial_adjust,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
disable_ers
,
// boolean disable_ers,
min_max
,
// double [] min_max, // null or pair of minimal and maximal offsets
fail_reason
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
reference_QuadClt
,
// QuadCLT reference_QuadClt,
...
...
@@ -1561,6 +1570,7 @@ public class Interscene {
CLTParameters
clt_parameters
,
boolean
initial_adjust
,
boolean
fpn_disable
,
// disable fpn filter if images are known to be too close
boolean
disable_ers
,
double
[]
min_max
,
// null or pair of minimal and maximal offsets
int
[]
fail_reason
,
// null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
QuadCLT
reference_QuadClt
,
...
...
@@ -1641,9 +1651,8 @@ public class Interscene {
for
(
int
i:
ErsCorrection
.
DP_ERS_INDICES
)
{
ers_lma
|=
param_select
[
i
];
}
boolean
disable_ers
=
false
;
boolean
[]
param_select_mod
=
param_select
;
if
(
ers_lma
&&
filter_by_ers
)
{
if
(
ers_lma
&&
filter_by_ers
&&
!
disable_ers
)
{
double
[][]
quad_strengths
=
getQuadStrengths
(
coord_motion
,
// double [][][] coord_motion,
gap_frac
,
//double gap_frac, // 0.25
...
...
@@ -1651,31 +1660,30 @@ public class Interscene {
for
(
int
i
=
0
;
i
<
quad_strengths
[
0
].
length
;
i
++)
{
if
((
quad_strengths
[
0
][
i
]
<
min_quad_tiles
)
||
(
quad_strengths
[
1
][
i
]
<
min_quad_weight
))
{
disable_ers
=
true
;
if
(
clt_parameters
.
imp
.
debug_level
>
-
2
)
{
System
.
out
.
print
(
"adjustPairsLMAInterscene(): insufficient data for ERS, skipping. "
);
System
.
out
.
println
(
"quad_defined = ["
+((
int
)
quad_strengths
[
0
][
0
])+
","
+((
int
)
quad_strengths
[
0
][
1
])+
","
+((
int
)
quad_strengths
[
0
][
2
])+
","
+((
int
)
quad_strengths
[
0
][
3
])+
"] (needed = "
+
min_quad_tiles
+
"), rel_strengths = ["
+
quad_strengths
[
1
][
0
]+
","
+
quad_strengths
[
1
][
1
]+
","
+
quad_strengths
[
1
][
2
]+
","
+
quad_strengths
[
1
][
3
]+
"] (needed "
+
min_quad_weight
+
")"
);
}
break
;
}
}
if
(
disable_ers
)
{
param_select_mod
=
param_select
.
clone
();
for
(
int
i:
ErsCorrection
.
DP_ERS_INDICES
)
{
param_select_mod
[
i
]
=
false
;
}
// now just copy ers from the reference
ErsCorrection
ers_ref
=
reference_QuadClt
.
getErsCorrection
();
ErsCorrection
ers_scene
=
scene_QuadClt
.
getErsCorrection
();
ers_scene
.
ers_watr_center_dt
=
ers_ref
.
ers_watr_center_dt
.
clone
();
ers_scene
.
ers_wxyz_center_dt
=
ers_ref
.
ers_wxyz_center_dt
.
clone
();
if
(
clt_parameters
.
imp
.
debug_level
>
-
2
)
{
System
.
out
.
print
(
"adjustPairsLMAInterscene(): insufficient data for ERS, skipping. "
);
System
.
out
.
println
(
"quad_defined = ["
+((
int
)
quad_strengths
[
0
][
0
])+
","
+((
int
)
quad_strengths
[
0
][
1
])+
","
+((
int
)
quad_strengths
[
0
][
2
])+
","
+((
int
)
quad_strengths
[
0
][
3
])+
"] (needed = "
+
min_quad_tiles
+
"), rel_strengths = ["
+
quad_strengths
[
1
][
0
]+
","
+
quad_strengths
[
1
][
1
]+
","
+
quad_strengths
[
1
][
2
]+
","
+
quad_strengths
[
1
][
3
]+
"] (needed "
+
min_quad_weight
+
")"
);
}
}
if
(
disable_ers
)
{
param_select_mod
=
param_select
.
clone
();
for
(
int
i:
ErsCorrection
.
DP_ERS_INDICES
)
{
param_select_mod
[
i
]
=
false
;
}
// now just copy ers from the reference
ErsCorrection
ers_ref
=
reference_QuadClt
.
getErsCorrection
();
ErsCorrection
ers_scene
=
scene_QuadClt
.
getErsCorrection
();
ers_scene
.
ers_watr_center_dt
=
ers_ref
.
ers_watr_center_dt
.
clone
();
ers_scene
.
ers_wxyz_center_dt
=
ers_ref
.
ers_wxyz_center_dt
.
clone
();
}
intersceneLma
.
prepareLMA
(
camera_xyz0
,
// final double [] scene_xyz0, // camera center in world coordinates (or null to use instance)
camera_atr0
,
// final double [] scene_atr0, // camera orientation relative to world frame (or null to use instance)
...
...
src/main/java/com/elphel/imagej/tileprocessor/IntersceneMatchParameters.java
View file @
96562ce2
...
...
@@ -44,6 +44,16 @@ public class IntersceneMatchParameters {
public
boolean
sfm_use
=
true
;
// use SfM to improve depth map
public
double
sfm_min_base
=
2.0
;
// use SfM if baseline exceeds this
public
int
sfm_num_pairs
=
16
;
// desired number of SfM pairs to average
public
double
sfp_tolerance
=
0.05
;
// average SfM pairs if their baselines differ less
public
int
sfm_readjust
=
5
;
// number of SfM readjustment cycles
public
double
sfm_prev_frac
=
0.6
;
// update if new sfm gain > this fraction of the old one
public
int
sfm_shrink
=
2
;
// shrink sfm gain area before applying sfm_fade_sigma
public
double
sfm_fade_sigma
=
3.0
;
// fade SfM gains at the edges
public
double
sfm_min_str
=
0.4
;
// update if correction strength exceeds
public
boolean
sfm_use_neibs
=
true
;
// use neighbors if individual corr is too weak
public
double
sfm_neib_too_str
=
0.4
;
// do not count neighbors stronger than that
public
double
sfm_neib_str
=
0.5
;
// update if no-individual and neibs correction strength exceeds
public
double
[]
getImsMountATR
()
{
...
...
@@ -443,6 +453,28 @@ public class IntersceneMatchParameters {
gd
.
addNumericField
(
"Minimal SfM baseline"
,
this
.
sfm_min_base
,
5
,
8
,
"m"
,
"Use SfM only if the baseline (lateral offset between scenes in a series) exceeds this value."
);
gd
.
addNumericField
(
"Number of SfM pairs to average"
,
this
.
sfm_num_pairs
,
0
,
3
,
""
,
"Desired number of SfM pairs to average, will be reduced if not enough or tolerance (below) is violated."
);
gd
.
addNumericField
(
"SfP inter-pair baseline tolerance"
,
this
.
sfp_tolerance
,
5
,
8
,
""
,
"Average SfM pairs if their baselines differ less."
);
gd
.
addNumericField
(
"Readjust SfM cycles"
,
this
.
sfm_readjust
,
0
,
3
,
""
,
"Number of SfM readjustment cycles."
);
gd
.
addNumericField
(
"Minimal SfM gain from previous"
,
this
.
sfm_prev_frac
,
5
,
8
,
""
,
"Update if new sfm gain > this fraction of the old one."
);
gd
.
addNumericField
(
"Shrink SfM area"
,
this
.
sfm_shrink
,
0
,
3
,
""
,
"Shrink sfm gain area before applying sfm_fade_sigmas."
);
gd
.
addNumericField
(
"Fade SfM area sigma"
,
this
.
sfm_fade_sigma
,
5
,
8
,
""
,
"Fade SfM gains at the edges."
);
gd
.
addNumericField
(
"Minimal correlation strength"
,
this
.
sfm_min_str
,
5
,
8
,
""
,
"Update if correction strength of individual tiles exceeds."
);
gd
.
addCheckbox
(
"Use neighbors"
,
this
.
sfm_use_neibs
,
"Use neighbors if individual corr is too weak."
);
gd
.
addNumericField
(
"Too strong neighbors"
,
this
.
sfm_neib_too_str
,
5
,
8
,
""
,
"Do not accumulate neighbors stronger than that."
);
gd
.
addNumericField
(
"Minimal neighbors strength"
,
this
.
sfm_neib_str
,
5
,
8
,
""
,
"Update if no-individual and neighbors correction strength exceeds this."
);
gd
.
addTab
(
"Scene Series"
,
"Processing series of scenes and multi-series sets"
);
gd
.
addMessage
(
"Build series options"
);
...
...
@@ -1114,6 +1146,16 @@ public class IntersceneMatchParameters {
this
.
ims_mount_xyz
=
IntersceneMatchParameters
.
StringToDoubles
(
gd
.
getNextString
(),
3
);
this
.
sfm_use
=
gd
.
getNextBoolean
();
this
.
sfm_min_base
=
gd
.
getNextNumber
();
this
.
sfm_num_pairs
=
(
int
)
gd
.
getNextNumber
();
this
.
sfp_tolerance
=
gd
.
getNextNumber
();
this
.
sfm_readjust
=
(
int
)
gd
.
getNextNumber
();
this
.
sfm_prev_frac
=
gd
.
getNextNumber
();
this
.
sfm_shrink
=
(
int
)
gd
.
getNextNumber
();
this
.
sfm_fade_sigma
=
gd
.
getNextNumber
();
this
.
sfm_min_str
=
gd
.
getNextNumber
();
this
.
sfm_use_neibs
=
gd
.
getNextBoolean
();
this
.
sfm_neib_too_str
=
gd
.
getNextNumber
();
this
.
sfm_neib_str
=
gd
.
getNextNumber
();
this
.
center_reference
=
gd
.
getNextBoolean
();
this
.
force_ref_dsi
=
gd
.
getNextBoolean
();
this
.
force_orientations
=
gd
.
getNextBoolean
();
...
...
@@ -1469,7 +1511,17 @@ public class IntersceneMatchParameters {
properties
.
setProperty
(
prefix
+
"ims_mount_xyz"
,
IntersceneMatchParameters
.
doublesToString
(
this
.
ims_mount_xyz
));
properties
.
setProperty
(
prefix
+
"sfm_use"
,
this
.
sfm_use
+
""
);
// boolean
properties
.
setProperty
(
prefix
+
"sfm_min_base"
,
this
.
sfm_min_base
+
""
);
// double
properties
.
setProperty
(
prefix
+
"center_reference"
,
this
.
center_reference
+
""
);
// boolean
properties
.
setProperty
(
prefix
+
"sfm_num_pairs"
,
this
.
sfm_num_pairs
+
""
);
// int
properties
.
setProperty
(
prefix
+
"sfp_tolerance"
,
this
.
sfp_tolerance
+
""
);
// double
properties
.
setProperty
(
prefix
+
"sfm_readjust"
,
this
.
sfm_readjust
+
""
);
// int
properties
.
setProperty
(
prefix
+
"sfm_prev_frac"
,
this
.
sfm_prev_frac
+
""
);
// double
properties
.
setProperty
(
prefix
+
"sfm_shrink"
,
this
.
sfm_shrink
+
""
);
// int
properties
.
setProperty
(
prefix
+
"sfm_fade_sigma"
,
this
.
sfm_fade_sigma
+
""
);
// double
properties
.
setProperty
(
prefix
+
"sfm_min_str"
,
this
.
sfm_min_str
+
""
);
// double
properties
.
setProperty
(
prefix
+
"sfm_use_neibs"
,
this
.
sfm_use_neibs
+
""
);
// boolean
properties
.
setProperty
(
prefix
+
"sfm_neib_too_str"
,
this
.
sfm_neib_too_str
+
""
);
// double
properties
.
setProperty
(
prefix
+
"sfm_neib_str"
,
this
.
sfm_neib_str
+
""
);
// double
properties
.
setProperty
(
prefix
+
"center_reference"
,
this
.
center_reference
+
""
);
// boolean
properties
.
setProperty
(
prefix
+
"force_ref_dsi"
,
this
.
force_ref_dsi
+
""
);
// boolean
properties
.
setProperty
(
prefix
+
"force_orientations"
,
this
.
force_orientations
+
""
);
// boolean
properties
.
setProperty
(
prefix
+
"run_ly"
,
this
.
run_ly
+
""
);
// boolean
...
...
@@ -1784,6 +1836,16 @@ public class IntersceneMatchParameters {
if
(
properties
.
getProperty
(
prefix
+
"ims_mount_xyz"
)!=
null
)
this
.
ims_mount_xyz
=
IntersceneMatchParameters
.
StringToDoubles
(
properties
.
getProperty
(
prefix
+
"ims_mount_xyz"
),
3
);
if
(
properties
.
getProperty
(
prefix
+
"sfm_use"
)!=
null
)
this
.
sfm_use
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"sfm_use"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_min_base"
)!=
null
)
this
.
sfm_min_base
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfm_min_base"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_num_pairs"
)!=
null
)
this
.
sfm_num_pairs
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"sfm_num_pairs"
));
if
(
properties
.
getProperty
(
prefix
+
"sfp_tolerance"
)!=
null
)
this
.
sfp_tolerance
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfp_tolerance"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_readjust"
)!=
null
)
this
.
sfm_readjust
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"sfm_readjust"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_prev_frac"
)!=
null
)
this
.
sfm_prev_frac
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfm_prev_frac"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_shrink"
)!=
null
)
this
.
sfm_shrink
=
Integer
.
parseInt
(
properties
.
getProperty
(
prefix
+
"sfm_shrink"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_fade_sigma"
)!=
null
)
this
.
sfm_fade_sigma
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfm_fade_sigma"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_min_str"
)!=
null
)
this
.
sfm_min_str
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfm_min_str"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_use_neibs"
)!=
null
)
this
.
sfm_use_neibs
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"sfm_use_neibs"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_neib_too_str"
)!=
null
)
this
.
sfm_neib_too_str
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfm_neib_too_str"
));
if
(
properties
.
getProperty
(
prefix
+
"sfm_neib_str"
)!=
null
)
this
.
sfm_neib_str
=
Double
.
parseDouble
(
properties
.
getProperty
(
prefix
+
"sfm_neib_str"
));
if
(
properties
.
getProperty
(
prefix
+
"center_reference"
)!=
null
)
this
.
center_reference
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"center_reference"
));
if
(
properties
.
getProperty
(
prefix
+
"force_ref_dsi"
)!=
null
)
this
.
force_ref_dsi
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"force_ref_dsi"
));
if
(
properties
.
getProperty
(
prefix
+
"force_orientations"
)!=
null
)
this
.
force_orientations
=
Boolean
.
parseBoolean
(
properties
.
getProperty
(
prefix
+
"force_orientations"
));
...
...
@@ -2126,6 +2188,16 @@ public class IntersceneMatchParameters {
imp
.
ims_mount_xyz
=
this
.
ims_mount_xyz
.
clone
();
imp
.
sfm_use
=
this
.
sfm_use
;
imp
.
sfm_min_base
=
this
.
sfm_min_base
;
imp
.
sfm_num_pairs
=
this
.
sfm_num_pairs
;
imp
.
sfp_tolerance
=
this
.
sfp_tolerance
;
imp
.
sfm_readjust
=
this
.
sfm_readjust
;
imp
.
sfm_prev_frac
=
this
.
sfm_prev_frac
;
imp
.
sfm_shrink
=
this
.
sfm_shrink
;
imp
.
sfm_fade_sigma
=
this
.
sfm_fade_sigma
;
imp
.
sfm_min_str
=
this
.
sfm_min_str
;
imp
.
sfm_use_neibs
=
this
.
sfm_use_neibs
;
imp
.
sfm_neib_too_str
=
this
.
sfm_neib_too_str
;
imp
.
sfm_neib_str
=
this
.
sfm_neib_str
;
imp
.
center_reference
=
this
.
center_reference
;
imp
.
force_ref_dsi
=
this
.
force_ref_dsi
;
imp
.
force_orientations
=
this
.
force_orientations
;
...
...
src/main/java/com/elphel/imagej/tileprocessor/OpticalFlow.java
View file @
96562ce2
...
...
@@ -3572,6 +3572,7 @@ public class OpticalFlow {
clt_parameters
,
// CLTParameters clt_parameters,
clt_parameters
.
imp
.
use_lma_dsi
,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
false
,
// boolean disable_ers,
null
,
// double [] min_max, // null or pair of minimal and maximal offsets
null
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
reference_QuadClt
,
// QuadCLT reference_QuadCLT,
...
...
@@ -4885,7 +4886,7 @@ public class OpticalFlow {
boolean
OK
=
false
;
int
es1
=
-
1
;
if
(
center_reference
)
{
ref_index
=
Interscene
.
setInitialOrientationsCenterIms
(
es1
=
Interscene
.
setInitialOrientationsCenterIms
(
clt_parameters
,
// final CLTParameters clt_parameters,
min_num_scenes
,
// int min_num_scenes,
colorProcParameters
,
// final ColorProcParameters colorProcParameters,
...
...
@@ -4896,14 +4897,20 @@ public class OpticalFlow {
last_index
,
// final int ref_index,
set_channels
,
// final QuadCLT.SetChannels [] set_channels,
batch_mode
,
// final boolean batch_mode,
earliest_scene
,
// int
earliest_scene
,
earliest_scene
,
// int ,
start_ref_pointers
,
// int [] start_ref_pointers, // [0] - earliest valid scene, [1] ref_index
threadsMax
,
// final int threadsMax,
updateStatus
,
// final boolean updateStatus,
debugLevel
);
OK
=
ref_index
>=
0
;
OK
=
es1
>=
0
;
if
(
OK
)
{
ref_index
=
quadCLTs
[
last_index
].
getReferenceIndex
(
quadCLTs
);
int
[]
first_last_index
=
quadCLTs
[
ref_index
].
getFirstLastIndex
(
quadCLTs
);
earliest_scene
=
first_last_index
[
0
];
last_index
=
first_last_index
[
1
];
}
}
else
if
(
ims_use
)
{
e
s1
=
Interscene
.
setInitialOrientationsIms
(
e
arliest_scene
=
Interscene
.
setInitialOrientationsIms
(
clt_parameters
,
// final CLTParameters clt_parameters,
min_num_scenes
,
// int min_num_scenes,
colorProcParameters
,
// final ColorProcParameters colorProcParameters,
...
...
@@ -4916,9 +4923,9 @@ public class OpticalFlow {
threadsMax
,
// final int threadsMax,
updateStatus
,
// final boolean updateStatus,
debugLevel
);
// final int debugLevel)
OK
=
e
s1
>=
0
;
OK
=
e
arliest_scene
>=
0
;
}
else
{
e
s1
=
Interscene
.
setInitialOrientations
(
e
arliest_scene
=
Interscene
.
setInitialOrientations
(
clt_parameters
,
// final CLTParameters clt_parameters,
min_num_scenes
,
// int min_num_scenes,
colorProcParameters
,
// final ColorProcParameters colorProcParameters,
...
...
@@ -4931,7 +4938,7 @@ public class OpticalFlow {
threadsMax
,
// final int threadsMax,
updateStatus
,
// final boolean updateStatus,
debugLevel
);
// final int debugLevel)
OK
=
e
s1
>=
0
;
OK
=
e
arliest_scene
>=
0
;
}
if
(!
OK
)
{
return
null
;
...
...
@@ -5033,7 +5040,7 @@ public class OpticalFlow {
debugLevel); // final int debugLevel)
*/
// int num_avg_pairs = 16; // number of scene pairs to average
int
num_avg_pairs
=
1
;
// number of scene pairs to average
int
num_avg_pairs
=
clt_parameters
.
imp
.
sfm_num_pairs
;
// number of scene pairs to average
QuadCLT
[][][]
scenes_seq_pairs
=
new
QuadCLT
[
3
][
num_avg_pairs
][
2
];
for
(
int
i
=
0
;
i
<
num_avg_pairs
;
i
++)
{
scenes_seq_pairs
[
0
][
i
][
0
]
=
quadCLTs
[
ref_index
+
num_avg_pairs
-
1
-
i
];
...
...
@@ -5045,7 +5052,19 @@ public class OpticalFlow {
scenes_seq_pairs
[
2
][
i
][
0
]
=
quadCLTs
[
last_index
-
i
];
scenes_seq_pairs
[
2
][
i
][
1
]
=
quadCLTs
[
earliest_scene
+
num_avg_pairs
-
1
-
i
];
}
double
[][]
sfm_dsn
=
StructureFromMotion
.
sfmPairsSet
(
clt_parameters
,
// final CLTParameters clt_parameters,
quadCLTs
[
ref_index
],
// final QuadCLT ref_scene,
scenes_seq_pairs
,
// scenes_pairs, // final QuadCLT [][] scenes_pairs,
mb_max_gain
,
// double mb_max_gain,
batch_mode
,
// final boolean batch_mode,
debugLevel
);
// final int debugLevel)
if
(
sfm_dsn
!=
null
)
{
combo_dsn_final
=
sfm_dsn
;
done_sfm
=
true
;
}
/*
for (int num_seq = 0; num_seq < scenes_seq_pairs.length; num_seq++) {
double [][] sfm_dsn = StructureFromMotion.sfmPair(
clt_parameters, // final CLTParameters clt_parameters,
...
...
@@ -5059,6 +5078,7 @@ public class OpticalFlow {
done_sfm = true;
}
}
*/
}
if
(!
done_sfm
)
{
// first pass or sfm failed
// should skip scenes w/o orientation 06/29/2022
...
...
@@ -5119,9 +5139,11 @@ public class OpticalFlow {
if
(
quadCLTs
[
ref_index
].
getNumOrient
()
<
(
min_num_orient
-
1
))
{
mb_max_gain
=
clt_parameters
.
imp
.
mb_max_gain_inter
;
}
boolean
disable_ers
=
(
quadCLTs
[
ref_index
].
getNumOrient
()
<
2
);
// first orient - no ERS!
earliest_scene
=
Interscene
.
reAdjustPairsLMAInterscene
(
// after combo dsi is available and preliminary poses are known
clt_parameters
,
// CLTParameters clt_parameters,
mb_max_gain
,
// double mb_max_gain,
disable_ers
,
// boolean disable_ers,
reliable_ref
,
// boolean [] reliable_ref, // null or bitmask of reliable reference tiles
quadCLTs
,
// QuadCLT [] quadCLTs,
ref_index
,
// int ref_index,
...
...
@@ -6698,6 +6720,7 @@ public class OpticalFlow {
clt_parameters
,
// CLTParameters clt_parameters,
clt_parameters
.
imp
.
use_lma_dsi
,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
false
,
// boolean disable_ers,
null
,
// double [] min_max, // null or pair of minimal and maximal offsets
null
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
quadCLTs
[
other_ref
[
1
]],
// QuadCLT reference_QuadCLT,
...
...
@@ -7267,6 +7290,7 @@ public class OpticalFlow {
clt_parameters
,
// CLTParameters clt_parameters,
clt_parameters
.
imp
.
use_lma_dsi
,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
false
,
// boolean disable_ers,
null
,
// double [] min_max, // null or pair of minimal and maximal offsets
null
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
reference_QuadClt
,
// QuadCLT reference_QuadCLT,
...
...
@@ -7381,6 +7405,7 @@ public class OpticalFlow {
clt_parameters
,
// CLTParameters clt_parameters,
clt_parameters
.
imp
.
use_lma_dsi
,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
false
,
// boolean disable_ers,
null
,
// double [] min_max, // null or pair of minimal and maximal offsets
null
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
reference_QuadClt
,
// QuadCLT reference_QuadCLT,
...
...
@@ -7527,6 +7552,7 @@ public class OpticalFlow {
clt_parameters
,
// CLTParameters clt_parameters,
clt_parameters
.
imp
.
use_lma_dsi
,
false
,
// boolean fpn_disable, // disable fpn filter if images are known to be too close
false
,
// boolean disable_ers,
null
,
// double [] min_max, // null or pair of minimal and maximal offsets
null
,
// int [] fail_reason, // null or int[1]: 0 - OK, 1 - LMA, 2 - min, 3 - max
reference_QuadClt
,
// QuadCLT reference_QuadCLT,
...
...
@@ -11927,7 +11953,7 @@ public class OpticalFlow {
final
int
tilesY
=
scene
.
getTileProcessor
().
getTilesY
();
final
int
transform_size
=
scene
.
getTileProcessor
().
getTileSize
();
final
int
tiles
=
tilesX
*
tilesY
;
boolean
debug_images
=
(
debug_level
>
0
)
&&
clt_parameters
.
ofp
.
enable_debug_images
;
String
[]
dbg_titles
=
{
"str"
,
"lma"
,
"clean-lma"
,
"disp"
,
"-sky"
,
"-lma"
,
"by-lma"
,
"-nonlma"
,
"few_weak"
,
"old-disp"
,
"old-sngl"
,
"weak"
,
"filled"
};
double
[][]
dbg_img
=
new
double
[
dbg_titles
.
length
][];
double
[]
clean_lma
=
dls
[
1
].
clone
();
...
...
@@ -12121,7 +12147,7 @@ public class OpticalFlow {
ImageDtt
.
startAndJoin
(
threads
);
if
(
(
debug_level
>
0
)
&&
(
clt_parameters
.
ofp
.
enable_debug_images
)
)
{
if
(
debug_images
)
{
dbg_titles
=
new
String
[]{
"disp"
,
"disp_outliers"
,
"disp_blur"
,
"disp_filled"
,
"str"
,
"str_filled"
};
dbg_img
=
new
double
[][]{
dls
[
0
],
disp_outliers
,
ds
[
0
],
ds_filled
[
0
],
ds
[
1
],
ds_filled
[
1
]};
ShowDoubleFloatArrays
.
showArrays
(
...
...
src/main/java/com/elphel/imagej/tileprocessor/TDCorrTile.java
View file @
96562ce2
...
...
@@ -254,7 +254,11 @@ public class TDCorrTile {
* @param tilesX number of tiles in a scan row.
* @param neib_weights_od 2-element array of the relative (to the center tile) weights
* of neighbors in four orthogonal [0] and four diagonal [1]
* directions.
* directions.
* @param corr_pd pixel-domain phase correlation corresponding to tiles to discard too
* strong neighbors. They likely belong the foreground while this (weak)
* is from the background. If null - do not filter by strength.
* @param neib_too_strong discard stronger neighbors from accumulating.
* @param process_all process tiles even if the center tile is null. False - process only
* the tiles around non-null ones.
* @return
...
...
@@ -263,6 +267,8 @@ public class TDCorrTile {
TDCorrTile
[]
tiles
,
final
int
tilesX
,
double
[]
neib_weights_od
,
// {orhto, diag}
double
[][]
corr_pd
,
double
neib_too_strong
,
final
boolean
process_all
)
{
final
int
tilesY
=
tiles
.
length
/
tilesX
;
...
...
@@ -286,6 +292,16 @@ public class TDCorrTile {
for
(
int
dir
=
0
;
dir
<
tn
.
dirs
;
dir
++)
{
int
iTile1
=
tn
.
getNeibIndex
(
iTile
,
dir
);
if
((
iTile1
>=
0
)
&&
(
tiles
[
iTile1
]
!=
null
))
{
if
((
corr_pd
!=
null
)
&&
(
corr_pd
[
iTile1
]
!=
null
))
{
boolean
is_weak
=
true
;
for
(
double
s:
corr_pd
[
iTile1
])
if
(
s
>=
neib_too_strong
)
{
is_weak
=
false
;
break
;
}
if
(!
is_weak
)
{
continue
;
// skip this strong neighbor from accumulating
}
}
if
(
rslt
[
iTile
]
==
null
)
{
rslt
[
iTile
]
=
tiles
[
iTile1
].
clone
();
rslt
[
iTile
].
scale
(
weights
[
dir
]);
...
...
@@ -413,10 +429,16 @@ public class TDCorrTile {
int
nTile
=
(
indices
[
nt
*
num_pairs
]
>>
GPUTileProcessor
.
CORR_NTILE_SHIFT
);
int
fdata_offset
=
(
nt
*
num_pairs
+
index_combo
)
*
corr_size_td
;
double
[]
tile_data
=
new
double
[
corr_size_td
];
for
(
int
i
=
0
;
i
<
tile_data
.
length
;
i
++)
{
tile_data
[
i
]
=
fdata
[
fdata_offset
+
i
];
copy_data:
{
for
(
int
i
=
0
;
i
<
tile_data
.
length
;
i
++)
{
double
d
=
fdata
[
fdata_offset
+
i
];
if
(
Double
.
isNaN
(
d
))
{
break
copy_data
;
// accumulated tile may be NaN
}
tile_data
[
i
]
=
d
;
}
tiles
[
nTile
]
=
new
TDCorrTile
(
index_combo
,
tile_data
);
// default weight = 16?
}
tiles
[
nTile
]
=
new
TDCorrTile
(
index_combo
,
tile_data
);
// default weight = 16?
}
}
};
...
...
src/main/java/com/elphel/imagej/tileprocessor/sfm/StructureFromMotion.java
View file @
96562ce2
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment