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
8667ae4b
Commit
8667ae4b
authored
Mar 14, 2024
by
Andrey Filippov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Object matching in different flights
parent
02845a72
Changes
8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1441 additions
and
137 deletions
+1441
-137
Eyesis_Correction.java
.../java/com/elphel/imagej/correction/Eyesis_Correction.java
+3
-1
AltitudeMismatchKernel.java
...com/elphel/imagej/orthomosaic/AltitudeMismatchKernel.java
+72
-0
ComboMatch.java
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
+50
-34
FineXYCorr.java
src/main/java/com/elphel/imagej/orthomosaic/FineXYCorr.java
+4
-3
GroundObjectPattern.java
...va/com/elphel/imagej/orthomosaic/GroundObjectPattern.java
+105
-0
ObjectLocation.java
...in/java/com/elphel/imagej/orthomosaic/ObjectLocation.java
+6
-0
OrthoMap.java
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
+543
-76
OrthoMapsCollection.java
...va/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
+658
-23
No files found.
src/main/java/com/elphel/imagej/correction/Eyesis_Correction.java
View file @
8667ae4b
...
@@ -849,6 +849,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
...
@@ -849,6 +849,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
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 Pairs"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Ortho Pairs"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Extract Objects"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Mismatched resolutions"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Mismatched resolutions"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Generate DATI"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Generate DATI"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Create mine"
,
panelLWIRWorld
,
color_process
);
addButton
(
"Create mine"
,
panelLWIRWorld
,
color_process
);
...
@@ -5708,7 +5709,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
...
@@ -5708,7 +5709,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
// ComboMatch.testReadTiff();
// ComboMatch.testReadTiff();
}
else
if
(
label
.
equals
(
"Ortho Pairs"
))
{
}
else
if
(
label
.
equals
(
"Ortho Pairs"
)
||
label
.
equals
(
"Extract Objects"
)
)
{
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
)
{
...
@@ -5729,6 +5730,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener {
...
@@ -5729,6 +5730,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
(
"Extract Objects"
),
// boolean extract_mines,
DEBUG_LEVEL
);
DEBUG_LEVEL
);
}
else
if
(
label
.
equals
(
"Test video"
))
{
}
else
if
(
label
.
equals
(
"Test video"
))
{
ImagePlus
imp_sel
=
WindowManager
.
getCurrentImage
();
ImagePlus
imp_sel
=
WindowManager
.
getCurrentImage
();
...
...
src/main/java/com/elphel/imagej/orthomosaic/AltitudeMismatchKernel.java
0 → 100644
View file @
8667ae4b
package
com
.
elphel
.
imagej
.
orthomosaic
;
import
java.io.IOException
;
import
java.io.ObjectInputStream
;
import
java.io.ObjectOutputStream
;
import
java.io.Serializable
;
import
java.util.ArrayList
;
import
ij.Prefs
;
public
class
AltitudeMismatchKernel
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
public
static
String
kernels_directory
;
public
int
zoom_level
;
public
double
agl_from
;
public
double
agl_to
;
public
String
filename
;
public
AltitudeMismatchKernel
(
String
filename
,
int
zoom_level
,
double
agl_from
,
double
agl_to
)
{
this
.
filename
=
filename
;
this
.
zoom_level
=
zoom_level
;
this
.
agl_from
=
agl_from
;
this
.
agl_to
=
agl_to
;
}
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
oos
.
defaultWriteObject
();
}
private
void
readObject
(
ObjectInputStream
ois
)
throws
ClassNotFoundException
,
IOException
{
ois
.
defaultReadObject
();
}
public
static
void
setKernelsDirectory
(
String
directory
)
{
while
(
directory
.
endsWith
(
Prefs
.
getFileSeparator
())){
directory
=
directory
.
substring
(
0
,
directory
.
length
()-
1
);
}
kernels_directory
=
directory
;
}
public
static
String
getKernelsDirectory
()
{
return
kernels_directory
;
}
public
String
getKernelPath
()
{
return
kernels_directory
+
Prefs
.
getFileSeparator
()+
filename
;
}
public
static
AltitudeMismatchKernel
getKernel
(
int
zoom_level
,
double
agl_from
,
double
agl_to
,
ArrayList
<
AltitudeMismatchKernel
>
kernels
)
{
double
tolerance
=
0.15
;
double
agl_from_min
=
agl_from
*
(
1.0
-
tolerance
);
double
agl_from_max
=
agl_from
*
(
1.0
+
tolerance
);
double
agl_to_min
=
agl_to
*
(
1.0
-
tolerance
);
double
agl_to_max
=
agl_to
*
(
1.0
+
tolerance
);
for
(
AltitudeMismatchKernel
kernel:
kernels
)
{
if
(
zoom_level
==
kernel
.
zoom_level
)
{
if
(
(
kernel
.
agl_from
>=
agl_from_min
)
&&
(
kernel
.
agl_from
<=
agl_from_max
)
&&
(
kernel
.
agl_to
>=
agl_to_min
)
&&
(
kernel
.
agl_to
<=
agl_to_max
))
return
kernel
;
}
}
return
null
;
}
}
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java
View file @
8667ae4b
...
@@ -46,6 +46,7 @@ public class ComboMatch {
...
@@ -46,6 +46,7 @@ public class ComboMatch {
public
static
boolean
openTestPairGps
(
public
static
boolean
openTestPairGps
(
CLTParameters
clt_parameters
,
CLTParameters
clt_parameters
,
GPUTileProcessor
gpu_tile_processor
,
// initialized by the caller
GPUTileProcessor
gpu_tile_processor
,
// initialized by the caller
boolean
extract_mines
,
int
debugLevel
)
{
int
debugLevel
)
{
GPU_TILE_PROCESSOR
=
gpu_tile_processor
;
GPU_TILE_PROCESSOR
=
gpu_tile_processor
;
PairwiseOrthoMatch
pairwiseOrthoMatch
=
null
;
PairwiseOrthoMatch
pairwiseOrthoMatch
=
null
;
...
@@ -85,11 +86,13 @@ public class ComboMatch {
...
@@ -85,11 +86,13 @@ public class ComboMatch {
// String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_19_sep13_25-50-75-100m.list";
// String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_19_sep13_25-50-75-100m.list";
// String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_19_sep13_25-50-75-100m.data";
// String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_19_sep13_25-50-75-100m.data";
String
[]
files_lists_paths
=
{
String
[]
files_lists_paths
=
{
"/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"
,
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_19_sep13_25-50-75-100m"
,
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_nov3_50-75"
};
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_nov3_50-75"
,
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_sep12-50m"
};
String
files_list_path
=
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_nov3_50-75.list"
;
//
String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_nov3_50-75.list";
String
orthoMapsCollection_path
=
"/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_nov3_50-75.data"
;
//
String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_nov3_50-75.data";
//maps_nov3_50-75
//maps_nov3_50-75
//maps_19_sep13.list
//maps_19_sep13.list
//maps_09_short.list
//maps_09_short.list
...
@@ -133,10 +136,16 @@ public class ComboMatch {
...
@@ -133,10 +136,16 @@ public class ComboMatch {
boolean
process_correlation
=
true
;
// use false to save new version of data
boolean
process_correlation
=
true
;
// use false to save new version of data
boolean
update_match
=
true
;
// use false to save new version of data
boolean
update_match
=
true
;
// use false to save new version of data
boolean
render_match
=
true
;
boolean
render_match
=
true
;
boolean
restore_temp
=
true
;
boolean
pattern_match
=
false
;
boolean
bounds_to_indices
=
true
;
int
temp_mode
=
1
;
boolean
restore_temp
=
true
;
double
frac_remove
=
0.15
;
double
frac_remove
=
0.15
;
double
metric_error
=
0.05
;
// 0.02;// 2 cm
double
metric_error
=
0.05
;
// 0.02;// 2 cm
boolean
update_lla
=
false
;
// re-read file metadata
boolean
update_lla
=
false
;
// re-read file metadata
boolean
update_kernel_patterns
=
false
;
if
(!
use_marked_image
)
{
if
(!
use_marked_image
)
{
process_correlation
=
false
;
// use already adjusted by default
process_correlation
=
false
;
// use already adjusted by default
}
}
...
@@ -149,6 +158,13 @@ public class ComboMatch {
...
@@ -149,6 +158,13 @@ public class ComboMatch {
gd
.
addCheckbox
(
"Process correlations"
,
process_correlation
,
"false to skip to just regenerate new save file."
);
gd
.
addCheckbox
(
"Process correlations"
,
process_correlation
,
"false to skip to just regenerate new save file."
);
gd
.
addCheckbox
(
"Update match if calculated"
,
update_match
,
"Will update correlation match for a pair if found."
);
gd
.
addCheckbox
(
"Update match if calculated"
,
update_match
,
"Will update correlation match for a pair if found."
);
gd
.
addCheckbox
(
"Render match"
,
render_match
,
"Render a pair of matched images."
);
gd
.
addCheckbox
(
"Render match"
,
render_match
,
"Render a pair of matched images."
);
gd
.
addCheckbox
(
"Pattern match"
,
pattern_match
,
"Search for patterns for both images in a pair, first is primary."
);
gd
.
addCheckbox
(
"Bounds to selected images"
,
bounds_to_indices
,
"Set combo image bounds to selected images only. False - all images."
);
gd
.
addNumericField
(
"Temp mode"
,
temp_mode
,
0
,
4
,
""
,
"O - do not modify average pixels, 1 - equalize second image to first, 2 - try to account for raw average"
);
//temp_mode
/*
/*
for (int n = 0; n < image_enuatr.length; n++) {
for (int n = 0; n < image_enuatr.length; n++) {
gd.addMessage("image["+n+"] pose");
gd.addMessage("image["+n+"] pose");
...
@@ -174,18 +190,24 @@ public class ComboMatch {
...
@@ -174,18 +190,24 @@ public class ComboMatch {
if
(
use_marked_image
)
{
if
(
use_marked_image
)
{
gd
.
addCheckbox
(
"Use marked image data"
,
true
,
"Use markes from the selected image"
);
gd
.
addCheckbox
(
"Use marked image data"
,
true
,
"Use markes from the selected image"
);
}
}
gd
.
addCheckbox
(
"Update files metadata"
,
update_lla
,
"Re-read files metadata (ifd it was modified)"
);
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"
);
// update_kernel_patterns
gd
.
showDialog
();
gd
.
showDialog
();
if
(
gd
.
wasCanceled
())
return
false
;
if
(
gd
.
wasCanceled
())
return
false
;
int
choice_index
=
gd
.
getNextChoiceIndex
();
int
choice_index
=
gd
.
getNextChoiceIndex
();
files_list_path
=
files_lists_paths
[
choice_index
]+
".list"
;
String
files_list_path
=
files_lists_paths
[
choice_index
]+
".list"
;
orthoMapsCollection_path
=
files_lists_paths
[
choice_index
]+
".data"
;
String
orthoMapsCollection_path
=
files_lists_paths
[
choice_index
]+
".data"
;
use_saved_collection
=
gd
.
getNextBoolean
();
use_saved_collection
=
gd
.
getNextBoolean
();
save_collection
=
gd
.
getNextBoolean
();
save_collection
=
gd
.
getNextBoolean
();
process_correlation
=
gd
.
getNextBoolean
();
process_correlation
=
gd
.
getNextBoolean
();
update_match
=
gd
.
getNextBoolean
();
update_match
=
gd
.
getNextBoolean
();
render_match
=
gd
.
getNextBoolean
();
render_match
=
gd
.
getNextBoolean
();
pattern_match
=
gd
.
getNextBoolean
();
bounds_to_indices
=
gd
.
getNextBoolean
();
temp_mode
=
(
int
)
gd
.
getNextNumber
();
/*
/*
for (int n = 0; n < image_enuatr.length; n++) {
for (int n = 0; n < image_enuatr.length; n++) {
image_enuatr[n][0][0] = gd.getNextNumber();
image_enuatr[n][0][0] = gd.getNextNumber();
...
@@ -214,6 +236,7 @@ public class ComboMatch {
...
@@ -214,6 +236,7 @@ public class ComboMatch {
use_marked_image
=
gd
.
getNextBoolean
();
use_marked_image
=
gd
.
getNextBoolean
();
}
}
update_lla
=
gd
.
getNextBoolean
();
update_lla
=
gd
.
getNextBoolean
();
update_kernel_patterns
=
gd
.
getNextBoolean
();
OrthoMapsCollection
maps_collection
=
null
;
OrthoMapsCollection
maps_collection
=
null
;
if
(
use_saved_collection
)
{
if
(
use_saved_collection
)
{
try
{
try
{
...
@@ -222,6 +245,11 @@ public class ComboMatch {
...
@@ -222,6 +245,11 @@ public class ComboMatch {
// TODO Auto-generated catch block
// TODO Auto-generated catch block
e
.
printStackTrace
();
e
.
printStackTrace
();
}
}
//files_list_path
if
(
update_kernel_patterns
)
{
maps_collection
.
updateKernels
(
files_list_path
);
maps_collection
.
updatePatterns
(
files_list_path
);
}
}
else
{
}
else
{
maps_collection
=
new
OrthoMapsCollection
(
files_list_path
);
// should have ".list" extension
maps_collection
=
new
OrthoMapsCollection
(
files_list_path
);
// should have ".list" extension
}
}
...
@@ -266,6 +294,7 @@ public class ComboMatch {
...
@@ -266,6 +294,7 @@ public class ComboMatch {
false
,
// boolean use_alt,
false
,
// boolean use_alt,
show_centers
,
// boolean show_centers,
show_centers
,
// boolean show_centers,
zoom_lev
,
// int zoom_level,
zoom_lev
,
// int zoom_level,
temp_mode
,
// int temp_mode, // 0 - do nothing, 1 - equalize average,2 - try to correct
origin
);
// int [] origin){
origin
);
// int [] origin){
imp_img
.
show
();
imp_img
.
show
();
}
}
...
@@ -273,13 +302,14 @@ public class ComboMatch {
...
@@ -273,13 +302,14 @@ public class ComboMatch {
if
(
use_alt
)
{
if
(
use_alt
)
{
imp_alt
=
maps_collection
.
renderMulti
(
imp_alt
=
maps_collection
.
renderMulti
(
"multi_alt_zoom"
+
zoom_lev
,
// String title,
"multi_alt_zoom"
+
zoom_lev
,
// String title,
true
,
// boolean use_alt,
true
,
// boolean use_alt,
show_centers
,
// boolean show_centers,
show_centers
,
// boolean show_centers,
zoom_lev
,
// int zoom_level,
zoom_lev
,
// int zoom_level,
0
,
// int temp_mode, // 0 - do nothing, 1 - equalize average,2 - try to correct
origin
);
// int [] origin){
origin
);
// int [] origin){
imp_alt
.
show
();
imp_alt
.
show
();
}
}
if
(
process_correlation
||
render_match
)
{
if
(
process_correlation
||
render_match
||
pattern_match
)
{
// int [] gpu_pair;
// int [] gpu_pair;
if
(
gpu_spair
==
null
)
{
if
(
gpu_spair
==
null
)
{
ArrayList
<
Point
>
pairs_list
=
new
ArrayList
<
Point
>();
ArrayList
<
Point
>
pairs_list
=
new
ArrayList
<
Point
>();
...
@@ -409,40 +439,26 @@ public class ComboMatch {
...
@@ -409,40 +439,26 @@ public class ComboMatch {
System
.
out
.
println
();
System
.
out
.
println
();
}
}
}
}
if
(
pattern_match
)
{
ImagePlus
imp_pat_match
=
maps_collection
.
patterMatchDualWrap
(
gpu_pair
,
// int [] indices, // null or which indices to use (normally just 2 for pairwise comparison)
affines
,
// double [][][] affines, // null or [indices.length][2][3]
warp
);
// FineXYCorr warp)
// imp_pat_match.show();
}
if
(
render_match
)
{
if
(
render_match
)
{
ImagePlus
imp_img_pair
=
maps_collection
.
renderMulti
(
ImagePlus
imp_img_pair
=
maps_collection
.
renderMulti
(
"multi_"
+
gpu_spair
[
0
]+
"-"
+
gpu_spair
[
1
]+
"-zoom_"
+
min_zoom_lev
+
"_"
+
zoom_lev
,
// String title,
"multi_"
+
gpu_spair
[
0
]+
"-"
+
gpu_spair
[
1
]+
"-zoom_"
+
min_zoom_lev
+
"_"
+
zoom_lev
,
// String title,
false
,
// boolean use_alt,
false
,
// boolean use_alt,
gpu_pair
,
// int [] indices, // null or which indices to use (normally just 2 for pairwise comparison)
gpu_pair
,
// int [] indices, // null or which indices to use (normally just 2 for pairwise comparison)
bounds_to_indices
,
// boolean bounds_to_indices,
temp_mode
,
// int temp_mode, // 0 - do nothing, 1 - equalize average,2 - try to correct
affines
,
// double [][][] affines, // null or [indices.length][2][3]
affines
,
// double [][][] affines, // null or [indices.length][2][3]
warp
,
// FineXYCorr warp,
warp
,
// FineXYCorr warp,
show_centers
,
// boolean show_centers,
show_centers
,
// boolean show_centers,
min_zoom_lev
,
// int zoom_level,
min_zoom_lev
,
// int zoom_level,
origin
);
// int [] origin){
origin
);
// int [] origin){
imp_img_pair
.
show
();
imp_img_pair
.
show
();
/*
int gpu_tilesX = gpu_width/GPUTileProcessor.DTT_SIZE;
Rectangle tile_woi = OrthoMapsCollection.scaleRectangle (woi, GPUTileProcessor.DTT_SIZE);
double [][] vector_field_interpolated = interpolateVectorField(
vector_field, // final double [][] vector_field, // sparse {vx,vy,strength}
gpu_tilesX, // final int gpu_tilesX, // 512
tile_woi, // final Rectangle tile_woi, // only width, height are used top-left corners are the same
scale, // final double scale,
1); // final int debugLevel);
ImagePlus imp_img_pair = maps_collection.renderMulti (
"multi_"+gpu_spair[0]+"-"+gpu_spair[1]+"-zoom_"+min_zoom_lev+"_"+zoom_lev, // String title,
false, // boolean use_alt,
gpu_pair, // int [] indices, // null or which indices to use (normally just 2 for pairwise comparison)
affines, // double [][][] affines, // null or [indices.length][2][3]
show_centers, // boolean show_centers,
min_zoom_lev, // int zoom_level,
origin); // int [] origin){
imp_img_pair.show();
*/
}
}
}
}
}
}
...
...
src/main/java/com/elphel/imagej/orthomosaic/FineXYCorr.java
View file @
8667ae4b
...
@@ -5,6 +5,7 @@ import java.awt.Rectangle;
...
@@ -5,6 +5,7 @@ import java.awt.Rectangle;
import
com.elphel.imagej.gpu.GPUTileProcessor
;
import
com.elphel.imagej.gpu.GPUTileProcessor
;
public
class
FineXYCorr
{
public
class
FineXYCorr
{
public
double
scale_warp
=
1.0
;
public
double
[]
top_left_metric
;
// relative to the reference image vertical point, normally negative
public
double
[]
top_left_metric
;
// relative to the reference image vertical point, normally negative
public
int
width_tiles
;
public
int
width_tiles
;
public
int
height_tiles
;
public
int
height_tiles
;
...
@@ -60,7 +61,7 @@ public class FineXYCorr {
...
@@ -60,7 +61,7 @@ public class FineXYCorr {
* Apply warping to the x,y pair
* Apply warping to the x,y pair
* @param xy {X,Y} before and after warping
* @param xy {X,Y} before and after warping
*/
*/
public
void
warpXY
(
// in render pixels
public
void
warpXY
(
// in render pixels
NOT_USED
double
[]
xy
)
{
// no interpolation - using nearest
double
[]
xy
)
{
// no interpolation - using nearest
int
ix
=
(
int
)
Math
.
round
((
xy
[
0
]
-
render_tl
[
0
])
*
render_div_tile
);
int
ix
=
(
int
)
Math
.
round
((
xy
[
0
]
-
render_tl
[
0
])
*
render_div_tile
);
int
iy
=
(
int
)
Math
.
round
((
xy
[
1
]
-
render_tl
[
1
])
*
render_div_tile
);
int
iy
=
(
int
)
Math
.
round
((
xy
[
1
]
-
render_tl
[
1
])
*
render_div_tile
);
...
@@ -82,8 +83,8 @@ public class FineXYCorr {
...
@@ -82,8 +83,8 @@ public class FineXYCorr {
double
[]
dxdy
=
warp_xy
[
ix
+
width_tiles
*
iy
];
double
[]
dxdy
=
warp_xy
[
ix
+
width_tiles
*
iy
];
if
(
dxdy
!=
null
)
{
if
(
dxdy
!=
null
)
{
return
new
double
[]
{
return
new
double
[]
{
dxdy
[
0
]*
pix_div_render
,
dxdy
[
0
]*
pix_div_render
*
scale_warp
,
dxdy
[
1
]*
pix_div_render
};
dxdy
[
1
]*
pix_div_render
*
scale_warp
};
}
}
}
}
return
new
double
[
2
];
return
new
double
[
2
];
...
...
src/main/java/com/elphel/imagej/orthomosaic/GroundObjectPattern.java
0 → 100644
View file @
8667ae4b
package
com
.
elphel
.
imagej
.
orthomosaic
;
import
java.io.IOException
;
import
java.io.ObjectInputStream
;
import
java.io.ObjectOutputStream
;
import
java.io.Serializable
;
import
java.time.LocalDateTime
;
import
java.util.ArrayList
;
import
ij.Prefs
;
public
class
GroundObjectPattern
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
public
static
long
UTC_EAST_HRS
=
3
;
public
static
String
patterns_directory
;
//public LocalDateTime plusHours(long hours)
public
int
zoom_level
;
// 1 for 5mm/pix
public
String
object_type
;
// like "TM62"
// public String object_version; // just change config
LocalDateTime
utcDateTime
;
// UTC
public
String
filename
;
// should be square
public
GroundObjectPattern
(
String
filename
,
int
zoom_level
,
String
object_type
,
LocalDateTime
utcDateTime
)
{
this
.
filename
=
filename
;
this
.
zoom_level
=
zoom_level
;
this
.
object_type
=
object_type
;
this
.
utcDateTime
=
utcDateTime
;
}
private
void
writeObject
(
ObjectOutputStream
oos
)
throws
IOException
{
oos
.
defaultWriteObject
();
}
private
void
readObject
(
ObjectInputStream
ois
)
throws
ClassNotFoundException
,
IOException
{
ois
.
defaultReadObject
();
}
public
static
void
setPatternsDirectory
(
String
directory
)
{
while
(
directory
.
endsWith
(
Prefs
.
getFileSeparator
())){
directory
=
directory
.
substring
(
0
,
directory
.
length
()-
1
);
}
patterns_directory
=
directory
;
}
public
String
getPatternPath
()
{
return
patterns_directory
+
Prefs
.
getFileSeparator
()+
filename
;
}
public
static
String
getPatternsDirectory
()
{
return
patterns_directory
;
}
public
static
GroundObjectPattern
getPattern
(
String
object_type
,
LocalDateTime
utcDateTime
,
ArrayList
<
GroundObjectPattern
>
patterns
)
{
GroundObjectPattern
best_gop
=
null
;
long
best_hrs_diff
=
24
;
for
(
GroundObjectPattern
gop:
patterns
)
{
if
((
object_type
==
null
)
||
object_type
.
equals
(
gop
.
object_type
))
{
if
(
utcDateTime
!=
null
)
{
long
hrs_diff
=
Math
.
abs
(
utcDateTime
.
getHour
()-
gop
.
utcDateTime
.
getHour
());
if
(
hrs_diff
>
12
)
{
hrs_diff
=
24
-
hrs_diff
;
}
if
(
hrs_diff
<
best_hrs_diff
)
{
best_gop
=
gop
;
best_hrs_diff
=
hrs_diff
;
}
}
else
{
best_gop
=
gop
;
// use latest
}
}
}
return
best_gop
;
}
public
LocalDateTime
getUTC
()
{
return
utcDateTime
;
}
public
LocalDateTime
getLocalDT
()
{
return
utcDateTime
.
plusHours
(
UTC_EAST_HRS
);
}
public
boolean
isEvening
()
{
return
getLocalDT
().
getHour
()
>=
12
;
}
public
double
getAGL
()
{
double
agl
=
50
;
// zoom 0 for 50m AGL
for
(
int
z
=
zoom_level
;
z
>
0
;
z
--)
{
agl
/=
2
;
}
for
(
int
z
=
zoom_level
;
z
<
0
;
z
++)
{
agl
*=
2
;
}
return
agl
;
}
public
int
getZoomLevel
()
{
return
zoom_level
;
}
}
src/main/java/com/elphel/imagej/orthomosaic/ObjectLocation.java
0 → 100644
View file @
8667ae4b
package
com
.
elphel
.
imagej
.
orthomosaic
;
public
class
ObjectLocation
{
String
name
;
double
[]
xy_meters
;
}
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java
View file @
8667ae4b
This diff is collapsed.
Click to expand it.
src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java
View file @
8667ae4b
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