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
ef8c6ac2
Commit
ef8c6ac2
authored
Jul 13, 2024
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
preparing for adding pairwise matching after single-connected are
subject to LMA
parent
099bf912
Changes
10
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
760 additions
and
297 deletions
+760
-297
Eyesis_Correction.java
.../java/com/elphel/imagej/correction/Eyesis_Correction.java
+3
-1
ComboMatch.java
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
+118
-13
OrthoMap.java
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
+10
-2
OrthoMapsCollection.java
...va/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
+177
-21
PairwiseOrthoMatch.java
...ava/com/elphel/imagej/orthomosaic/PairwiseOrthoMatch.java
+2
-0
IntersceneMatchParameters.java
...lphel/imagej/tileprocessor/IntersceneMatchParameters.java
+116
-5
OpticalFlow.java
...ain/java/com/elphel/imagej/tileprocessor/OpticalFlow.java
+225
-242
QuadCLTCPU.java
...main/java/com/elphel/imagej/tileprocessor/QuadCLTCPU.java
+3
-0
TwoQuadCLT.java
...main/java/com/elphel/imagej/tileprocessor/TwoQuadCLT.java
+7
-1
StructureFromMotion.java
.../elphel/imagej/tileprocessor/sfm/StructureFromMotion.java
+99
-12
No files found.
src/main/java/com/elphel/imagej/correction/Eyesis_Correction.java
View file @
ef8c6ac2
...
@@ -850,6 +850,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
...
@@ -850,6 +850,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
addButton
(
"Warp pair"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Warp pair"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Read Tiff"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Read Tiff"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Test video"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Test video"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Ortho"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Ortho Pairs"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Ortho Pairs"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Manual pair"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Manual pair"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Extract Objects"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Extract Objects"
,
panelLWIRWorld
,
color_process
);
...
@@ -5718,7 +5719,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
...
@@ -5718,7 +5719,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
// ComboMatch.testReadTiff();
// ComboMatch.testReadTiff();
}
else
if
(
label
.
equals
(
"Ortho Pairs"
)
||
label
.
equals
(
"Extract Objects"
)
||
label
.
equals
(
"Manual pair"
))
{
}
else
if
(
label
.
equals
(
"Ortho
"
)
||
label
.
equals
(
"Ortho
Pairs"
)
||
label
.
equals
(
"Extract Objects"
)
||
label
.
equals
(
"Manual pair"
))
{
DEBUG_LEVEL
=
MASTER_DEBUG_LEVEL
;
DEBUG_LEVEL
=
MASTER_DEBUG_LEVEL
;
EYESIS_CORRECTIONS
.
setDebug
(
DEBUG_LEVEL
);
EYESIS_CORRECTIONS
.
setDebug
(
DEBUG_LEVEL
);
if
(
GPU_TILE_PROCESSOR
==
null
)
{
if
(
GPU_TILE_PROCESSOR
==
null
)
{
...
@@ -5739,6 +5740,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
...
@@ -5739,6 +5740,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
ComboMatch
.
openTestPairGps
(
ComboMatch
.
openTestPairGps
(
CLT_PARAMETERS
,
// CLTParameters clt_parameters,
CLT_PARAMETERS
,
// CLTParameters clt_parameters,
GPU_TILE_PROCESSOR
,
GPU_TILE_PROCESSOR
,
label
.
equals
(
"Ortho"
),
// boolean dflt_options,
label
.
equals
(
"Extract Objects"
),
// boolean extract_mines,
label
.
equals
(
"Extract Objects"
),
// boolean extract_mines,
label
.
equals
(
"Manual pair"
),
// boolean manual_pair,
label
.
equals
(
"Manual pair"
),
// boolean manual_pair,
DEBUG_LEVEL
);
DEBUG_LEVEL
);
...
...
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
View file @
ef8c6ac2
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
View file @
ef8c6ac2
...
@@ -236,7 +236,8 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
...
@@ -236,7 +236,8 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
if
(
undefined_only
)
{
if
(
undefined_only
)
{
String
[]
matches
=
pairwise_matches
.
keySet
().
toArray
(
new
String
[
0
]);
String
[]
matches
=
pairwise_matches
.
keySet
().
toArray
(
new
String
[
0
]);
for
(
String
match:
matches
)
{
for
(
String
match:
matches
)
{
if
(!
getMatch
(
match
).
isDefined
())
{
PairwiseOrthoMatch
pm
=
getMatch
(
match
);
if
((
pm
==
null
)
||
!
pm
.
isDefined
())
{
unsetMatch
(
match
);
unsetMatch
(
match
);
}
}
}
}
...
@@ -483,7 +484,14 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
...
@@ -483,7 +484,14 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
// TODO Auto-generated catch block
// TODO Auto-generated catch block
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
try
{
lla
=
ElphelTiffReader
.
getLLA
(
imp_prop
);
lla
=
ElphelTiffReader
.
getLLA
(
imp_prop
);
}
catch
(
NullPointerException
e
)
{
System
.
out
.
println
(
"No GPS data in "
+
path
);
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
dt
=
ElphelTiffReader
.
getLocalDateTime
(
imp_prop
);
dt
=
ElphelTiffReader
.
getLocalDateTime
(
imp_prop
);
vert_meters
=
ElphelTiffReader
.
getXYOffsetMeters
(
imp_prop
);
vert_meters
=
ElphelTiffReader
.
getXYOffsetMeters
(
imp_prop
);
orig_pix_meters
=
ElphelTiffReader
.
getPixelSize
(
imp_prop
)[
0
];
orig_pix_meters
=
ElphelTiffReader
.
getPixelSize
(
imp_prop
)[
0
];
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
View file @
ef8c6ac2
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/orthomosaic/PairwiseOrthoMatch.java
View file @
ef8c6ac2
...
@@ -16,6 +16,7 @@ public class PairwiseOrthoMatch implements Serializable {
...
@@ -16,6 +16,7 @@ public class PairwiseOrthoMatch implements Serializable {
public
transient
int
[]
nxy
=
null
;
// not saved, just to communicate for logging
public
transient
int
[]
nxy
=
null
;
// not saved, just to communicate for logging
public
transient
double
overlap
=
0.0
;
public
transient
double
overlap
=
0.0
;
public
transient
double
[]
equalize1to0
=
{
1
,
0
};
// value1 = equalize2to1[0]*value2+equalize2to1[1]
public
transient
double
[]
equalize1to0
=
{
1
,
0
};
// value1 = equalize2to1[0]*value2+equalize2to1[1]
public
transient
boolean
ok
=
false
;
// public PairwiseOrthoMatch() {}
// public PairwiseOrthoMatch() {}
public
double
getOverlap
()
{
public
double
getOverlap
()
{
...
@@ -75,6 +76,7 @@ public class PairwiseOrthoMatch implements Serializable {
...
@@ -75,6 +76,7 @@ public class PairwiseOrthoMatch implements Serializable {
pom
.
nxy
=
nxy
.
clone
();
pom
.
nxy
=
nxy
.
clone
();
}
}
pom
.
equalize1to0
=
this
.
equalize1to0
.
clone
();
pom
.
equalize1to0
=
this
.
equalize1to0
.
clone
();
pom
.
ok
=
this
.
ok
;
return
pom
;
return
pom
;
}
}
/**
/**
...
...
src/main/java/com/elphel/imagej/tileprocessor/IntersceneMatchParameters.java
View file @
ef8c6ac2
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/tileprocessor/OpticalFlow.java
View file @
ef8c6ac2
...
@@ -4631,6 +4631,8 @@ public class OpticalFlow {
...
@@ -4631,6 +4631,8 @@ public class OpticalFlow {
int
min_num_interscene
=
clt_parameters
.
imp
.
min_num_interscene
;
// 2; // make from parameters, should be >= 1
int
min_num_interscene
=
clt_parameters
.
imp
.
min_num_interscene
;
// 2; // make from parameters, should be >= 1
int
min_num_orient
=
clt_parameters
.
imp
.
min_num_orient
;
// 2; // make from parameters, should be >= 1
int
min_num_orient
=
clt_parameters
.
imp
.
min_num_orient
;
// 2; // make from parameters, should be >= 1
boolean
sfm_only
=
clt_parameters
.
imp
.
sfm_only
;
// process only data with SfM
boolean
export_images
=
clt_parameters
.
imp
.
export_images
;
boolean
export_images
=
clt_parameters
.
imp
.
export_images
;
boolean
export_dsi_image
=
clt_parameters
.
imp
.
export_ranges
;
boolean
export_dsi_image
=
clt_parameters
.
imp
.
export_ranges
;
boolean
debug_ranges
=
clt_parameters
.
imp
.
debug_ranges
&&
!
batch_mode
;
boolean
debug_ranges
=
clt_parameters
.
imp
.
debug_ranges
&&
!
batch_mode
;
...
@@ -5171,10 +5173,17 @@ public class OpticalFlow {
...
@@ -5171,10 +5173,17 @@ public class OpticalFlow {
System
.
out
.
println
(
"BUG: saved reference scene "
+
quadCLTs
[
ref_index
].
getImageName
()+
System
.
out
.
println
(
"BUG: saved reference scene "
+
quadCLTs
[
ref_index
].
getImageName
()+
" is not really a reference"
);
" is not really a reference"
);
System
.
out
.
println
();
System
.
out
.
println
();
start_ref_pointers
[
0
]
=
0
;
start_ref_pointers
[
1
]
=
0
;
return
quadCLTs
[
ref_index
].
getX3dTopDirectory
();
//bailing out
}
else
if
((
first_last_index
[
0
]
<
0
)
||
(
first_last_index
[
1
]
<
0
))
{
}
else
if
((
first_last_index
[
0
]
<
0
)
||
(
first_last_index
[
1
]
<
0
))
{
System
.
out
.
println
(
"BUG: saved reference scene "
+
quadCLTs
[
ref_index
].
getImageName
()+
System
.
out
.
println
(
"BUG: saved reference scene "
+
quadCLTs
[
ref_index
].
getImageName
()+
" does not have both first/last scenes defined: ["
+
first_last_index
[
0
]+
", "
+
first_last_index
[
1
]+
"]"
);
" does not have both first/last scenes defined: ["
+
first_last_index
[
0
]+
", "
+
first_last_index
[
1
]+
"]"
);
System
.
out
.
println
();
System
.
out
.
println
();
start_ref_pointers
[
0
]
=
0
;
start_ref_pointers
[
1
]
=
0
;
return
quadCLTs
[
ref_index
].
getX3dTopDirectory
();
//bailing out
}
else
{
}
else
{
earliest_scene
=
first_last_index
[
0
];
earliest_scene
=
first_last_index
[
0
];
last_index
=
first_last_index
[
1
];
last_index
=
first_last_index
[
1
];
...
@@ -5185,7 +5194,8 @@ public class OpticalFlow {
...
@@ -5185,7 +5194,8 @@ public class OpticalFlow {
// earliest_scene = getEarliestScene(quadCLTs);
// earliest_scene = getEarliestScene(quadCLTs);
// below ref_index is not necessary the last (fix all where it is supposed to be the last
// below ref_index is not necessary the last (fix all where it is supposed to be the last
ErsCorrection
ers_reference
=
quadCLTs
[
ref_index
].
getErsCorrection
();
// only used in ml_export
ErsCorrection
ers_reference
=
quadCLTs
[
ref_index
].
getErsCorrection
();
// only used in ml_export
while
(!
reuse_video
&&
((
quadCLTs
[
ref_index
].
getNumOrient
()
<
min_num_orient
)
||
(
quadCLTs
[
ref_index
].
getNumAccum
()
<
min_num_interscene
)))
{
if
(!
reuse_video
)
{
while
((
quadCLTs
[
ref_index
].
getNumOrient
()
<
min_num_orient
)
||
(
quadCLTs
[
ref_index
].
getNumAccum
()
<
min_num_interscene
))
{
if
(
debugLevel
>
-
3
)
{
if
(
debugLevel
>
-
3
)
{
System
.
out
.
println
(
"quadCLTs["
+
ref_index
+
"].getNumOrient()="
+
quadCLTs
[
ref_index
].
getNumOrient
()+
System
.
out
.
println
(
"quadCLTs["
+
ref_index
+
"].getNumOrient()="
+
quadCLTs
[
ref_index
].
getNumOrient
()+
" of "
+
min_num_orient
+
", quadCLTs["
+
ref_index
+
"].getNumAccum()="
+
quadCLTs
[
ref_index
].
getNumAccum
()+
" of "
+
min_num_orient
+
", quadCLTs["
+
ref_index
+
"].getNumAccum()="
+
quadCLTs
[
ref_index
].
getNumAccum
()+
...
@@ -5210,9 +5220,9 @@ public class OpticalFlow {
...
@@ -5210,9 +5220,9 @@ public class OpticalFlow {
" is more than half-range. Reducing to "
+
num_avg_pairs
);
" is more than half-range. Reducing to "
+
num_avg_pairs
);
}
}
}
}
// if (num_avg_pairs > (last_index - ref_index)) {
// if (num_avg_pairs > (last_index - ref_index)) {
// num_avg_pairs = last_index - ref_index;
// num_avg_pairs = last_index - ref_index;
// }
// }
QuadCLT
[][][]
scenes_seq_pairs
=
new
QuadCLT
[
3
][
num_avg_pairs
][
2
];
QuadCLT
[][][]
scenes_seq_pairs
=
new
QuadCLT
[
3
][
num_avg_pairs
][
2
];
int
ref_index_mod1
=
Math
.
max
(
ref_index
,
earliest_scene
+
num_avg_pairs
-
1
);
int
ref_index_mod1
=
Math
.
max
(
ref_index
,
earliest_scene
+
num_avg_pairs
-
1
);
int
ref_index_mod2
=
Math
.
min
(
ref_index
,
last_index
-
num_avg_pairs
+
1
);
int
ref_index_mod2
=
Math
.
min
(
ref_index
,
last_index
-
num_avg_pairs
+
1
);
...
@@ -5228,6 +5238,7 @@ public class OpticalFlow {
...
@@ -5228,6 +5238,7 @@ public class OpticalFlow {
scenes_seq_pairs
[
2
][
i
][
0
]
=
quadCLTs
[
ref_index_mod2
+
num_avg_pairs
-
1
-
i
];
scenes_seq_pairs
[
2
][
i
][
0
]
=
quadCLTs
[
ref_index_mod2
+
num_avg_pairs
-
1
-
i
];
scenes_seq_pairs
[
2
][
i
][
1
]
=
quadCLTs
[
earliest_scene
+
num_avg_pairs
-
1
-
i
];
scenes_seq_pairs
[
2
][
i
][
1
]
=
quadCLTs
[
earliest_scene
+
num_avg_pairs
-
1
-
i
];
}
}
double
[][]
sfm_dsn
=
StructureFromMotion
.
sfmPairsSet
(
double
[][]
sfm_dsn
=
StructureFromMotion
.
sfmPairsSet
(
clt_parameters
,
// final CLTParameters clt_parameters,
clt_parameters
,
// final CLTParameters clt_parameters,
quadCLTs
[
ref_index
],
// final QuadCLT ref_scene,
quadCLTs
[
ref_index
],
// final QuadCLT ref_scene,
...
@@ -5239,6 +5250,14 @@ public class OpticalFlow {
...
@@ -5239,6 +5250,14 @@ public class OpticalFlow {
combo_dsn_final
=
sfm_dsn
;
combo_dsn_final
=
sfm_dsn
;
done_sfm
=
true
;
done_sfm
=
true
;
}
}
if
(!
done_sfm
&&
sfm_only
)
{
System
.
out
.
println
(
"\nsfm_only is set and no SfM is available, skipping farther processing of this scene series."
);
System
.
out
.
println
(
"quadCLTs["
+
ref_index
+
"].getNumOrient()="
+
quadCLTs
[
ref_index
].
getNumOrient
()+
" of "
+
min_num_orient
+
", quadCLTs["
+
ref_index
+
"].getNumAccum()="
+
quadCLTs
[
ref_index
].
getNumAccum
()+
" of "
+
min_num_interscene
+
"\n"
);
break
;
}
}
}
if
(!
done_sfm
)
{
// first pass or sfm failed
if
(!
done_sfm
)
{
// first pass or sfm failed
boolean
compensate_dsi
=
true
;
boolean
compensate_dsi
=
true
;
...
@@ -5400,46 +5419,10 @@ public class OpticalFlow {
...
@@ -5400,46 +5419,10 @@ public class OpticalFlow {
if
(
debugLevel
>
-
3
)
{
if
(
debugLevel
>
-
3
)
{
System
.
out
.
println
(
"Egomotion table saved to "
+
ego_path
);
System
.
out
.
println
(
"Egomotion table saved to "
+
ego_path
);
}
}
/*
// reference to earliest
String ego_path_early = quadCLTs[ref_index].getX3dDirectory()+Prefs.getFileSeparator()+
quadCLTs[ref_index].getImageName()+
"-ego_early-"+quadCLTs[ref_index].getNumOrient()+".csv";
Interscene.invertInitialOrientation(
clt_parameters, // final CLTParameters clt_parameters,
batch_mode, // final boolean batch_mode,
false, // final boolean readjust,
true, // final int set_self, // set record for the new reference to new reference
quadCLTs, // final QuadCLT[] quadCLTs, //
quadCLTs.length-1,// final int last_index, // last to process (normally old reference)
earliest_scene, // final int ref_index, // new reference index (center)
ref_index, // final int ref_old, // original ref_index (normally == last_index)
earliest_scene, // final int earliest_index// first to process
debugLevel); // final int debugLevel
Interscene.generateEgomotionTable(
clt_parameters, // CLTParameters clt_parameters,
quadCLTs, // QuadCLT [] quadCLTs,
earliest_scene,// ref_indx,
earliest_scene, // int earliest_scene,
ego_path_early, // String path,
ego_comment); // String comment);
if (debugLevel> -3) {
System.out.println("Egomotion referenced to earliest scene table saved to "+ego_path_early);
}
*/
}
}
}
}
}
}
/*
}
// if (!reuse_video) {
boolean calc_smooth_ground = clt_parameters.gsmth_enable;
if (calc_smooth_ground) {
double [] smooth_ground = quadCLTs[ref_index].getSmoothGround(clt_parameters, debugLevel);
quadCLTs[ref_index].setSmoothGround(
clt_parameters, // CLTParameters clt_parameters,
smooth_ground, // double [] smooth_ground,
debugLevel); // int debugLevel)
}
*/
// later move to the right place
// later move to the right place
if
(
adjust_imu_orient
)
{
// (quadCLTs[ref_index].getNumOrient() >= clt_parameters.imp.mb_all_index)) {
if
(
adjust_imu_orient
)
{
// (quadCLTs[ref_index].getNumOrient() >= clt_parameters.imp.mb_all_index)) {
boolean
orient_combo
=
clt_parameters
.
imp
.
orient_combo
;
// use combined rotation+orientation for IMU/camera matching
boolean
orient_combo
=
clt_parameters
.
imp
.
orient_combo
;
// use combined rotation+orientation for IMU/camera matching
...
...
src/main/java/com/elphel/imagej/tileprocessor/QuadCLTCPU.java
View file @
ef8c6ac2
...
@@ -223,6 +223,9 @@ public class QuadCLTCPU {
...
@@ -223,6 +223,9 @@ public class QuadCLTCPU {
enu_corr_metric
=
corr
;
enu_corr_metric
=
corr
;
}
}
public
String
toString
()
{
return
this
.
image_name
;
}
// find best rotation between IMU XYZ and camera XYZ
// find best rotation between IMU XYZ and camera XYZ
/**
/**
...
...
src/main/java/com/elphel/imagej/tileprocessor/TwoQuadCLT.java
View file @
ef8c6ac2
...
@@ -8636,7 +8636,7 @@ if (debugLevel > -100) return true; // temporarily !
...
@@ -8636,7 +8636,7 @@ if (debugLevel > -100) return true; // temporarily !
updateStatus
,
// final boolean updateStatus,
updateStatus
,
// final boolean updateStatus,
debugLevel
+
2
);
// final int debugLevel)
debugLevel
+
2
);
// final int debugLevel)
if
(
model_directory
==
null
)
{
if
(
model_directory
==
null
)
{
// TODO: Save continu
e
ation after failure not to retry each run
// TODO: Save continuation after failure not to retry each run
System
.
out
.
println
(
"Failed to build sequence for series "
+
ref_index
);
System
.
out
.
println
(
"Failed to build sequence for series "
+
ref_index
);
if
(
start_ref_pointers
[
0
]
<
(
min_num_scenes
-
1
))
{
if
(
start_ref_pointers
[
0
]
<
(
min_num_scenes
-
1
))
{
break
;
break
;
...
@@ -8645,6 +8645,12 @@ if (debugLevel > -100) return true; // temporarily !
...
@@ -8645,6 +8645,12 @@ if (debugLevel > -100) return true; // temporarily !
System
.
out
.
println
(
"Continue from index "
+
ref_index
);
System
.
out
.
println
(
"Continue from index "
+
ref_index
);
continue
;
// and go to the to next scene sequence from the list
continue
;
// and go to the to next scene sequence from the list
}
}
if
((
start_ref_pointers
[
0
]==
0
)
&&
(
start_ref_pointers
[
1
]==
0
))
{
// bail out for debug
System
.
out
.
println
(
"\n ----- PROCESSING SCENE SEQUENCE "
+
nseq
+
" (last is "
+(
num_seq
-
1
)+
") ABORTED in "
+
IJ
.
d2s
(
0.000000001
*(
System
.
nanoTime
()-
start_time_seq
),
3
)+
" sec ("
+
IJ
.
d2s
(
0.000000001
*(
System
.
nanoTime
()-
start_time_all
),
3
)+
" sec from the overall start\n"
);
break
;
}
first_in_series
=
false
;
// at least once success in this series
first_in_series
=
false
;
// at least once success in this series
System
.
out
.
println
(
"adding to video_sets_list start="
+
start_ref_pointers
[
0
]+
", end="
+
ref_index
);
// start_ref_pointers[1]);
System
.
out
.
println
(
"adding to video_sets_list start="
+
start_ref_pointers
[
0
]+
", end="
+
ref_index
);
// start_ref_pointers[1]);
for
(
int
i
=
0
;
i
<
video_list
[
0
].
length
;
i
++)
{
for
(
int
i
=
0
;
i
<
video_list
[
0
].
length
;
i
++)
{
...
...
src/main/java/com/elphel/imagej/tileprocessor/sfm/StructureFromMotion.java
View file @
ef8c6ac2
...
@@ -790,6 +790,76 @@ public class StructureFromMotion {
...
@@ -790,6 +790,76 @@ public class StructureFromMotion {
return
combo_dsn_final
;
return
combo_dsn_final
;
}
}
/**
* Filter reference disparity from NaN (average immediate neighbors), dips and bumps
* @param disp_in
* @param max_dip maximal dip relative to lowest neighbor (0 - any)
* @param max_bump maximal bump relative to highest neighbor (0 - any)
* @param filter_nan replace NaN by neighbors average
* @param tilesX
* @return filtered disparity
*/
public
static
double
[]
filterRefDisparity
(
final
double
[]
disp_in
,
final
double
max_dip
,
final
double
max_bump
,
final
boolean
filter_nan
,
final
int
tilesX
)
{
final
double
[]
disp_out
=
disp_in
.
clone
();
final
int
tilesY
=
disp_in
.
length
/
tilesX
;
final
Thread
[]
threads
=
ImageDtt
.
newThreadArray
(
QuadCLT
.
THREADS_MAX
);
final
AtomicInteger
ai
=
new
AtomicInteger
(
0
);
for
(
int
ithread
=
0
;
ithread
<
threads
.
length
;
ithread
++)
{
threads
[
ithread
]
=
new
Thread
()
{
public
void
run
()
{
TileNeibs
tn
=
new
TileNeibs
(
tilesX
,
tilesY
);
for
(
int
nTile
=
ai
.
getAndIncrement
();
nTile
<
disp_in
.
length
;
nTile
=
ai
.
getAndIncrement
())
{
int
navg
=
0
;
double
s
=
0
;
if
(
Double
.
isNaN
(
disp_in
[
nTile
]))
{
for
(
int
dir
=
0
;
dir
<
TileNeibs
.
DIRS
;
dir
++)
{
int
tile1
=
tn
.
getNeibIndex
(
nTile
,
dir
);
if
((
tile1
>=
0
)
&&
!
Double
.
isNaN
(
disp_in
[
tile1
])){
s
+=
disp_in
[
tile1
];
navg
++;
}
}
if
(
navg
>
0
)
{
disp_out
[
nTile
]
=
s
/
navg
;
}
}
else
{
double
mn
=
Double
.
NaN
,
mx
=
Double
.
NaN
;
for
(
int
dir
=
0
;
dir
<
TileNeibs
.
DIRS
;
dir
++)
{
int
tile1
=
tn
.
getNeibIndex
(
nTile
,
dir
);
if
(
tile1
>=
0
){
double
d
=
disp_in
[
tile1
];
if
(!
Double
.
isNaN
(
d
))
{
if
(
Double
.
isNaN
(
mn
))
{
mn
=
d
;
mx
=
d
;
}
else
{
mn
=
Math
.
min
(
mn
,
d
);
mx
=
Math
.
max
(
mn
,
d
);
}
s
+=
d
;
navg
++;
}
}
}
if
(
navg
>
0
)
{
if
(
((
max_dip
>
0
)
&&
(
disp_in
[
nTile
]
<
(
mn
-
max_dip
)))
||
((
max_bump
>
0
)
&&
(
disp_in
[
nTile
]
>
(
mx
+
max_bump
))))
{
disp_out
[
nTile
]
=
s
/
navg
;
}
}
}
}
}
};
}
ImageDtt
.
startAndJoin
(
threads
);
return
disp_out
;
}
public
static
double
[][]
sfmPairsSet
(
public
static
double
[][]
sfmPairsSet
(
final
CLTParameters
clt_parameters
,
final
CLTParameters
clt_parameters
,
...
@@ -798,6 +868,7 @@ public class StructureFromMotion {
...
@@ -798,6 +868,7 @@ public class StructureFromMotion {
final
double
mb_max_gain
,
final
double
mb_max_gain
,
final
boolean
batch_mode
,
final
boolean
batch_mode
,
final
int
debugLevel
)
{
final
int
debugLevel
)
{
boolean
save_disp_seq
=
clt_parameters
.
imp
.
sfm_save_seq
;
//true;
boolean
save_disp_seq
=
clt_parameters
.
imp
.
sfm_save_seq
;
//true;
boolean
show_disp_seq
=
clt_parameters
.
imp
.
sfm_show_seq
&=
!
batch_mode
;
//true;
boolean
show_disp_seq
=
clt_parameters
.
imp
.
sfm_show_seq
&=
!
batch_mode
;
//true;
boolean
show_disp_corr_ind
=
clt_parameters
.
imp
.
sfm_show_corr_ind
&=
!
batch_mode
;
//false; //true;
boolean
show_disp_corr_ind
=
clt_parameters
.
imp
.
sfm_show_corr_ind
&=
!
batch_mode
;
//false; //true;
...
@@ -836,6 +907,10 @@ public class StructureFromMotion {
...
@@ -836,6 +907,10 @@ public class StructureFromMotion {
final
boolean
fill_weak
=
clt_parameters
.
imp
.
sfm_fill_weak
;
// false;
final
boolean
fill_weak
=
clt_parameters
.
imp
.
sfm_fill_weak
;
// false;
final
boolean
extrapolate
=
clt_parameters
.
imp
.
sfm_extrapolate
;
// false;
final
boolean
extrapolate
=
clt_parameters
.
imp
.
sfm_extrapolate
;
// false;
final
double
max_dip
=
clt_parameters
.
imp
.
sfm_max_dip
;
// 0.1;
final
double
max_bump
=
clt_parameters
.
imp
.
sfm_max_bump
;
// 0.5;
final
boolean
filter_nan
=
clt_parameters
.
imp
.
sfm_filter_nan
;
// true;
final
int
tilesX
=
ref_scene
.
getTileProcessor
().
getTilesX
();
final
int
tilesX
=
ref_scene
.
getTileProcessor
().
getTilesX
();
final
int
tilesY
=
ref_scene
.
getTileProcessor
().
getTilesY
();
final
int
tilesY
=
ref_scene
.
getTileProcessor
().
getTilesY
();
...
@@ -882,7 +957,7 @@ public class StructureFromMotion {
...
@@ -882,7 +957,7 @@ public class StructureFromMotion {
debugLevel
);
debugLevel
);
double
[]
interscene_ref_disparity
=
null
;
// keep null to use old single-scene disparity for interscene matching
double
[]
interscene_ref_disparity
=
null
;
// keep null to use old single-scene disparity for interscene matching
if
(
use_combo_dsi
)
{
if
(
use_combo_dsi
)
{
interscene_ref_disparity
=
ds
[
0
].
clone
();
// use_lma_dsi ?
interscene_ref_disparity
=
ds
[
0
]
;
//
.clone(); // use_lma_dsi ?
/* use conditioned!
/* use conditioned!
if (use_lma_dsi) {
if (use_lma_dsi) {
for (int i = 0; i < interscene_ref_disparity.length; i++) {
for (int i = 0; i < interscene_ref_disparity.length; i++) {
...
@@ -897,7 +972,15 @@ public class StructureFromMotion {
...
@@ -897,7 +972,15 @@ public class StructureFromMotion {
if
(
interscene_ref_disparity
==
null
)
{
if
(
interscene_ref_disparity
==
null
)
{
interscene_ref_disparity
=
ref_scene
.
getDLS
()[
use_lma_dsi
?
1
:
0
];
interscene_ref_disparity
=
ref_scene
.
getDLS
()[
use_lma_dsi
?
1
:
0
];
}
}
final
double
[]
ref_disparity
=
interscene_ref_disparity
;
boolean
filter_ref
=
filter_nan
||
(
max_dip
>
0
)
||
(
max_bump
>
0
);
final
double
[]
ref_disparity
=
filter_ref
?
filterRefDisparity
(
interscene_ref_disparity
,
// final double [] disp_in,
max_dip
,
// final double max_dip,
max_bump
,
// final double max_bump,
filter_nan
,
// final boolean filter_nan,
tilesX
):
// final int tilesX)
interscene_ref_disparity
.
clone
();
double
[][]
disp_adj
=
(
show_disp_seq
||
save_disp_seq
)?
(
new
double
[
num_readjust
+
2
][]):
null
;
double
[][]
disp_adj
=
(
show_disp_seq
||
save_disp_seq
)?
(
new
double
[
num_readjust
+
2
][]):
null
;
if
(
disp_adj
!=
null
)
{
if
(
disp_adj
!=
null
)
{
disp_adj
[
0
]
=
ref_disparity
.
clone
();
disp_adj
[
0
]
=
ref_disparity
.
clone
();
...
@@ -1076,6 +1159,7 @@ public class StructureFromMotion {
...
@@ -1076,6 +1159,7 @@ public class StructureFromMotion {
if
(
sfmCorrCombo
[
nTile
].
corr_ind
==
null
)
{
if
(
sfmCorrCombo
[
nTile
].
corr_ind
==
null
)
{
sfmCorrCombo
[
nTile
].
corr_ind
=
new
double
[
2
];
sfmCorrCombo
[
nTile
].
corr_ind
=
new
double
[
2
];
}
}
if
(!
Double
.
isNaN
(
sfmCorr
[
nTile
].
corr_ind
[
0
])
&&
(
sfmCorr
[
nTile
].
corr_ind
[
1
]
>
0
))
{
sfmCorrCombo
[
nTile
].
corr_ind
[
0
]+=
sfmCorr
[
nTile
].
corr_ind
[
0
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
corr_ind
[
0
]+=
sfmCorr
[
nTile
].
corr_ind
[
0
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
corr_ind
[
1
]+=
sfmCorr
[
nTile
].
corr_ind
[
1
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
corr_ind
[
1
]+=
sfmCorr
[
nTile
].
corr_ind
[
1
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sum_weights_ind
[
nTile
]+=
sfmCorr
[
nTile
].
sfm_gain
;
sum_weights_ind
[
nTile
]+=
sfmCorr
[
nTile
].
sfm_gain
;
...
@@ -1083,10 +1167,12 @@ public class StructureFromMotion {
...
@@ -1083,10 +1167,12 @@ public class StructureFromMotion {
sfmCorrCombo
[
nTile
].
sfm_gain
=
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
sfm_gain
=
sfmCorr
[
nTile
].
sfm_gain
;
}
}
}
}
}
if
(
sfmCorr
[
nTile
].
corr_neib
!=
null
)
{
if
(
sfmCorr
[
nTile
].
corr_neib
!=
null
)
{
if
(
sfmCorrCombo
[
nTile
].
corr_neib
==
null
)
{
if
(
sfmCorrCombo
[
nTile
].
corr_neib
==
null
)
{
sfmCorrCombo
[
nTile
].
corr_neib
=
new
double
[
2
];
sfmCorrCombo
[
nTile
].
corr_neib
=
new
double
[
2
];
}
}
if
(!
Double
.
isNaN
(
sfmCorr
[
nTile
].
corr_neib
[
0
])
&&
(
sfmCorr
[
nTile
].
corr_neib
[
1
]
>
0
))
{
sfmCorrCombo
[
nTile
].
corr_neib
[
0
]+=
sfmCorr
[
nTile
].
corr_neib
[
0
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
corr_neib
[
0
]+=
sfmCorr
[
nTile
].
corr_neib
[
0
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
corr_neib
[
1
]+=
sfmCorr
[
nTile
].
corr_neib
[
1
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sfmCorrCombo
[
nTile
].
corr_neib
[
1
]+=
sfmCorr
[
nTile
].
corr_neib
[
1
]
*
sfmCorr
[
nTile
].
sfm_gain
;
sum_weights_neib
[
nTile
]+=
sfmCorr
[
nTile
].
sfm_gain
;
sum_weights_neib
[
nTile
]+=
sfmCorr
[
nTile
].
sfm_gain
;
...
@@ -1097,6 +1183,7 @@ public class StructureFromMotion {
...
@@ -1097,6 +1183,7 @@ public class StructureFromMotion {
}
}
}
}
}
}
}
};
};
}
}
ImageDtt
.
startAndJoin
(
threads
);
ImageDtt
.
startAndJoin
(
threads
);
...
...
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