Commit d9770c1e authored by Andrey Filippov's avatar Andrey Filippov
Browse files

implemented affine export

parent 2d5052a0
Loading
Loading
Loading
Loading
+76 −0
Original line number Diff line number Diff line
@@ -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",
@@ -193,6 +194,10 @@ public class ComboMatch {
		boolean update_lla =          false; // re-read file metadata
		boolean update_kernel_patterns = false;
		boolean update_bl_bc =        false;
		boolean export_affine =       false; // export per-scene affines
		boolean export_affine2 =      false; // export per-pair affines
		
		
		boolean fix_duplicates =      false;
		String [] suffixes_bl_bc=     {"","-BL","-BC"};
		boolean log_append =           clt_parameters.imp.pwise_log_append;
@@ -258,6 +263,10 @@ public class ComboMatch {
				suffixes_bl_bc,
				suffixes_bl_bc[suffix_bc_bl_indx],
				"Select interpolation mode of the source files: old bilinear (empty), bilinear (-BL), or bicubic (-BC)", 0);
		
		gd.addCheckbox    ("Export scene affines",      export_affine,  "Export per-scene affines in text format for migration.");
		gd.addCheckbox    ("Export pairs affines",      export_affine2, "Export per-pair  affines in text format for migration.");
		
	    gd.addCheckbox    ("Write log file",            log_append, "Enable writing log file with matching results.");
	    gd.addStringField ("Log file full path",        log_path, 150, "Path of the log file to be appended.");	
//	    gd.addCheckbox    ("Read no-alt data (old)",    READ_NO_ALT, "Read older format data file where pairs do not have alt_data[].");
@@ -272,6 +281,8 @@ public class ComboMatch {
		omtch_img_set = ComboMatch.FILES_LISTS_PATHS[gd.getNextChoiceIndex()];
		String files_list_path =         omtch_img_set+".list";
		String orthoMapsCollection_path =omtch_img_set+".data";
		String affines_path =            omtch_img_set+".affines"; // for export per-scene affines
		String affines2_path =           omtch_img_set+".affines2"; // for export per-pair affines
		use_saved_collection =     gd.getNextBoolean();
		save_collection =          gd.getNextBoolean();
		String orthoMapsCollection_savepath = save_collection?orthoMapsCollection_path:null;
@@ -309,6 +320,11 @@ public class ComboMatch {
		fix_duplicates=             gd.getNextBoolean();
		update_bl_bc=               gd.getNextBoolean();
		suffix_bc_bl_indx =         gd.getNextChoiceIndex();
		
		export_affine =             gd.getNextBoolean();
		export_affine2 =            gd.getNextBoolean();
		
		
		log_append =                gd.getNextBoolean();
		log_path =                  gd.getNextString();
//		READ_NO_ALT =               gd.getNextBoolean();
@@ -339,6 +355,64 @@ public class ComboMatch {
			maps_collection.updateNumberScenes();
			maps_collection.updateSfmGain();
		}
		
		if (export_affine) {
			StringBuffer sb = new StringBuffer();
			for (OrthoMap omap :  maps_collection.ortho_maps) {
				String name = omap.getName();
				double [][] affine = omap.getAffine();
				if (affine != null) {
					sb.append(String.format("AFFINE %s %11.8f  %11.8f  %11.8f  %11.8f  %11.8f  %11.8f\n",
							name, affine[0][0], affine[0][1], affine[0][2], affine[1][0], affine[1][1], affine[1][2]));
				}
			}
			CalibrationFileManagement.saveStringToFile (
					affines_path,          //String path,
					sb.toString(), // data,
					false); // boolean append)
		}

		if (export_affine2) {
			StringBuffer sb = new StringBuffer();
			ArrayList<Point> pairs_list = new ArrayList<Point>(); 
			for (OrthoMap map : maps_collection.ortho_maps) {
				for (String other_name: map.pairwise_matches.keySet()) {
					pairs_list.add(new Point(
							maps_collection.getIndex(map.getName()),
							maps_collection.getIndex(other_name)));
				}
			}
			Collections.sort(pairs_list, new Comparator<Point>() {
				@Override
				public int compare(Point lhs, Point rhs) {
					return (rhs.x > lhs.x) ? -1 : (rhs.x < lhs.x) ? 1 :
						((rhs.y > lhs.y) ? -1 : (rhs.y < lhs.y) ? 1 : 0); // increasing
				}
			});
			for (Point pair: pairs_list) {
				PairwiseOrthoMatch pom = maps_collection.ortho_maps[pair.x].getMatch(
						maps_collection.ortho_maps[pair.y].getName(), false); // undef_only || nan_rms);
				if ((pom !=null) && pom.isDefined()) {
					double overlap = pom.overlap;
					double [][] affine = pom.getAffine();
					sb.append(String.format("AFFINE2 %s %s %11.8f  %11.8f  %11.8f  %11.8f  %11.8f  %11.8f  %11.8f\n",
							maps_collection.ortho_maps[pair.x].getName(),
							maps_collection.ortho_maps[pair.y].getName(),
							overlap,
							affine[0][0], affine[0][1], affine[0][2], affine[1][0], affine[1][1], affine[1][2]));
				}
			}
			CalibrationFileManagement.saveStringToFile (
					affines2_path,          //String path,
					sb.toString(), // data,
					false); // boolean append)
		}
		
		if (export_affine || export_affine2) {
			return true; // do not save
		}
		
		
		if (fix_duplicates) {
			removeDuplicateScenes (maps_collection);
		}
@@ -353,6 +427,8 @@ public class ComboMatch {
			}
		}
		
		
		
		String [] names = maps_collection.getNames(); // null
		if (object_list != null) {
			int       corr_size =                128;