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
f7200d40
Commit
f7200d40
authored
Sep 06, 2024
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
continue refactoring, migrating to more flexible ortho code
parent
c5431a27
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
277 additions
and
30 deletions
+277
-30
ComboMatch.java
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
+10
-5
ModelRegex.java
src/main/java/com/elphel/imagej/orthomosaic/ModelRegex.java
+126
-0
OrthoMap.java
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
+18
-8
OrthoMapsCollection.java
...va/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
+123
-17
No files found.
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
View file @
f7200d40
...
...
@@ -53,6 +53,7 @@ public class ComboMatch {
public
static
int
gpu_max_width
=
4096
;
public
static
int
gpu_max_height
=
4096
;
public
static
String
[]
FILES_LISTS_PATHS
=
{
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/nov3_50-75-orange"
,
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/nov3_50-75"
,
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_sep12-13_50-25-50-75-100m"
,
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_19_sep13_25-50-75-100m"
,
...
...
@@ -176,8 +177,8 @@ public class ComboMatch {
boolean
use_saved_collection
=
true
;
// false;
boolean
save_collection
=
true
;
boolean
use_saved_collection
=
false
;
//
true; // false;
boolean
save_collection
=
false
;
//
true;
boolean
process_correlation
=
true
;
// use false to save new version of data
int
num_tries_fit
=
10
;
boolean
update_match
=
true
;
// use false to save new version of data
...
...
@@ -190,6 +191,7 @@ public class ComboMatch {
boolean
restore_temp
=
true
;
double
frac_remove
=
clt_parameters
.
imp
.
pmtch_frac_remove
;
// 0.15;
double
metric_error
=
clt_parameters
.
imp
.
pmtch_metric_err
;
// 0.05; // 0.02;// 2 cm
boolean
update_files
=
false
;
boolean
update_lla
=
false
;
// re-read file metadata
boolean
update_kernel_patterns
=
false
;
boolean
update_bl_bc
=
false
;
...
...
@@ -248,6 +250,7 @@ public class ComboMatch {
if
(
use_marked_image
)
{
gd
.
addCheckbox
(
"Use marked image data"
,
true
,
"Use markes from the selected image"
);
}
gd
.
addCheckbox
(
"Update scene files"
,
update_files
,
"Re-read files as specified in .list file, possibly changing versions"
);
gd
.
addCheckbox
(
"Update files metadata"
,
update_lla
,
"Re-read files metadata (if it was modified)"
);
gd
.
addCheckbox
(
"Update kernels/patterns"
,
update_kernel_patterns
,
"Re-read kernels and patterns from *.list file"
);
gd
.
addCheckbox
(
"Remove duplicate scenes"
,
fix_duplicates
,
"Remove scenes with the same timestamp"
);
...
...
@@ -304,6 +307,7 @@ public class ComboMatch {
if
(
use_marked_image
)
{
// will only be used if found and asked
use_marked_image
=
gd
.
getNextBoolean
();
}
update_files
=
gd
.
getNextBoolean
();
update_lla
=
gd
.
getNextBoolean
();
update_kernel_patterns
=
gd
.
getNextBoolean
();
fix_duplicates
=
gd
.
getNextBoolean
();
...
...
@@ -321,8 +325,6 @@ public class ComboMatch {
}
catch
(
ClassNotFoundException
|
IOException
e
)
{
use_files_list
=
true
;
System
.
out
.
println
(
"Saved data not found: "
+
orthoMapsCollection_path
+
", building from a list "
+
files_list_path
);
// TODO Auto-generated catch block
// e.printStackTrace();
}
//files_list_path
if
(!
use_files_list
)
{
...
...
@@ -330,12 +332,15 @@ public class ComboMatch {
maps_collection
.
updateKernels
(
files_list_path
);
maps_collection
.
updatePatterns
(
files_list_path
);
}
if
(
update_files
)
{
maps_collection
.
updateFiles
(
files_list_path
);
}
}
}
else
{
use_files_list
=
true
;
}
if
(
use_files_list
)
{
// using files list
maps_collection
=
new
OrthoMapsCollection
(
files_list_path
);
// should have ".list" extension
maps_collection
=
new
OrthoMapsCollection
(
files_list_path
,
null
);
// should have ".list" extension
maps_collection
.
updateNumberScenes
();
maps_collection
.
updateSfmGain
();
}
...
...
src/main/java/com/elphel/imagej/orthomosaic/ModelRegex.java
0 → 100644
View file @
f7200d40
package
com
.
elphel
.
imagej
.
orthomosaic
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.ObjectInputStream
;
import
java.io.ObjectOutputStream
;
import
java.io.Serializable
;
import
java.nio.file.attribute.FileTime
;
import
java.text.SimpleDateFormat
;
import
java.time.Instant
;
import
java.time.LocalDateTime
;
import
java.time.ZoneId
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Arrays
;
import
java.util.Calendar
;
import
java.util.Collection
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.regex.Pattern
;
import
ij.Prefs
;
public
class
ModelRegex
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
public
String
name
;
public
String
regex
;
public
LocalDateTime
start_date
;
public
LocalDateTime
end_date
;
public
ModelRegex
(
String
name
,
String
regex
,
LocalDateTime
start_date
,
LocalDateTime
end_date
)
{
this
.
name
=
name
;
this
.
regex
=
regex
;
this
.
start_date
=
start_date
;
this
.
end_date
=
end_date
;
}
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
oos
.
defaultWriteObject
();
}
private
void
readObject
(
ObjectInputStream
ois
)
throws
ClassNotFoundException
,
IOException
{
ois
.
defaultReadObject
();
}
public
String
replaceByFilter
(
String
path
)
{
String
model_path
=
OrthoMap
.
getModelPathFromPath
(
path
);
File
model_dir
=
(
new
File
(
model_path
));
// .getParentFile();
if
(!
model_dir
.
exists
()
||
!
model_dir
.
isDirectory
())
{
return
null
;
}
File
[]
files
=
model_dir
.
listFiles
();
boolean
[]
matches
=
new
boolean
[
files
.
length
];
int
num_matches
=
0
;
Pattern
filename_pattern
=
Pattern
.
compile
(
regex
);
int
latest
=-
1
;
LocalDateTime
[]
dts
=
new
LocalDateTime
[
files
.
length
];
for
(
int
i
=
0
;
i
<
files
.
length
;
i
++)
if
(
files
[
i
].
isFile
()){
long
fileLastModifiedDate
=
files
[
i
].
lastModified
();
dts
[
i
]
=
Instant
.
ofEpochMilli
(
fileLastModifiedDate
).
atZone
(
ZoneId
.
systemDefault
()).
toLocalDateTime
();
if
((
start_date
!=
null
)
&&
dts
[
i
].
isBefore
(
start_date
)){
continue
;
// too early
}
if
((
end_date
!=
null
)
&&
dts
[
i
].
isAfter
(
end_date
)){
continue
;
// too late
}
if
(!
filename_pattern
.
matcher
(
files
[
i
].
getName
()).
matches
())
{
continue
;
// does not match
}
matches
[
i
]
=
true
;
num_matches
++;
if
((
latest
<
0
)
||
dts
[
i
].
isAfter
(
dts
[
latest
]))
{
latest
=
i
;
}
}
if
(
num_matches
>
1
)
{
System
.
out
.
println
(
"dir="
+
model_dir
+
", num_matches="
+
num_matches
);
}
if
(
latest
>=
0
)
{
//Prefs.getFileSeparator()
return
model_path
+
Prefs
.
getFileSeparator
()+
files
[
latest
].
getName
();
}
// find latest
return
null
;
}
public
static
String
[]
removeDuplicatesSort
(
String
[]
paths
)
{
HashMap
<
String
,
String
>
scene_files
=
new
HashMap
<
String
,
String
>();
DateTimeFormatter
formatter
=
DateTimeFormatter
.
ofPattern
(
"MM/dd/yyyy HH:mm:ss.SS zzz"
);
// may be VV instead of zzz
for
(
int
i
=
0
;
i
<
paths
.
length
;
i
++)
{
String
sts
=
OrthoMap
.
getNameFromPath
(
paths
[
i
]);
String
model_dir
=
OrthoMap
.
getModelPathFromPath
(
paths
[
i
]);
if
(
scene_files
.
containsKey
(
sts
))
{
String
path_old
=
scene_files
.
get
(
sts
);
long
old_date
=
(
new
File
(
path_old
)).
lastModified
();
long
new_date
=
(
new
File
(
paths
[
i
])).
lastModified
();
boolean
replace
=
new_date
>
old_date
;
LocalDateTime
old_dt
=
Instant
.
ofEpochMilli
(
old_date
).
atZone
(
ZoneId
.
systemDefault
()).
toLocalDateTime
();
LocalDateTime
new_dt
=
Instant
.
ofEpochMilli
(
new_date
).
atZone
(
ZoneId
.
systemDefault
()).
toLocalDateTime
();
System
.
out
.
println
(
"Duplicate scene found: "
+
sts
+
" in two files:"
);
System
.
out
.
println
(
"1: "
+
path_old
+
" @ "
+
old_dt
.
atZone
(
ZoneId
.
systemDefault
()).
format
(
formatter
));
System
.
out
.
println
(
"2: "
+
paths
[
i
]+
" @ "
+
new_dt
.
atZone
(
ZoneId
.
systemDefault
()).
format
(
formatter
));
System
.
out
.
println
(
"Using "
+(
replace
?
2
:
1
)
+
" as it is not older"
);
if
(
replace
)
{
scene_files
.
put
(
sts
,
paths
[
i
]);
}
}
else
{
scene_files
.
put
(
sts
,
paths
[
i
]);
}
}
// assuming string ts have the same order as double timestamps
String
[]
filtered_ts
=
scene_files
.
keySet
().
toArray
(
new
String
[
0
]);
Arrays
.
sort
(
filtered_ts
);
String
[]
filtered_paths
=
new
String
[
filtered_ts
.
length
];
for
(
int
i
=
0
;
i
<
filtered_paths
.
length
;
i
++)
{
filtered_paths
[
i
]
=
scene_files
.
get
(
filtered_ts
[
i
]);
}
return
filtered_paths
;
}
}
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
View file @
f7200d40
...
...
@@ -588,17 +588,22 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
*/
public
FloatImageData
getAlt
()
{
if
(
alt_image
==
null
)
{
String
alt_path
=
getAltPath
(
path
);
File
alt_file
=
new
File
(
alt_path
);
if
(!
alt_file
.
exists
())
{
System
.
out
.
println
(
"Altitudes file does not exist: "
+
alt_path
);
return
null
;
}
alt_image
=
new
FloatImageData
(
alt_path
);
alt_image
=
getAlt
(
path
);
// img path, not alt
}
return
orig
_image
;
return
alt
_image
;
}
public
static
FloatImageData
getAlt
(
String
img_path
)
{
String
alt_path
=
getAltPath
(
img_path
);
File
alt_file
=
new
File
(
alt_path
);
if
(!
alt_file
.
exists
())
{
System
.
out
.
println
(
"Altitudes file does not exist: "
+
alt_path
);
return
null
;
}
return
new
FloatImageData
(
alt_path
);
}
/*
public OrthoMap (
String path) {
...
...
@@ -676,6 +681,11 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
public
void
setAffine
(
double
[][]
affine
)
{
this
.
affine
=
new
double
[][]
{
affine
[
0
].
clone
(),
affine
[
1
].
clone
()};
}
public
void
setAffine
()
{
this
.
affine
=
new
double
[][]
{{
1
,
0
,
0
},{
0
,
1
,
0
}};
}
public
double
[][]
getAffine
(){
return
affine
;
}
...
...
src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
View file @
f7200d40
...
...
@@ -86,10 +86,13 @@ public class OrthoMapsCollection implements Serializable{
public
static
final
String
[]
NAME_MO
=
{
"main"
,
"other"
};
public
transient
long
version
=
-
1
;
OrthoMap
[]
ortho_maps
;
// remove some transients
transient
HashMap
<
Double
,
Integer
>
map_index
;
transient
HashMap
<
String
,
Integer
>
map_index_string
;
transient
ArrayList
<
AltitudeMismatchKernel
>
kernels
;
transient
ArrayList
<
GroundObjectPattern
>
patterns
;
transient
HashMap
<
String
,
ModelRegex
>
model_regexes
;
transient
String
current_model_regex
=
""
;
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
// ?
...
...
@@ -114,38 +117,121 @@ public class OrthoMapsCollection implements Serializable{
}
public
OrthoMapsCollection
(
String
path
)
{
String
path
,
// lit file
OrthoMapsCollection
orthoMapsCollection
)
{
// if null will create new, if not null - will update other
if
(
path
.
endsWith
(
".list"
))
{
String
[]
scenes0
=
new
String
[
1
];
//
String[] scenes0 = new String[1];
kernels
=
new
ArrayList
<
AltitudeMismatchKernel
>();
patterns
=
new
ArrayList
<
GroundObjectPattern
>();
model_regexes
=
new
HashMap
<
String
,
ModelRegex
>();
String
[]
regex_use_p
=
new
String
[
1
];
String
[]
paths
=
getPathsAndScenesFromSourceList
(
path
,
scenes0
,
kernels
,
// ArrayList<AltitudeMismatchKernel> kernels,
patterns
);
// ArrayList<GroundObjectPattern> patterns);
String
scenes_path
=
scenes0
[
0
];
double
[][]
affine
=
{{
1
,
0
,
0
},{
0
,
1
,
0
}};
// maybe later calculate from mage_enuatr
null
,
// scenes0,
kernels
,
// ArrayList<AltitudeMismatchKernel> kernels,
patterns
,
// ArrayList<GroundObjectPattern> patterns);
model_regexes
,
// ArrayList<ModelRegex> model_regexes,
regex_use_p
);
// String [] regex_use) {
current_model_regex
=
regex_use_p
[
0
];
paths
=
ModelRegex
.
removeDuplicatesSort
(
paths
);
String
[]
orig_paths
=
paths
.
clone
();
boolean
[]
replaced
=
new
boolean
[
paths
.
length
];
if
(
current_model_regex
!=
null
)
{
ModelRegex
regex
=
model_regexes
.
get
(
current_model_regex
);
int
num_replaced
=
0
;
int
num_changed
=
0
;
if
(
regex
!=
null
)
{
for
(
int
i
=
0
;
i
<
paths
.
length
;
i
++)
{
String
replacement
=
regex
.
replaceByFilter
(
paths
[
i
]);
if
(
replacement
!=
null
)
{
paths
[
i
]
=
replacement
;
replaced
[
i
]
=
true
;
num_replaced
++;
if
(!
replacement
.
equals
(
orig_paths
[
i
]))
{
num_changed
++;
}
}
}
System
.
out
.
println
(
String
.
format
(
"Replacing with regex \"%s\" (%s)"
,
regex
.
name
,
regex
.
regex
));
System
.
out
.
println
(
String
.
format
(
"Replaced %d files (of %d), changed %d."
,
num_replaced
,
paths
.
length
,
num_changed
));
}
else
{
System
.
out
.
println
(
"Replacement regex \""
+
current_model_regex
+
"\" does not exist"
);
}
}
// String scenes_path = scenes0[0]; // not used!
ArrayList
<
String
>
new_paths
=
new
ArrayList
<
String
>();
if
(
orthoMapsCollection
!=
null
)
{
// 1. update existing maps
for
(
int
i
=
0
;
i
<
paths
.
length
;
i
++)
{
String
name
=
OrthoMap
.
getNameFromPath
(
paths
[
i
]);
int
indx
=
orthoMapsCollection
.
getIndex
(
name
);
if
(
indx
>=
0
)
{
OrthoMap
omap
=
orthoMapsCollection
.
ortho_maps
[
indx
];
omap
.
orig_image
=
new
FloatImageData
(
path
);
// always replace (nothing to preserve
omap
.
dt
=
omap
.
orig_image
.
getDT
();
// just in case?
// see if alt image is already initialized
if
(
omap
.
alt_image
!=
null
)
{
FloatImageData
alt_image
=
OrthoMap
.
getAlt
(
path
);
if
(
alt_image
!=
null
)
{
omap
.
alt_image
=
alt_image
;
}
else
{
System
.
out
.
println
(
"New altitude file does not exist, keeping old one: "
+
omap
.
alt_image
.
path
);
}
}
}
else
{
new_paths
.
add
(
paths
[
i
]);
}
}
// 2. add new maps (none will be removed)
if
(!
new_paths
.
isEmpty
())
{
// need to create new maps, increase orthoMapsCollection.ortho_maps, reorder and reindex it
int
num_old_maps
=
orthoMapsCollection
.
ortho_maps
.
length
;
int
num_new_maps
=
new_paths
.
size
();
ortho_maps
=
new
OrthoMap
[
num_old_maps
+
num_new_maps
];
System
.
arraycopy
(
orthoMapsCollection
.
ortho_maps
,
0
,
ortho_maps
,
0
,
num_old_maps
);
int
map_index
=
num_old_maps
;
for
(
String
scene_path:
new_paths
)
{
ortho_maps
[
map_index
]
=
new
OrthoMap
(
scene_path
);
// , scene_path);
ortho_maps
[
map_index
++].
setAffine
();
}
Arrays
.
sort
(
ortho_maps
);
// mixed old+new, previous scene numbers will no longer be valui
orthoMapsCollection
.
ortho_maps
=
ortho_maps
;
orthoMapsCollection
.
reindex
();
}
else
{
System
.
out
.
println
(
"No new scenes added"
);
}
return
;
// Constructed this should not be used, only the old orthoMapsCollection
}
ortho_maps
=
new
OrthoMap
[
paths
.
length
];
for
(
int
n
=
0
;
n
<
ortho_maps
.
length
;
n
++)
{
String
name
=
OrthoMap
.
getNameFromPath
(
paths
[
n
]);
ortho_maps
[
n
]
=
new
OrthoMap
(
paths
[
n
]);
// , scene_path);
ortho_maps
[
n
].
setAffine
(
affine
);
ortho_maps
[
n
].
setAffine
();
}
Arrays
.
sort
(
ortho_maps
);
reindex
();
}
else
{
System
.
out
.
println
(
"OrthoMapsCollection(): path should end with \".list\""
);
}
Arrays
.
sort
(
ortho_maps
);
reindex
();
}
public
static
double
[][]
unityAffine
()
{
return
new
double
[][]
{{
1
,
0
,
0
},{
0
,
1
,
0
}};
}
public
void
updateFiles
(
String
path
)
{
if
(
path
.
endsWith
(
".list"
))
{
new
OrthoMapsCollection
(
path
,
this
);
// will update this instead of creating a new instance
}
else
{
System
.
out
.
println
(
"updateFiles(): path should end with \".list\""
);
}
}
// add update kernels, update patterns
public
void
updateKernels
(
String
path
)
{
...
...
@@ -155,7 +241,9 @@ public class OrthoMapsCollection implements Serializable{
path
,
null
,
kernels
,
// ArrayList<AltitudeMismatchKernel> kernels,
null
);
// ArrayList<GroundObjectPattern> patterns);
null
,
// ArrayList<GroundObjectPattern> patterns);
null
,
// ArrayList<ModelRegex> model_regexes,
null
);
// String [] regex_use) {
}
else
{
System
.
out
.
println
(
"updateKernels(): path should end with \".list\""
);
}
...
...
@@ -169,7 +257,10 @@ public class OrthoMapsCollection implements Serializable{
path
,
null
,
null
,
// ArrayList<AltitudeMismatchKernel> kernels,
patterns
);
// ArrayList<GroundObjectPattern> patterns);
patterns
,
// ArrayList<GroundObjectPattern> patterns);
null
,
// ArrayList<ModelRegex> model_regexes,
null
);
// String [] regex_use) {
}
else
{
System
.
out
.
println
(
"updatePatterns(): path should end with \".list\""
);
}
...
...
@@ -269,7 +360,9 @@ public class OrthoMapsCollection implements Serializable{
String
files_list
,
String
[]
scenes0
,
ArrayList
<
AltitudeMismatchKernel
>
kernels
,
ArrayList
<
GroundObjectPattern
>
patterns
)
{
ArrayList
<
GroundObjectPattern
>
patterns
,
HashMap
<
String
,
ModelRegex
>
model_regexes
,
String
[]
regex_use
)
{
List
<
String
>
lines
;
List
<
String
>
rel_files
=
new
ArrayList
<
String
>();
Path
seq_path
=
Paths
.
get
(
files_list
);
...
...
@@ -311,6 +404,19 @@ public class OrthoMapsCollection implements Serializable{
tokens
[
3
],
LocalDateTime
.
parse
(
tokens
[
4
])));
}
}
else
if
((
tokens
.
length
>
0
)
&&
(
tokens
[
0
].
toUpperCase
().
equals
(
"REGEX"
)))
{
if
((
model_regexes
!=
null
)
&&
(
tokens
.
length
>
4
))
{
model_regexes
.
put
(
tokens
[
1
],
new
ModelRegex
(
tokens
[
1
],
// String name,
tokens
[
2
],
// String regex,
LocalDateTime
.
parse
(
tokens
[
3
]),
// LocalDateTime start_date,
LocalDateTime
.
parse
(
tokens
[
4
])));
// LocalDateTime end_date);
}
}
else
if
((
tokens
.
length
>
0
)
&&
(
tokens
[
0
].
toUpperCase
().
equals
(
"REGEX_USE"
)))
{
if
((
regex_use
!=
null
)
&&
(
tokens
.
length
>
1
))
{
regex_use
[
0
]
=
tokens
[
1
];
}
}
else
if
((
tokens
.
length
==
1
)
&&
(
tokens
[
0
].
length
()
>
0
))
{
rel_files
.
add
(
tokens
[
0
]);
}
...
...
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