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
7f9773fb
Commit
7f9773fb
authored
Sep 07, 2024
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
done refactoring, starting debugging
parent
0a4fdfe3
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
628 additions
and
323 deletions
+628
-323
Affine2Import.java
...ain/java/com/elphel/imagej/orthomosaic/Affine2Import.java
+29
-0
AffineImport.java
...main/java/com/elphel/imagej/orthomosaic/AffineImport.java
+27
-0
ComboMatch.java
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
+381
-166
FloatImageData.java
...in/java/com/elphel/imagej/orthomosaic/FloatImageData.java
+4
-0
OrthoMap.java
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
+60
-46
OrthoMapsCollection.java
...va/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
+71
-64
PairwiseOrthoMatch.java
...ava/com/elphel/imagej/orthomosaic/PairwiseOrthoMatch.java
+56
-47
No files found.
src/main/java/com/elphel/imagej/orthomosaic/Affine2Import.java
0 → 100644
View file @
7f9773fb
package
com
.
elphel
.
imagej
.
orthomosaic
;
public
class
Affine2Import
{
public
static
final
String
AFFINE2_TAG
=
"AFFINE2"
;
public
static
final
int
AFFINE2_LEN
=
10
;
public
String
name1
;
public
String
name2
;
public
double
overlap
;
public
double
[][]
affine
;
public
static
boolean
matches
(
String
[]
tokens
)
{
return
((
tokens
.
length
==
AFFINE2_LEN
)
&&
AFFINE2_TAG
.
equals
(
tokens
[
0
]));
}
public
Affine2Import
(
String
[]
tokens
)
{
if
(!
matches
(
tokens
))
{
throw
new
IllegalArgumentException
(
"Not Affine2Import tokens"
);
}
int
indx
=
1
;
name1
=
tokens
[
indx
++];
name2
=
tokens
[
indx
++];
overlap
=
Double
.
parseDouble
(
tokens
[
indx
++]);
affine
=
new
double
[
2
][
3
];
for
(
int
i
=
0
;
i
<
affine
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
affine
[
i
].
length
;
j
++)
{
affine
[
i
][
j
]
=
Double
.
parseDouble
(
tokens
[
indx
++]);
}
}
}
}
src/main/java/com/elphel/imagej/orthomosaic/AffineImport.java
0 → 100644
View file @
7f9773fb
package
com
.
elphel
.
imagej
.
orthomosaic
;
public
class
AffineImport
{
public
static
final
String
AFFINE_TAG
=
"AFFINE"
;
public
static
final
int
AFFINE_LEN
=
8
;
public
String
name
;
public
double
[][]
affine
;
public
static
boolean
matches
(
String
[]
tokens
)
{
return
((
tokens
.
length
==
AFFINE_LEN
)
&&
AFFINE_TAG
.
equals
(
tokens
[
0
]));
}
public
AffineImport
(
String
[]
tokens
)
{
if
(!
matches
(
tokens
))
{
throw
new
IllegalArgumentException
(
"Not AffineImport tokens"
);
}
int
indx
=
1
;
name
=
tokens
[
indx
++];
affine
=
new
double
[
2
][
3
];
for
(
int
i
=
0
;
i
<
affine
.
length
;
i
++)
{
for
(
int
j
=
0
;
j
<
affine
[
i
].
length
;
j
++)
{
affine
[
i
][
j
]
=
Double
.
parseDouble
(
tokens
[
indx
++]);
}
}
}
// String[] tokens
}
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
View file @
7f9773fb
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/orthomosaic/FloatImageData.java
View file @
7f9773fb
...
...
@@ -238,6 +238,10 @@ public class FloatImageData implements Serializable {
return
extra_zoom
[
0
];
}
public
double
needZoomIn
()
{
return
needZoomIn
(
pix_meters
);
}
public
int
getZoomLevel
()
{
return
zoom_lev
;
}
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
View file @
7f9773fb
...
...
@@ -106,54 +106,57 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
public
static
final
String
ALT_SUFFIX
=
"-ALT"
;
public
transient
String
name
;
// timestamp
public
transient
double
ts
;
public
transient
String
path
;
// full path to the model directory (including /vXX?)
public
double
[]
lla
;
// lat/long/alt
public
LocalDateTime
dt
;
public
String
path
;
// full path to the model directory (including /vXX?)
// public double [] lla; // lat/long/alt
// public LocalDateTime dt;
// affine convert (input) rectified coordinates (meters) relative to vert_meters to source image
// coordinates relative to vert_meters
public
double
[][]
affine
=
new
double
[][]
{{
1
,
0
,
0
},{
0
,
1
,
0
}};
// relative to vert_meters[], positive Y is down (as in images)
public
transient
double
[][]
ers_affine
=
new
double
[][]
{{
1
,
0
},{
0
,
1
}};
// orientation only for remaining ERS, positive Y is down (as in images)
public
transient
FloatImageData
orig_image
;
public
transient
FloatImageData
alt_image
;
public
int
orig_zoom_level
;
public
boolean
orig_zoom_valid
;
public
double
need_extra_zoom
;
public
double
averageRawPixel
=
Double
.
NaN
;
// measure of scene temperature
public
double
[][]
affine
=
new
double
[][]
{{
1
,
0
,
0
},{
0
,
1
,
0
}};
// relative to vert_meters[], positive Y is down (as in images)
public
double
[][]
ers_affine
=
new
double
[][]
{{
1
,
0
},{
0
,
1
}};
// orientation only for remaining ERS, positive Y is down (as in images)
public
FloatImageData
orig_image
;
public
FloatImageData
alt_image
;
// public int orig_zoom_level;
// public boolean orig_zoom_valid;
// public double need_extra_zoom;
public
double
averageRawPixel
=
Double
.
NaN
;
// measure of scene temperature
HashMap
<
String
,
PairwiseOrthoMatch
>
pairwise_matches
;
public
SensorTemperatureData
[]
temp_data
;
public
double
agl
=
Double
.
NaN
;
public
int
num_scenes
=
-
1
;;
// number of scenes that made up this image
public
double
sfm_gain
=
Double
.
NaN
;
// maximal SfM gain of this map
public
double
[]
equalize
=
{
1
,
0
};
// rectified value = equalize[0]*source_value+equalize[1]
public
double
[]
qorient
=
null
;
// quternion representing orientation+scale of the scene
// really transient
transient
HashMap
<
Integer
,
FloatImageData
>
images
;
HashMap
<
String
,
PairwiseOrthoMatch
>
pairwise_matches
;
public
transient
SensorTemperatureData
[]
temp_data
;
public
transient
double
agl
=
Double
.
NaN
;
public
transient
int
num_scenes
=
-
1
;;
// number of scenes that made up this image
public
transient
double
sfm_gain
=
Double
.
NaN
;
// maximal SfM gain of this map
public
transient
double
[]
equalize
=
{
1
,
0
};
// rectified value = equalize[0]*source_value+equalize[1]
public
transient
double
[]
qorient
=
null
;
// quternion representing orientation+scale of the scene
public
transient
String
name
;
// timestamp
public
transient
double
ts
;
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
oos
.
defaultWriteObject
();
oos
.
writeObject
(
path
);
oos
.
writeObject
(
temp_data
);
// temporary, while transient
oos
.
writeObject
(
agl
);
oos
.
writeObject
(
num_scenes
);
oos
.
writeObject
(
sfm_gain
);
oos
.
writeObject
(
equalize
);
oos
.
writeObject
(
qorient
);
//
oos.writeObject(path);
//
oos.writeObject(temp_data); // temporary, while transient
//
oos.writeObject(agl);
//
oos.writeObject(num_scenes);
//
oos.writeObject(sfm_gain);
//
oos.writeObject(equalize);
//
oos.writeObject(qorient);
}
private
void
readObject
(
ObjectInputStream
ois
)
throws
ClassNotFoundException
,
IOException
{
ois
.
defaultReadObject
();
path
=
(
String
)
ois
.
readObject
();
//
path = (String) ois.readObject();
name
=
getNameFromPath
(
path
);
ts
=
Double
.
parseDouble
(
name
.
replace
(
"_"
,
"."
));
temp_data
=
(
SensorTemperatureData
[])
ois
.
readObject
();
agl
=
(
double
)
ois
.
readObject
();
num_scenes
=
(
int
)
ois
.
readObject
();
sfm_gain
=
(
double
)
ois
.
readObject
();
equalize
=
(
double
[])
ois
.
readObject
();
if
(
OrthoMapsCollection
.
CURRENT_VERSION
>=
OrthoMapsCollection
.
VERSION_POST_ORIENT
)
{
qorient
=
(
double
[])
ois
.
readObject
();
}
//
temp_data = (SensorTemperatureData[]) ois.readObject();
//
agl = (double) ois.readObject();
//
num_scenes = (int) ois.readObject();
//
sfm_gain = (double) ois.readObject();
//
equalize = (double []) ois.readObject();
//
if (OrthoMapsCollection.CURRENT_VERSION >= OrthoMapsCollection.VERSION_POST_ORIENT) {
//
qorient = (double[]) ois.readObject();
//
}
images
=
new
HashMap
<
Integer
,
FloatImageData
>();
// field images was not saved
// averageImagePixel = Double.NaN; // average image pixel value (to combine with raw)
...
...
@@ -229,7 +232,16 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
if
(
with_undefined
||
match
.
isDefined
())
return
match
;
return
null
;
}
public
static
boolean
isAffineNonTrivial
(
double
[][]
affine
)
{
if
(
affine
==
null
)
{
return
false
;
}
return
(
affine
[
0
][
0
]
!=
1.0
)
||
(
affine
[
0
][
1
]
!=
0.0
)
||
(
affine
[
0
][
2
]
!=
0.0
)
||
(
affine
[
1
][
0
]
!=
0.0
)
||
(
affine
[
1
][
1
]
!=
1.0
)
||
(
affine
[
1
][
2
]
!=
0.0
);
}
public
boolean
isAffineNonTrivial
()
{
return
isAffineNonTrivial
(
this
.
affine
);
}
public
PairwiseOrthoMatch
getMatch
(
String
name
)
{
...
...
@@ -252,7 +264,8 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
}
public
int
getOriginalZoomLevel
()
{
return
orig_zoom_level
;
return
getImage
().
getZoomLevel
();
// image, not altitude!
// return orig_zoom_level;
}
// Generate ALT image path from the GEO
public
static
String
getAltPath
(
String
path
)
{
...
...
@@ -285,7 +298,7 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
*/
public
int
getNumberScenes
()
{
if
(
num_scenes
<
0
)
{
String
merged_path
=
getLatestFilePath
(
MERGED_SUFFIX
);
String
merged_path
=
getLatestFilePath
(
MERGED_SUFFIX
);
if
(
merged_path
!=
null
)
{
ImagePlus
imp_merged
=
new
ImagePlus
(
merged_path
);
if
(
imp_merged
.
getWidth
()
>
0
)
{
...
...
@@ -494,7 +507,7 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
// initialize and read Exif for the images
orig_image
=
new
FloatImageData
(
path
);
dt
=
orig_image
.
getDT
();
//
dt = orig_image.getDT();
/*
Properties imp_prop = null;
...
...
@@ -551,7 +564,7 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
return
false
;
}
orig_image
=
new
FloatImageData
(
path
);
dt
=
orig_image
.
getDT
();
//
dt = orig_image.getDT();
}
if
(
alt_image
!=
null
)
{
String
alt_path
=
getAltPath
(
path
);
...
...
@@ -577,7 +590,7 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
return
null
;
}
orig_image
=
new
FloatImageData
(
path
);
dt
=
orig_image
.
getDT
();
//
dt = orig_image.getDT();
}
return
orig_image
;
}
...
...
@@ -654,7 +667,8 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
return
ts
;
}
public
LocalDateTime
getLocalDateTime
()
{
return
dt
;
return
getImage
().
getDT
();
// return dt;
}
public
String
getName
()
{
...
...
@@ -974,11 +988,11 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
return
false
;
}
if
(!
orig_image
.
isZoomValid
())
{
System
.
out
.
println
(
"Original zoom level is invalid, need_extra_zoom = "
+
need_extra_zoom
);
System
.
out
.
println
(
"Original zoom level is invalid, need_extra_zoom = "
+
orig_image
.
needZoomIn
()
);
return
false
;
}
if
(
zoom_level
>
orig_image
.
getZoomLevel
())
{
System
.
out
.
println
(
"Requested zoom level is too high ("
+
zoom_level
+
" > "
+
orig_
zoom_level
+
")"
);
System
.
out
.
println
(
"Requested zoom level is too high ("
+
zoom_level
+
" > "
+
orig_
image
.
getZoomLevel
()
+
")"
);
return
false
;
}
if
(
images
.
get
(
zoom_level
)
!=
null
)
{
...
...
@@ -1085,7 +1099,7 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
final
float
[]
felev
=
src_elev
.
readFData
();
final
double
[]
elev
=
new
double
[
tilesX
*
tilesY
];
Arrays
.
fill
(
elev
,
Double
.
NaN
);
final
int
diff_zoom_lev
=
zoom_level
-
orig_zoom_level
;
final
int
diff_zoom_lev
=
zoom_level
-
getAlt
().
getZoomLevel
();
//
orig_zoom_level;
final
double
scale
=
1.0
/
getScale
(
diff_zoom_lev
);
// int zoom_lev);
final
Thread
[]
threads
=
ImageDtt
.
newThreadArray
();
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
View file @
7f9773fb
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/orthomosaic/PairwiseOrthoMatch.java
View file @
7f9773fb
...
...
@@ -32,20 +32,61 @@ import Jama.Matrix;
public
class
PairwiseOrthoMatch
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
public
static
boolean
READ_NO_ALT
=
false
;
// to read old format w/o alt data ( not final!)
private
double
[][]
affine
=
new
double
[
2
][
3
];
// public static boolean READ_NO_ALT = false; // to read old format w/o alt data ( not final!)
private
double
[][]
affine
=
new
double
[
2
][
3
];
public
int
zoom_lev
;
public
double
rms
=
Double
.
NaN
;
public
double
overlap
=
0.0
;
public
double
[]
alt_data
=
null
;
public
double
[]
equalize1to0
=
{
1
,
0
};
// value1 = equalize2to1[0]*value2+equalize2to1[1]
public
double
[]
quat
=
null
;
// relative orientation of the second scene (ERS affine removed). Will be eventually saved
public
double
[][]
qaffine
=
null
;
// affine relative to rotated scenes
// real transient
public
transient
double
[][]
jtj
=
new
double
[
6
][
6
];
public
int
zoom_lev
;
public
double
rms
=
Double
.
NaN
;
public
transient
double
overlap
=
0.0
;
public
transient
double
[]
alt_data
=
null
;
public
transient
double
[]
equalize1to0
=
{
1
,
0
};
// value1 = equalize2to1[0]*value2+equalize2to1[1]
public
transient
double
[]
quat
=
null
;
// relative orientation of the second scene (ERS affine removed). Will be eventually saved
public
transient
double
[][]
qaffine
=
null
;
// affine relative to rotated scenes
// below - not saved/restored
public
transient
boolean
ok
=
false
;
// not saved/restored
public
transient
int
[]
nxy
=
null
;
// not saved, just to communicate for logging
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
oos
.
defaultWriteObject
();
for
(
int
i
=
0
;
i
<
jtj
.
length
;
i
++)
{
for
(
int
j
=
i
;
j
<
jtj
[
i
].
length
;
j
++)
{
oos
.
writeObject
(
jtj
[
i
][
j
]);
}
}
// oos.writeObject(overlap);
// oos.writeObject(equalize1to0);
// oos.writeObject(alt_data);
// oos.writeObject(quat);
// oos.writeObject(qaffine);
}
private
void
readObject
(
ObjectInputStream
ois
)
throws
ClassNotFoundException
,
IOException
{
ois
.
defaultReadObject
();
jtj
=
new
double
[
6
][
6
];
// readObject does not use constructor!
for
(
int
i
=
0
;
i
<
jtj
.
length
;
i
++)
{
for
(
int
j
=
i
;
j
<
jtj
[
i
].
length
;
j
++)
{
jtj
[
i
][
j
]
=
(
Double
)
ois
.
readObject
();
if
(
j
>
i
)
{
jtj
[
j
][
i
]
=
jtj
[
i
][
j
];
}
}
}
// overlap = (Double) ois.readObject();
// equalize1to0 = new double[] {1,0};
// equalize1to0 = (double[]) ois.readObject();
// if (!READ_NO_ALT) {
// alt_data = (double[]) ois.readObject();
// }
// if (OrthoMapsCollection.CURRENT_VERSION >= OrthoMapsCollection.VERSION_POST_ORIENT) {
quat
=
(
double
[])
ois
.
readObject
();
qaffine
=
(
double
[][])
ois
.
readObject
();
// }
}
public
double
[]
getQuaternion
()
{
return
quat
;
}
...
...
@@ -95,6 +136,11 @@ public class PairwiseOrthoMatch implements Serializable {
public
boolean
isDefined
()
{
return
affine
!=
null
;
}
public
boolean
isAffineNonTrivial
()
{
return
OrthoMap
.
isAffineNonTrivial
(
this
.
affine
);
}
public
double
[]
getEqualize2to1
()
{
return
equalize1to0
;
}
...
...
@@ -298,42 +344,5 @@ public class PairwiseOrthoMatch implements Serializable {
this
.
affine
=
affine
;
}
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
oos
.
defaultWriteObject
();
for
(
int
i
=
0
;
i
<
jtj
.
length
;
i
++)
{
for
(
int
j
=
i
;
j
<
jtj
[
i
].
length
;
j
++)
{
oos
.
writeObject
(
jtj
[
i
][
j
]);
}
}
oos
.
writeObject
(
overlap
);
oos
.
writeObject
(
equalize1to0
);
oos
.
writeObject
(
alt_data
);
oos
.
writeObject
(
quat
);
oos
.
writeObject
(
qaffine
);
}
private
void
readObject
(
ObjectInputStream
ois
)
throws
ClassNotFoundException
,
IOException
{
ois
.
defaultReadObject
();
jtj
=
new
double
[
6
][
6
];
// readObject does not use constructor!
for
(
int
i
=
0
;
i
<
jtj
.
length
;
i
++)
{
for
(
int
j
=
i
;
j
<
jtj
[
i
].
length
;
j
++)
{
jtj
[
i
][
j
]
=
(
Double
)
ois
.
readObject
();
if
(
j
>
i
)
{
jtj
[
j
][
i
]
=
jtj
[
i
][
j
];
}
}
}
overlap
=
(
Double
)
ois
.
readObject
();
// equalize1to0 = new double[] {1,0};
equalize1to0
=
(
double
[])
ois
.
readObject
();
if
(!
READ_NO_ALT
)
{
alt_data
=
(
double
[])
ois
.
readObject
();
}
if
(
OrthoMapsCollection
.
CURRENT_VERSION
>=
OrthoMapsCollection
.
VERSION_POST_ORIENT
)
{
quat
=
(
double
[])
ois
.
readObject
();
qaffine
=
(
double
[][])
ois
.
readObject
();
}
}
//private void readObjectNoData() throws ObjectStreamException; // used to modify default values
}
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