Loading src/main/java/com/elphel/imagej/common/DoubleFHT.java +47 −0 Original line number Original line Diff line number Diff line Loading @@ -418,6 +418,53 @@ public class DoubleFHT { return first; return first; } } /** * Transform pattern once, and then use FD of the pattern for each overlapping image tile * @param second pattern to be transform * @return transformed pattern ( the original is also modified) */ public double [] transformPattern ( // new double [] second ){ //null-OK updateMaxN(second); swapQuadrants(second); if (!transform(second,false)) return null; // direct FHT return second; } /** * Phase correlate with pattern, that is transformed separately with transformPattern() * @param first square array to be phase-correlated, modified but not with result! * @param secondFD pattern already transformed to FD * @param phaseCoeff 0 - regular correlation, 1.0 - pure phase correlation * @param filter frequency filter or null * @param first_save null or array to accommodate FD of the first array before updating it with correlation * @return phase correlation, first still contains original transformed! */ public double [] phaseCorrelatePattern ( // new double [] first, double [] secondFD, double phaseCoeff, double [] filter, // high/low pass filtering double [] first_save ){ //null-OK if (first.length!=secondFD.length) { IJ.showMessage("Error","Correlation arrays should be the same size"); return null; } updateMaxN(first); swapQuadrants(first); if (!transform(first,false)) return null; // direct FHT if (first_save != null) System.arraycopy(first, 0, first_save, 0, first.length); first= phaseMultiplyNorm(first, secondFD, phaseCoeff); // correlation, not convolution if (filter!=null) multiplyByReal(first, filter); transform(first,true) ; // inverse transform swapQuadrants(first); return first; } // // Loading src/main/java/com/elphel/imagej/correction/Eyesis_Correction.java +30 −7 Original line number Original line Diff line number Diff line Loading @@ -847,9 +847,12 @@ public class Eyesis_Correction implements PlugIn, ActionListener { addButton("Set pair", panelLWIRWorld, color_process); addButton("Set pair", panelLWIRWorld, color_process); 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("Set pair GPS", panelLWIRWorld, color_process); addButton("Test video", panelLWIRWorld, color_process); addButton("Test video", panelLWIRWorld, color_process); addButton("Deconvolve Slices", panelLWIRWorld, color_process); addButton("Ortho Pairs", panelLWIRWorld, color_process); addButton("Mismatched resolutions", panelLWIRWorld, color_process); addButton("Generate DATI", panelLWIRWorld, color_process); addButton("Create mine", panelLWIRWorld, color_process); addButton("Pattern correlate", panelLWIRWorld, color_process); plugInFrame.add(panelLWIRWorld); plugInFrame.add(panelLWIRWorld); } } Loading Loading @@ -5705,7 +5708,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener { e.printStackTrace(); e.printStackTrace(); } } // ComboMatch.testReadTiff(); // ComboMatch.testReadTiff(); } else if (label.equals("Set pair GPS")) { } else if (label.equals("Ortho Pairs")) { 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) { Loading Loading @@ -5734,24 +5737,44 @@ public class Eyesis_Correction implements PlugIn, ActionListener { return; return; } } OrthoMap.testVideo(imp_sel); OrthoMap.testVideo(imp_sel); } else if (label.equals("Deconvolve Slices")) { } else if (label.equals("Mismatched resolutions")) { ImagePlus imp_sel = WindowManager.getCurrentImage(); ImagePlus imp_sel = WindowManager.getCurrentImage(); if (imp_sel == null) { if (imp_sel == null) { IJ.showMessage("Error", "No images selected"); IJ.showMessage("Error", "No images selected"); return; return; } } OrthoMap.testDeconvolveSlices( OrthoMap.createMismatchedResolutionKernel( imp_sel, // ImagePlus imp, imp_sel, // ImagePlus imp, 512, // int [] slices, 512, // int [] slices, new int [] {1,2}, // int [] slices, deconvolve slice 2 with slice1 new int [] {1,2}, // int [] slices, deconvolve slice 2 with slice1 4, // int kernel_radius, 6, // 4, // int kernel_radius, true, // boolean hor_sym, true, // boolean hor_sym, true, // boolean vert_sym, true, // boolean vert_sym, true, // false, // boolean all_sym, true, // false, // boolean all_sym, DEBUG_LEVEL); // int debugLevel) { // >0 DEBUG_LEVEL); // int debugLevel) { // >0 } else if (label.equals("Generate DATI")) { ImagePlus imp_sel = WindowManager.getCurrentImage(); if (imp_sel == null) { IJ.showMessage("Error", "No images selected"); return; } OrthoMap.generateDATI( imp_sel, // ImagePlus imp, 512, // int [] slices, new int [] {1,2}, // int [] slices, deconvolve slice 2 with slice1 DEBUG_LEVEL); // int debugLevel) { // >0 } else if (label.equals("Create mine")) { OrthoMap.testPatternGenerate(); } else if (label.equals("Pattern correlate")) { ImagePlus imp_sel = WindowManager.getCurrentImage(); if (imp_sel == null) { IJ.showMessage("Error", "No images selected"); return; } } OrthoMap.testPatternCorrelate(imp_sel); } } } // public boolean debugInitOneScene() { public boolean debugInitOneScene() { DEBUG_LEVEL = MASTER_DEBUG_LEVEL; DEBUG_LEVEL = MASTER_DEBUG_LEVEL; if (EYESIS_CORRECTIONS_AUX == null) { if (EYESIS_CORRECTIONS_AUX == null) { Loading src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java +28 −20 Original line number Original line Diff line number Diff line Loading @@ -82,8 +82,15 @@ public class ComboMatch { // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_08_november.data"; // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_08_november.data"; // String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.list"; // String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.list"; // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.data"; // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.data"; 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 = { "/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"}; 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"; //maps_nov3_50-75 //maps_19_sep13.list //maps_19_sep13.list //maps_09_short.list //maps_09_short.list //maps_08_november.list //maps_08_november.list Loading Loading @@ -129,26 +136,20 @@ public class ComboMatch { boolean restore_temp = true; 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 if (!use_marked_image) { if (!use_marked_image) { process_correlation=false; // use already adjusted by defualt process_correlation=false; // use already adjusted by default } } GenericJTabbedDialog gd = new GenericJTabbedDialog("Set image pair",1200,900); GenericJTabbedDialog gd = new GenericJTabbedDialog("Set image pair",1200,900); gd.addStringField ("Image list full path", files_list_path, 180, "Image list full path."); gd.addChoice ("Files list/data path (w/o extension):", files_lists_paths, files_lists_paths[files_lists_paths.length-1]); gd.addStringField ("Maps collection save path", orthoMapsCollection_path, 180, "Save path for serialized map collection data."); gd.addCheckbox ("Use saved maps collection", use_saved_collection, "If false - use files list."); gd.addCheckbox ("Use saved maps collection", use_saved_collection, "If false - use files list."); gd.addCheckbox ("Save maps collection", save_collection, "Save maps collection to be able to restore."); gd.addCheckbox ("Save maps collection", save_collection, "Save maps collection to be able to restore."); 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."); /* // // for (int n = 0; n < image_paths_pre.length; n++) { // gd.addStringField ("Image path "+n, image_paths_pre[n], 180, "Image "+n+" full path w/o ext"); // } // gd.addStringField ("First image path", image_paths_pre[0], 180, "First image full path w/o ext"); // gd.addStringField ("Second image path", image_paths_pre[1], 180, "Second image full path w/o ext"); 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"); gd.addNumericField("East", image_enuatr[n][0][0], 3,7,"m", "Move image "+n+" East."); gd.addNumericField("East", image_enuatr[n][0][0], 3,7,"m", "Move image "+n+" East."); Loading @@ -158,6 +159,7 @@ public class ComboMatch { gd.addNumericField("Tilt", image_enuatr[n][1][1], 3,7,"deg", "Rotate image "+n+" around East."); gd.addNumericField("Tilt", image_enuatr[n][1][1], 3,7,"deg", "Rotate image "+n+" around East."); gd.addNumericField("Roll", image_enuatr[n][1][2], 3,7,"deg", "Rotate image "+n+" around North."); gd.addNumericField("Roll", image_enuatr[n][1][2], 3,7,"deg", "Rotate image "+n+" around North."); } } */ gd.addNumericField("Zoom level", zoom_lev, 0,4,"", gd.addNumericField("Zoom level", zoom_lev, 0,4,"", "Zoom level: +1 - zoom in twice, -1 - zoom out twice"); "Zoom level: +1 - zoom in twice, -1 - zoom out twice"); gd.addNumericField("GPU image width", gpu_width, 0,4,"", gd.addNumericField("GPU image width", gpu_width, 0,4,"", Loading @@ -167,23 +169,24 @@ public class ComboMatch { gd.addCheckbox ("Show transformation centers", show_centers, "Mark verticals from the UAS on the ground."); gd.addCheckbox ("Show transformation centers", show_centers, "Mark verticals from the UAS on the ground."); gd.addCheckbox ("Show combo image map", show_combo_map, "Load and process altitude maps."); gd.addCheckbox ("Show combo image map", show_combo_map, "Load and process altitude maps."); gd.addCheckbox ("Show altitude combo image", use_alt, "Load and process altitude maps."); gd.addCheckbox ("Show altitude combo image", use_alt, "Load and process altitude maps."); // gd.addStringField ("First matching timestamp", gpu_spair[0], 20, "First GPU-matching timestamp with '_' for decimal point."); // gd.addStringField ("Second matching timestamp", gpu_spair[1], 20, "First GPU-matching timestamp with '_' for decimal point."); gd.addNumericField("Remove fraction of worst matches", frac_remove, 3,7,"", "When fitting scenes remove this fraction of worst match."); gd.addNumericField("Remove fraction of worst matches", frac_remove, 3,7,"", "When fitting scenes remove this fraction of worst match."); gd.addNumericField("Maximal metric error", metric_error, 3,7,"m", "Maximal tolerable fitting error caused by elevation variations."); gd.addNumericField("Maximal metric error", metric_error, 3,7,"m", "Maximal tolerable fitting error caused by elevation variations."); 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.showDialog(); gd.showDialog(); if (gd.wasCanceled()) return false; if (gd.wasCanceled()) return false; files_list_path = gd.getNextString(); int choice_index = gd.getNextChoiceIndex(); files_list_path = files_lists_paths[choice_index]+".list"; orthoMapsCollection_path = gd.getNextString(); 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(); /* 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(); image_enuatr[n][0][1] = gd.getNextNumber(); image_enuatr[n][0][1] = gd.getNextNumber(); Loading @@ -192,6 +195,7 @@ public class ComboMatch { image_enuatr[n][1][1] = gd.getNextNumber(); image_enuatr[n][1][1] = gd.getNextNumber(); image_enuatr[n][1][2] = gd.getNextNumber(); image_enuatr[n][1][2] = gd.getNextNumber(); } } */ zoom_lev = (int) gd.getNextNumber(); zoom_lev = (int) gd.getNextNumber(); gpu_width = (int) gd.getNextNumber(); gpu_width = (int) gd.getNextNumber(); gpu_height = (int) gd.getNextNumber(); gpu_height = (int) gd.getNextNumber(); Loading @@ -209,6 +213,7 @@ public class ComboMatch { if (use_marked_image ) { // will only be used if found and asked if (use_marked_image ) { // will only be used if found and asked use_marked_image= gd.getNextBoolean(); use_marked_image= gd.getNextBoolean(); } } update_lla= gd.getNextBoolean(); OrthoMapsCollection maps_collection=null; OrthoMapsCollection maps_collection=null; if (use_saved_collection) { if (use_saved_collection) { try { try { Loading Loading @@ -246,7 +251,10 @@ public class ComboMatch { //getTemperature() //getTemperature() // get all temperatures // get all temperatures maps_collection.getAllTemperatures(); maps_collection.getAllTemperatures(); if (update_lla) { System.out.println("Updating map files metadata"); maps_collection.updateLLa(); } // which pair to compare // which pair to compare // String [] gpu_spair = {names[gpu_ipair[0]],names[gpu_ipair[1]]}; // String [] gpu_spair = {names[gpu_ipair[0]],names[gpu_ipair[1]]}; Loading Loading @@ -310,7 +318,7 @@ public class ComboMatch { int max_zoom_lev = Math.max( int max_zoom_lev = Math.max( maps_collection.ortho_maps[gpu_pair[0]].getOriginalZoomLevel(), maps_collection.ortho_maps[gpu_pair[0]].getOriginalZoomLevel(), maps_collection.ortho_maps[gpu_pair[1]].getOriginalZoomLevel()); maps_collection.ortho_maps[gpu_pair[1]].getOriginalZoomLevel()); int initial_zoom = max_zoom_lev - 3; // another algorithm? int initial_zoom = max_zoom_lev - 4; // another algorithm? System.out.println("Setting up GPU"); System.out.println("Setting up GPU"); Loading src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java +1487 −103 File changed.Preview size limit exceeded, changes collapsed. Show changes src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java +15 −3 Original line number Original line Diff line number Diff line Loading @@ -60,8 +60,8 @@ public class OrthoMapsCollection implements Serializable{ ortho_maps = new OrthoMap[paths.length]; ortho_maps = new OrthoMap[paths.length]; for (int n = 0; n < ortho_maps.length; n++) { for (int n = 0; n < ortho_maps.length; n++) { String name = OrthoMap.getNameFromPath(paths[n]); String name = OrthoMap.getNameFromPath(paths[n]); String scene_path = getSceneDir(scenes_path, name); // String scene_path = getSceneDir(scenes_path, name); ortho_maps[n] = new OrthoMap(paths[n], scene_path); ortho_maps[n] = new OrthoMap(paths[n]); // , scene_path); ortho_maps[n].setAffine(affine); ortho_maps[n].setAffine(affine); } } } } Loading Loading @@ -117,9 +117,15 @@ public class OrthoMapsCollection implements Serializable{ public void getAllTemperatures() { public void getAllTemperatures() { for (int n = 0; n < ortho_maps.length; n++) { for (int n = 0; n < ortho_maps.length; n++) { ortho_maps[n].getTemperature(); ortho_maps[n].getTemperature(); ortho_maps[n].getTemperatureAndTelemetry(); } } } } public void updateLLa() { // make automatic by saving/testing file modification stamp? for (int n = 0; n < ortho_maps.length; n++) { ortho_maps[n].updateLLA(); } } public static String[] getPathsFromSorceList( public static String[] getPathsFromSorceList( String files_list) { String files_list) { Loading Loading @@ -683,6 +689,12 @@ public class OrthoMapsCollection implements Serializable{ } } gpu_pair_img[n] = ortho_maps[gpu_pair[n]].getPaddedGPU (zoom_lev); // int zoom_level, gpu_pair_img[n] = ortho_maps[gpu_pair[n]].getPaddedGPU (zoom_lev); // int zoom_level, } } boolean invert_second = (debugLevel > 1000); if (invert_second) { for (int i = 0; i < gpu_pair_img[1].length; i++) { gpu_pair_img[1][i]= -gpu_pair_img[1][i]; } } if (show_gpu_img) { if (show_gpu_img) { String [] dbg_titles = {ortho_maps[gpu_pair[0]].getName(),ortho_maps[gpu_pair[1]].getName()}; String [] dbg_titles = {ortho_maps[gpu_pair[0]].getName(),ortho_maps[gpu_pair[1]].getName()}; ShowDoubleFloatArrays.showArrays( ShowDoubleFloatArrays.showArrays( Loading Loading @@ -1271,7 +1283,7 @@ public class OrthoMapsCollection implements Serializable{ num_passes, // int num_passes, num_passes, // int num_passes, max_diff, // double max_diff, max_diff, // double max_diff, ImageDtt.THREADS_MAX, // int threadsMax, ImageDtt.THREADS_MAX, // int threadsMax, debugLevel); // int debug_level) debugLevel-1); // int debug_level) } } if (debugLevel > 0) { if (debugLevel > 0) { String [] dbg_titles = {"x-raw","x_filled","y-raw","y_filled"}; String [] dbg_titles = {"x-raw","x_filled","y-raw","y_filled"}; Loading Loading
src/main/java/com/elphel/imagej/common/DoubleFHT.java +47 −0 Original line number Original line Diff line number Diff line Loading @@ -418,6 +418,53 @@ public class DoubleFHT { return first; return first; } } /** * Transform pattern once, and then use FD of the pattern for each overlapping image tile * @param second pattern to be transform * @return transformed pattern ( the original is also modified) */ public double [] transformPattern ( // new double [] second ){ //null-OK updateMaxN(second); swapQuadrants(second); if (!transform(second,false)) return null; // direct FHT return second; } /** * Phase correlate with pattern, that is transformed separately with transformPattern() * @param first square array to be phase-correlated, modified but not with result! * @param secondFD pattern already transformed to FD * @param phaseCoeff 0 - regular correlation, 1.0 - pure phase correlation * @param filter frequency filter or null * @param first_save null or array to accommodate FD of the first array before updating it with correlation * @return phase correlation, first still contains original transformed! */ public double [] phaseCorrelatePattern ( // new double [] first, double [] secondFD, double phaseCoeff, double [] filter, // high/low pass filtering double [] first_save ){ //null-OK if (first.length!=secondFD.length) { IJ.showMessage("Error","Correlation arrays should be the same size"); return null; } updateMaxN(first); swapQuadrants(first); if (!transform(first,false)) return null; // direct FHT if (first_save != null) System.arraycopy(first, 0, first_save, 0, first.length); first= phaseMultiplyNorm(first, secondFD, phaseCoeff); // correlation, not convolution if (filter!=null) multiplyByReal(first, filter); transform(first,true) ; // inverse transform swapQuadrants(first); return first; } // // Loading
src/main/java/com/elphel/imagej/correction/Eyesis_Correction.java +30 −7 Original line number Original line Diff line number Diff line Loading @@ -847,9 +847,12 @@ public class Eyesis_Correction implements PlugIn, ActionListener { addButton("Set pair", panelLWIRWorld, color_process); addButton("Set pair", panelLWIRWorld, color_process); 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("Set pair GPS", panelLWIRWorld, color_process); addButton("Test video", panelLWIRWorld, color_process); addButton("Test video", panelLWIRWorld, color_process); addButton("Deconvolve Slices", panelLWIRWorld, color_process); addButton("Ortho Pairs", panelLWIRWorld, color_process); addButton("Mismatched resolutions", panelLWIRWorld, color_process); addButton("Generate DATI", panelLWIRWorld, color_process); addButton("Create mine", panelLWIRWorld, color_process); addButton("Pattern correlate", panelLWIRWorld, color_process); plugInFrame.add(panelLWIRWorld); plugInFrame.add(panelLWIRWorld); } } Loading Loading @@ -5705,7 +5708,7 @@ public class Eyesis_Correction implements PlugIn, ActionListener { e.printStackTrace(); e.printStackTrace(); } } // ComboMatch.testReadTiff(); // ComboMatch.testReadTiff(); } else if (label.equals("Set pair GPS")) { } else if (label.equals("Ortho Pairs")) { 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) { Loading Loading @@ -5734,24 +5737,44 @@ public class Eyesis_Correction implements PlugIn, ActionListener { return; return; } } OrthoMap.testVideo(imp_sel); OrthoMap.testVideo(imp_sel); } else if (label.equals("Deconvolve Slices")) { } else if (label.equals("Mismatched resolutions")) { ImagePlus imp_sel = WindowManager.getCurrentImage(); ImagePlus imp_sel = WindowManager.getCurrentImage(); if (imp_sel == null) { if (imp_sel == null) { IJ.showMessage("Error", "No images selected"); IJ.showMessage("Error", "No images selected"); return; return; } } OrthoMap.testDeconvolveSlices( OrthoMap.createMismatchedResolutionKernel( imp_sel, // ImagePlus imp, imp_sel, // ImagePlus imp, 512, // int [] slices, 512, // int [] slices, new int [] {1,2}, // int [] slices, deconvolve slice 2 with slice1 new int [] {1,2}, // int [] slices, deconvolve slice 2 with slice1 4, // int kernel_radius, 6, // 4, // int kernel_radius, true, // boolean hor_sym, true, // boolean hor_sym, true, // boolean vert_sym, true, // boolean vert_sym, true, // false, // boolean all_sym, true, // false, // boolean all_sym, DEBUG_LEVEL); // int debugLevel) { // >0 DEBUG_LEVEL); // int debugLevel) { // >0 } else if (label.equals("Generate DATI")) { ImagePlus imp_sel = WindowManager.getCurrentImage(); if (imp_sel == null) { IJ.showMessage("Error", "No images selected"); return; } OrthoMap.generateDATI( imp_sel, // ImagePlus imp, 512, // int [] slices, new int [] {1,2}, // int [] slices, deconvolve slice 2 with slice1 DEBUG_LEVEL); // int debugLevel) { // >0 } else if (label.equals("Create mine")) { OrthoMap.testPatternGenerate(); } else if (label.equals("Pattern correlate")) { ImagePlus imp_sel = WindowManager.getCurrentImage(); if (imp_sel == null) { IJ.showMessage("Error", "No images selected"); return; } } OrthoMap.testPatternCorrelate(imp_sel); } } } // public boolean debugInitOneScene() { public boolean debugInitOneScene() { DEBUG_LEVEL = MASTER_DEBUG_LEVEL; DEBUG_LEVEL = MASTER_DEBUG_LEVEL; if (EYESIS_CORRECTIONS_AUX == null) { if (EYESIS_CORRECTIONS_AUX == null) { Loading
src/main/java/com/elphel/imagej/orthomosaic/ComboMatch.java +28 −20 Original line number Original line Diff line number Diff line Loading @@ -82,8 +82,15 @@ public class ComboMatch { // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_08_november.data"; // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_08_november.data"; // String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.list"; // String files_list_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.list"; // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.data"; // String orthoMapsCollection_path = "/media/elphel/SSD3-4GB/lwir16-proc/ortho_videos/maps_10_short.data"; 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 = { "/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"}; 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"; //maps_nov3_50-75 //maps_19_sep13.list //maps_19_sep13.list //maps_09_short.list //maps_09_short.list //maps_08_november.list //maps_08_november.list Loading Loading @@ -129,26 +136,20 @@ public class ComboMatch { boolean restore_temp = true; 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 if (!use_marked_image) { if (!use_marked_image) { process_correlation=false; // use already adjusted by defualt process_correlation=false; // use already adjusted by default } } GenericJTabbedDialog gd = new GenericJTabbedDialog("Set image pair",1200,900); GenericJTabbedDialog gd = new GenericJTabbedDialog("Set image pair",1200,900); gd.addStringField ("Image list full path", files_list_path, 180, "Image list full path."); gd.addChoice ("Files list/data path (w/o extension):", files_lists_paths, files_lists_paths[files_lists_paths.length-1]); gd.addStringField ("Maps collection save path", orthoMapsCollection_path, 180, "Save path for serialized map collection data."); gd.addCheckbox ("Use saved maps collection", use_saved_collection, "If false - use files list."); gd.addCheckbox ("Use saved maps collection", use_saved_collection, "If false - use files list."); gd.addCheckbox ("Save maps collection", save_collection, "Save maps collection to be able to restore."); gd.addCheckbox ("Save maps collection", save_collection, "Save maps collection to be able to restore."); 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."); /* // // for (int n = 0; n < image_paths_pre.length; n++) { // gd.addStringField ("Image path "+n, image_paths_pre[n], 180, "Image "+n+" full path w/o ext"); // } // gd.addStringField ("First image path", image_paths_pre[0], 180, "First image full path w/o ext"); // gd.addStringField ("Second image path", image_paths_pre[1], 180, "Second image full path w/o ext"); 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"); gd.addNumericField("East", image_enuatr[n][0][0], 3,7,"m", "Move image "+n+" East."); gd.addNumericField("East", image_enuatr[n][0][0], 3,7,"m", "Move image "+n+" East."); Loading @@ -158,6 +159,7 @@ public class ComboMatch { gd.addNumericField("Tilt", image_enuatr[n][1][1], 3,7,"deg", "Rotate image "+n+" around East."); gd.addNumericField("Tilt", image_enuatr[n][1][1], 3,7,"deg", "Rotate image "+n+" around East."); gd.addNumericField("Roll", image_enuatr[n][1][2], 3,7,"deg", "Rotate image "+n+" around North."); gd.addNumericField("Roll", image_enuatr[n][1][2], 3,7,"deg", "Rotate image "+n+" around North."); } } */ gd.addNumericField("Zoom level", zoom_lev, 0,4,"", gd.addNumericField("Zoom level", zoom_lev, 0,4,"", "Zoom level: +1 - zoom in twice, -1 - zoom out twice"); "Zoom level: +1 - zoom in twice, -1 - zoom out twice"); gd.addNumericField("GPU image width", gpu_width, 0,4,"", gd.addNumericField("GPU image width", gpu_width, 0,4,"", Loading @@ -167,23 +169,24 @@ public class ComboMatch { gd.addCheckbox ("Show transformation centers", show_centers, "Mark verticals from the UAS on the ground."); gd.addCheckbox ("Show transformation centers", show_centers, "Mark verticals from the UAS on the ground."); gd.addCheckbox ("Show combo image map", show_combo_map, "Load and process altitude maps."); gd.addCheckbox ("Show combo image map", show_combo_map, "Load and process altitude maps."); gd.addCheckbox ("Show altitude combo image", use_alt, "Load and process altitude maps."); gd.addCheckbox ("Show altitude combo image", use_alt, "Load and process altitude maps."); // gd.addStringField ("First matching timestamp", gpu_spair[0], 20, "First GPU-matching timestamp with '_' for decimal point."); // gd.addStringField ("Second matching timestamp", gpu_spair[1], 20, "First GPU-matching timestamp with '_' for decimal point."); gd.addNumericField("Remove fraction of worst matches", frac_remove, 3,7,"", "When fitting scenes remove this fraction of worst match."); gd.addNumericField("Remove fraction of worst matches", frac_remove, 3,7,"", "When fitting scenes remove this fraction of worst match."); gd.addNumericField("Maximal metric error", metric_error, 3,7,"m", "Maximal tolerable fitting error caused by elevation variations."); gd.addNumericField("Maximal metric error", metric_error, 3,7,"m", "Maximal tolerable fitting error caused by elevation variations."); 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.showDialog(); gd.showDialog(); if (gd.wasCanceled()) return false; if (gd.wasCanceled()) return false; files_list_path = gd.getNextString(); int choice_index = gd.getNextChoiceIndex(); files_list_path = files_lists_paths[choice_index]+".list"; orthoMapsCollection_path = gd.getNextString(); 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(); /* 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(); image_enuatr[n][0][1] = gd.getNextNumber(); image_enuatr[n][0][1] = gd.getNextNumber(); Loading @@ -192,6 +195,7 @@ public class ComboMatch { image_enuatr[n][1][1] = gd.getNextNumber(); image_enuatr[n][1][1] = gd.getNextNumber(); image_enuatr[n][1][2] = gd.getNextNumber(); image_enuatr[n][1][2] = gd.getNextNumber(); } } */ zoom_lev = (int) gd.getNextNumber(); zoom_lev = (int) gd.getNextNumber(); gpu_width = (int) gd.getNextNumber(); gpu_width = (int) gd.getNextNumber(); gpu_height = (int) gd.getNextNumber(); gpu_height = (int) gd.getNextNumber(); Loading @@ -209,6 +213,7 @@ public class ComboMatch { if (use_marked_image ) { // will only be used if found and asked if (use_marked_image ) { // will only be used if found and asked use_marked_image= gd.getNextBoolean(); use_marked_image= gd.getNextBoolean(); } } update_lla= gd.getNextBoolean(); OrthoMapsCollection maps_collection=null; OrthoMapsCollection maps_collection=null; if (use_saved_collection) { if (use_saved_collection) { try { try { Loading Loading @@ -246,7 +251,10 @@ public class ComboMatch { //getTemperature() //getTemperature() // get all temperatures // get all temperatures maps_collection.getAllTemperatures(); maps_collection.getAllTemperatures(); if (update_lla) { System.out.println("Updating map files metadata"); maps_collection.updateLLa(); } // which pair to compare // which pair to compare // String [] gpu_spair = {names[gpu_ipair[0]],names[gpu_ipair[1]]}; // String [] gpu_spair = {names[gpu_ipair[0]],names[gpu_ipair[1]]}; Loading Loading @@ -310,7 +318,7 @@ public class ComboMatch { int max_zoom_lev = Math.max( int max_zoom_lev = Math.max( maps_collection.ortho_maps[gpu_pair[0]].getOriginalZoomLevel(), maps_collection.ortho_maps[gpu_pair[0]].getOriginalZoomLevel(), maps_collection.ortho_maps[gpu_pair[1]].getOriginalZoomLevel()); maps_collection.ortho_maps[gpu_pair[1]].getOriginalZoomLevel()); int initial_zoom = max_zoom_lev - 3; // another algorithm? int initial_zoom = max_zoom_lev - 4; // another algorithm? System.out.println("Setting up GPU"); System.out.println("Setting up GPU"); Loading
src/main/java/com/elphel/imagej/orthomosaic/OrthoMap.java +1487 −103 File changed.Preview size limit exceeded, changes collapsed. Show changes
src/main/java/com/elphel/imagej/orthomosaic/OrthoMapsCollection.java +15 −3 Original line number Original line Diff line number Diff line Loading @@ -60,8 +60,8 @@ public class OrthoMapsCollection implements Serializable{ ortho_maps = new OrthoMap[paths.length]; ortho_maps = new OrthoMap[paths.length]; for (int n = 0; n < ortho_maps.length; n++) { for (int n = 0; n < ortho_maps.length; n++) { String name = OrthoMap.getNameFromPath(paths[n]); String name = OrthoMap.getNameFromPath(paths[n]); String scene_path = getSceneDir(scenes_path, name); // String scene_path = getSceneDir(scenes_path, name); ortho_maps[n] = new OrthoMap(paths[n], scene_path); ortho_maps[n] = new OrthoMap(paths[n]); // , scene_path); ortho_maps[n].setAffine(affine); ortho_maps[n].setAffine(affine); } } } } Loading Loading @@ -117,9 +117,15 @@ public class OrthoMapsCollection implements Serializable{ public void getAllTemperatures() { public void getAllTemperatures() { for (int n = 0; n < ortho_maps.length; n++) { for (int n = 0; n < ortho_maps.length; n++) { ortho_maps[n].getTemperature(); ortho_maps[n].getTemperature(); ortho_maps[n].getTemperatureAndTelemetry(); } } } } public void updateLLa() { // make automatic by saving/testing file modification stamp? for (int n = 0; n < ortho_maps.length; n++) { ortho_maps[n].updateLLA(); } } public static String[] getPathsFromSorceList( public static String[] getPathsFromSorceList( String files_list) { String files_list) { Loading Loading @@ -683,6 +689,12 @@ public class OrthoMapsCollection implements Serializable{ } } gpu_pair_img[n] = ortho_maps[gpu_pair[n]].getPaddedGPU (zoom_lev); // int zoom_level, gpu_pair_img[n] = ortho_maps[gpu_pair[n]].getPaddedGPU (zoom_lev); // int zoom_level, } } boolean invert_second = (debugLevel > 1000); if (invert_second) { for (int i = 0; i < gpu_pair_img[1].length; i++) { gpu_pair_img[1][i]= -gpu_pair_img[1][i]; } } if (show_gpu_img) { if (show_gpu_img) { String [] dbg_titles = {ortho_maps[gpu_pair[0]].getName(),ortho_maps[gpu_pair[1]].getName()}; String [] dbg_titles = {ortho_maps[gpu_pair[0]].getName(),ortho_maps[gpu_pair[1]].getName()}; ShowDoubleFloatArrays.showArrays( ShowDoubleFloatArrays.showArrays( Loading Loading @@ -1271,7 +1283,7 @@ public class OrthoMapsCollection implements Serializable{ num_passes, // int num_passes, num_passes, // int num_passes, max_diff, // double max_diff, max_diff, // double max_diff, ImageDtt.THREADS_MAX, // int threadsMax, ImageDtt.THREADS_MAX, // int threadsMax, debugLevel); // int debug_level) debugLevel-1); // int debug_level) } } if (debugLevel > 0) { if (debugLevel > 0) { String [] dbg_titles = {"x-raw","x_filled","y-raw","y_filled"}; String [] dbg_titles = {"x-raw","x_filled","y-raw","y_filled"}; Loading