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

merging planes

parent cee97f1b
Loading
Loading
Loading
Loading
+34 −14
Original line number Original line Diff line number Diff line
@@ -2150,9 +2150,13 @@ public class EyesisCorrectionParameters {
  		public double     plMinStrength        =   0.1;  // Minimal total strength of a plane 
  		public double     plMinStrength        =   0.1;  // Minimal total strength of a plane 
  		public double     plMaxEigen           =   0.3;  // Maximal eigenvalue of a plane 
  		public double     plMaxEigen           =   0.3;  // Maximal eigenvalue of a plane 
  		public boolean    plDbgMerge           =   true; // Combine 'other' plane with current
  		public boolean    plDbgMerge           =   true; // Combine 'other' plane with current
  		public double     plWorstWorsening     =   2.0;  // Worst case worsening after merge 
  		public double     plWorstWorsening     =   1.0;  // Worst case worsening after merge 
  		public boolean    plMutualOnly         =   true; // keep only mutual links, remove weakest if conflict
  		public boolean    plMutualOnly         =   true; // keep only mutual links, remove weakest if conflict


  		public double     plPull            =  .1;   // Relative weight of original (measured) plane when combing with neighbors
  		public int        plIterations      =  10;   // Maximal number of smoothing iterations for each step
  		public int        plPrecision       =  6;    // Maximal step difference (1/power of 10) 
  		
  		
  		
  		// other debug images
  		// other debug images
  		public boolean    show_ortho_combine =     false; // Show 'ortho_combine' 
  		public boolean    show_ortho_combine =     false; // Show 'ortho_combine' 
@@ -2397,6 +2401,10 @@ public class EyesisCorrectionParameters {
			properties.setProperty(prefix+"plWorstWorsening", this.plWorstWorsening +"");
			properties.setProperty(prefix+"plWorstWorsening", this.plWorstWorsening +"");
			properties.setProperty(prefix+"plMutualOnly",     this.plMutualOnly+"");
			properties.setProperty(prefix+"plMutualOnly",     this.plMutualOnly+"");


			properties.setProperty(prefix+"plPull",           this.plPull +"");
  			properties.setProperty(prefix+"plIterations",     this.plIterations+"");
  			properties.setProperty(prefix+"plPrecision",      this.plPrecision+"");

			properties.setProperty(prefix+"show_ortho_combine",     this.show_ortho_combine+"");
			properties.setProperty(prefix+"show_ortho_combine",     this.show_ortho_combine+"");
			properties.setProperty(prefix+"show_refine_supertiles", this.show_refine_supertiles+"");
			properties.setProperty(prefix+"show_refine_supertiles", this.show_refine_supertiles+"");
			properties.setProperty(prefix+"show_bgnd_nonbgnd",      this.show_bgnd_nonbgnd+"");
			properties.setProperty(prefix+"show_bgnd_nonbgnd",      this.show_bgnd_nonbgnd+"");
@@ -2631,6 +2639,10 @@ public class EyesisCorrectionParameters {
  			if (properties.getProperty(prefix+"plWorstWorsening")!=null)  this.plWorstWorsening=Double.parseDouble(properties.getProperty(prefix+"plWorstWorsening"));
  			if (properties.getProperty(prefix+"plWorstWorsening")!=null)  this.plWorstWorsening=Double.parseDouble(properties.getProperty(prefix+"plWorstWorsening"));
  			if (properties.getProperty(prefix+"plMutualOnly")!=null)      this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly"));
  			if (properties.getProperty(prefix+"plMutualOnly")!=null)      this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly"));


  			if (properties.getProperty(prefix+"plPull")!=null)            this.plPull=Double.parseDouble(properties.getProperty(prefix+"plPull"));
  			if (properties.getProperty(prefix+"plIterations")!=null)      this.plIterations=Integer.parseInt(properties.getProperty(prefix+"plIterations"));
  			if (properties.getProperty(prefix+"plPrecision")!=null)       this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plPrecision"));

  			if (properties.getProperty(prefix+"show_ortho_combine")!=null)     this.show_ortho_combine=Boolean.parseBoolean(properties.getProperty(prefix+"show_ortho_combine"));
  			if (properties.getProperty(prefix+"show_ortho_combine")!=null)     this.show_ortho_combine=Boolean.parseBoolean(properties.getProperty(prefix+"show_ortho_combine"));
  			if (properties.getProperty(prefix+"show_refine_supertiles")!=null) this.show_refine_supertiles=Boolean.parseBoolean(properties.getProperty(prefix+"show_refine_supertiles"));
  			if (properties.getProperty(prefix+"show_refine_supertiles")!=null) this.show_refine_supertiles=Boolean.parseBoolean(properties.getProperty(prefix+"show_refine_supertiles"));
  			if (properties.getProperty(prefix+"show_bgnd_nonbgnd")!=null)      this.show_bgnd_nonbgnd=Boolean.parseBoolean(properties.getProperty(prefix+"show_bgnd_nonbgnd"));
  			if (properties.getProperty(prefix+"show_bgnd_nonbgnd")!=null)      this.show_bgnd_nonbgnd=Boolean.parseBoolean(properties.getProperty(prefix+"show_bgnd_nonbgnd"));
@@ -2887,6 +2899,10 @@ public class EyesisCorrectionParameters {
  			gd.addNumericField("Worst case worsening after merge",                                             this.plWorstWorsening,  6);
  			gd.addNumericField("Worst case worsening after merge",                                             this.plWorstWorsening,  6);
  			gd.addCheckbox    ("Keep only mutual links, remove weakest if conflict",                           this.plMutualOnly);
  			gd.addCheckbox    ("Keep only mutual links, remove weakest if conflict",                           this.plMutualOnly);


  			gd.addNumericField("Relative weight of original (measured) plane when combing with neighbors",     this.plPull,  6);
  			gd.addNumericField("Maximal number of smoothing iterations for each step",                         this.plIterations,  0);
  			gd.addNumericField("Maximal step difference (1/power of 10) ",                                     this.plPrecision,  0);

  			gd.addMessage     ("--- Other debug images ---");
  			gd.addMessage     ("--- Other debug images ---");
  			gd.addCheckbox    ("Show 'ortho_combine'",                                                         this.show_ortho_combine);
  			gd.addCheckbox    ("Show 'ortho_combine'",                                                         this.show_ortho_combine);
  			gd.addCheckbox    ("Show 'refine_disparity_supertiles'",                                           this.show_refine_supertiles);
  			gd.addCheckbox    ("Show 'refine_disparity_supertiles'",                                           this.show_refine_supertiles);
@@ -3130,6 +3146,10 @@ public class EyesisCorrectionParameters {
  			this.plWorstWorsening=      gd.getNextNumber();
  			this.plWorstWorsening=      gd.getNextNumber();
  			this.plMutualOnly=          gd.getNextBoolean();
  			this.plMutualOnly=          gd.getNextBoolean();


  			this.plPull=                gd.getNextNumber();
  			this.plIterations=    (int) gd.getNextNumber();
  			this.plPrecision=     (int) gd.getNextNumber();

  			this.show_ortho_combine=    gd.getNextBoolean();
  			this.show_ortho_combine=    gd.getNextBoolean();
  			this.show_refine_supertiles=gd.getNextBoolean();
  			this.show_refine_supertiles=gd.getNextBoolean();
  			this.show_bgnd_nonbgnd=     gd.getNextBoolean(); // first on second pass
  			this.show_bgnd_nonbgnd=     gd.getNextBoolean(); // first on second pass
+1 −1
Original line number Original line Diff line number Diff line
@@ -5126,7 +5126,7 @@ public class QuadCLT {
				  System.out.println("Generating cluster images (limit is set to "+clt_parameters.max_clusters+") largest, scan #"+scanIndex);
				  System.out.println("Generating cluster images (limit is set to "+clt_parameters.max_clusters+") largest, scan #"+scanIndex);
			  }
			  }
//			  ImagePlus cluster_image = getPassImage( // get image form a single pass
//			  ImagePlus cluster_image = getPassImage( // get image form a single pass
			  String texturePath = getPassImage( // get image form a single pass
			  String texturePath = getPassImage( // get image from a single pass
					  clt_parameters,
					  clt_parameters,
					  colorProcParameters,
					  colorProcParameters,
					  rgbParameters,
					  rgbParameters,
+298 −47

File changed.

Preview size limit exceeded, changes collapsed.

+53 −24
Original line number Original line Diff line number Diff line
@@ -57,8 +57,8 @@ public class TilePlanes {
		double []   world_v1 =   null; // world in-plane vector, corresponding to vectors[1] 
		double []   world_v1 =   null; // world in-plane vector, corresponding to vectors[1] 
		double []   world_v2 =   null; // world in-plane vector, corresponding to vectors[1]
		double []   world_v2 =   null; // world in-plane vector, corresponding to vectors[1]
//		double []   daxy      =  null; // disparity and 2 relative angles (ax and ay) corresponding to fisheye view, near (0,0) scale is pixel size
//		double []   daxy      =  null; // disparity and 2 relative angles (ax and ay) corresponding to fisheye view, near (0,0) scale is pixel size
		double [][] neib_match = null; // for each of the directions (N, NE, .. NW) quality match for each layer 
		double [][] merged_eig_val = null; // for each of the directions (N, NE, .. NW) quality match for each layer 
		int    []   neib_best =  new int [8]; // for each of the directions (N, NE, .. NW) index of best match, -1 if none 
		int    []   neib_best =  null; // new int [8]; // for each of the directions (N, NE, .. NW) index of best match, -1 if none 
// stores "worsening" of merging 2 	planes. if L1,L2,L = values[0] of plane1, plane2 plane composite: w1, w2 - weights for plane1, plane2
// stores "worsening" of merging 2 	planes. if L1,L2,L = values[0] of plane1, plane2 plane composite: w1, w2 - weights for plane1, plane2
//		Lav = Math.sqrt((L1 * L1 * w1 + L2 * L2 * w2)/(w1 + w2))
//		Lav = Math.sqrt((L1 * L1 * w1 + L2 * L2 * w2)/(w1 + w2))
// worsening_12 = (L - Lav) * (w1 + w2) * (w1 + w2) / (Lav * x1 * w2)		
// worsening_12 = (L - Lav) * (w1 + w2) * (w1 + w2) / (Lav * x1 * w2)		
@@ -92,18 +92,44 @@ public class TilePlanes {
				pd.vectors[1] = this.vectors[1].clone();
				pd.vectors[1] = this.vectors[1].clone();
				pd.vectors[2] = this.vectors[2].clone();
				pd.vectors[2] = this.vectors[2].clone();
			}
			}
			if (this.neib_match != null){
			copyNeib(this,pd);
				pd.neib_match = this.neib_match.clone();
			/*
				for (int i = 0; i<this.neib_match.length; i++){
			if (this.merged_eig_val != null){
					if (this.neib_match[i] != null){
				pd.merged_eig_val = this.merged_eig_val.clone();
						pd.neib_match[i] = this.neib_match[i].clone();
				for (int i = 0; i<this.merged_eig_val.length; i++){
					if (this.merged_eig_val[i] != null){
						pd.merged_eig_val[i] = this.merged_eig_val[i].clone();
					}
					}
				}
				}
			}
			}
			if (this.neib_best != null) pd.neib_best = this.neib_best.clone();
			if (this.neib_best != null) pd.neib_best = this.neib_best.clone();
			*/
			return pd;
			return pd;
		}
		}
		
		
		public void copyNeib(
				PlaneData src,
				PlaneData dst)
		{
			if (src.merged_eig_val != null){
				dst.merged_eig_val = src.merged_eig_val.clone();
				for (int i = 0; i < src.merged_eig_val.length; i++){
					if (src.merged_eig_val[i] != null){
						dst.merged_eig_val[i] = src.merged_eig_val[i].clone();
					}
				}
			}
			if (src.neib_best != null) dst.neib_best = src.neib_best.clone();
		}
		
		public void invalidateCalculated()
		{
			this.center_xyz = null; // center of this supertile this plane center in world coordinates
			this.world_xyz =  null; // world coordinates of the nearest point of the plane, in meters
			this.world_v1 =   null; // world in-plane vector, corresponding to vectors[1] 
			this.world_v2 =   null; // world in-plane vector, corresponding to vectors[1]
		}
		
		
		
		public PlaneData (
		public PlaneData (
				int [] sTileXY, 
				int [] sTileXY, 
@@ -117,40 +143,40 @@ public class TilePlanes {
			this.sTileXY = sTileXY.clone();
			this.sTileXY = sTileXY.clone();
		}
		}
		
		
		public double [][] initNeibMatch()
		public double [][] initMergedValue()
		{
		{
			this.neib_match = new double[8][];
			this.merged_eig_val = new double[8][];
			return this.neib_match;
			return this.merged_eig_val;
		}
		}
		public double [][] getNeibMatch()
		public double [][] getMergedValue()
		{
		{
			return this.neib_match;
			return this.merged_eig_val;
		}
		}
		public double [] initNeibMatch(int dir, int leng)
		public double [] initMergedValue(int dir, int leng)
		{
		{
			this.neib_match[dir] = new double[leng];
			this.merged_eig_val[dir] = new double[leng];
			for (int i = 0; i < leng; i++) this.neib_match[dir][i] = Double.NaN;
			for (int i = 0; i < leng; i++) this.merged_eig_val[dir][i] = Double.NaN;
			return getNeibMatch(dir);
			return getMergedValue(dir);
		}
		}


		public double [] getNeibMatch(int dir)
		public double [] getMergedValue(int dir)
		{
		{
			if (this.neib_match == null) {
			if (this.merged_eig_val == null) {
				return null;
				return null;
			}
			}
			return this.neib_match[dir];
			return this.merged_eig_val[dir];
		}
		}


		public double getNeibMatch(int dir, int plane)
		public double getMergedValue(int dir, int plane)
		{
		{
			if ((this.neib_match == null) ||(this.neib_match[dir] == null)){
			if ((this.merged_eig_val == null) ||(this.merged_eig_val[dir] == null)){
				return Double.NaN;
				return Double.NaN;
			}
			}
			return this.neib_match[dir][plane];
			return this.merged_eig_val[dir][plane];
		}
		}
		public void setNeibMatch(int dir, int plane, double value)
		public void setNeibMatch(int dir, int plane, double value)
		{
		{
			this.neib_match[dir][plane] = value;
			this.merged_eig_val[dir][plane] = value;
		}
		}


		public int [] initNeibBest()
		public int [] initNeibBest()
@@ -452,6 +478,7 @@ public class TilePlanes {
			
			
			
			
			PlaneData pd = this.clone(); // will copy selections too
			PlaneData pd = this.clone(); // will copy selections too
			pd.invalidateCalculated();   // real world vectors
			pd.setValues(eig_val[oindx][oindx],eig_val[vindx][vindx],eig_val[hindx][hindx]); // eigenvalues [0] - thickness, 2 other to detect skinny (poles)
			pd.setValues(eig_val[oindx][oindx],eig_val[vindx][vindx],eig_val[hindx][hindx]); // eigenvalues [0] - thickness, 2 other to detect skinny (poles)
			pd.setVectors(plane);
			pd.setVectors(plane);
			
			
@@ -477,7 +504,8 @@ public class TilePlanes {
				PlaneData otherPd,
				PlaneData otherPd,
				int       debugLevel)
				int       debugLevel)
		{
		{
			PlaneData pd = otherPd.clone();
			PlaneData pd = otherPd.clone(); // TODO: use clone of this, copy only needed info from otherPD
			// keep world vectors from otherPd
			if (debugLevel > 0) {
			if (debugLevel > 0) {
				System.out.println("getPlaneToThis()");
				System.out.println("getPlaneToThis()");
			}
			}
@@ -596,6 +624,7 @@ public class TilePlanes {
//				System.out.println("getPlaneToThis(): "+pd.sTileXY[0]+":"+pd.sTileXY[1]+" -> "+pd.vectors[0][0]+", disp = "+disp+
//				System.out.println("getPlaneToThis(): "+pd.sTileXY[0]+":"+pd.sTileXY[1]+" -> "+pd.vectors[0][0]+", disp = "+disp+
//						", other_det = "+((new Matrix(otherPd.vectors).det()) +", pdr_det = "+((new Matrix(pd.vectors).det()))));
//						", other_det = "+((new Matrix(otherPd.vectors).det()) +", pdr_det = "+((new Matrix(pd.vectors).det()))));
			}
			}
			copyNeib(this, pd);
			return pd; // make sure pd are updated // "this" is not used. Should it be used instead of pd?  
			return pd; // make sure pd are updated // "this" is not used. Should it be used instead of pd?  
		}
		}
		
		
+29 −13
Original line number Original line Diff line number Diff line
@@ -2823,7 +2823,6 @@ public class TileProcessor {
				clt_parameters.tileX,
				clt_parameters.tileX,
				clt_parameters.tileY); 
				clt_parameters.tileY); 


		if (clt_parameters.plMutualOnly) {
		st.selectNeighborPlanesMutual(
		st.selectNeighborPlanesMutual(
				clt_parameters.plWorstWorsening, // final double worst_worsening,
				clt_parameters.plWorstWorsening, // final double worst_worsening,
				clt_parameters.plMaxEigen,
				clt_parameters.plMaxEigen,
@@ -2831,19 +2830,30 @@ public class TileProcessor {
				0, // final int debugLevel)
				0, // final int debugLevel)
				clt_parameters.tileX,
				clt_parameters.tileX,
				clt_parameters.tileY); 
				clt_parameters.tileY); 
		TilePlanes.PlaneData [][] planes_mod = null;
		if (clt_parameters.plMutualOnly) { // temporarily re-use obsolete parameter to test smoothing
			
			
			planes_mod = st.planesSmooth(
					clt_parameters.plPull,                        // final double      meas_pull,//  relative pull of the original (measured) plane with respect to the average of the neighbors
					clt_parameters.plIterations,                  // final int         num_passes,
					Math.pow(10.0,  -clt_parameters.plPrecision), // final double      maxDiff, // maximal change in any of the disparity values
					0, // final int debugLevel)
					clt_parameters.tileX,
					clt_parameters.tileY); 


		} else {
//		} else {
			st.selectNeighborPlanes(
//			st.selectNeighborPlanes(
					clt_parameters.plWorstWorsening, // final double worst_worsening,
//					clt_parameters.plWorstWorsening, // final double worst_worsening,
					clt_parameters.plMutualOnly, // final boolean mutual_only,
//					clt_parameters.plMutualOnly, // final boolean mutual_only,
					0); // final int debugLevel)
//					0); // final int debugLevel)
		}
		}
		
		
		if (clt_parameters.show_planes){
		if (clt_parameters.show_planes){
			
			
			int [] wh = st.getShowPlanesWidthHeight();
			int [] wh = st.getShowPlanesWidthHeight();
			double [][] plane_data_nonan = st.getShowPlanes(
			double [][] plane_data_nonan = st.getShowPlanes(
					st.getPlanes(),
					(planes_mod != null) ? st.getPlanesMod():st.getPlanes(),
					clt_parameters.plMinStrength, //  minWeight,
					clt_parameters.plMinStrength, //  minWeight,
					clt_parameters.plMaxEigen, //  maxEigen,
					clt_parameters.plMaxEigen, //  maxEigen,
					clt_parameters.plDispNorm,
					clt_parameters.plDispNorm,
@@ -2851,7 +2861,7 @@ public class TileProcessor {
					0.0,
					0.0,
					10.0);
					10.0);
			double [][] plane_data_nan = st.getShowPlanes(
			double [][] plane_data_nan = st.getShowPlanes(
					st.getPlanes(),
					(planes_mod != null) ? st.getPlanesMod():st.getPlanes(),
					clt_parameters.plMinStrength, //  minWeight,
					clt_parameters.plMinStrength, //  minWeight,
					clt_parameters.plMaxEigen, //  maxEigen,
					clt_parameters.plMaxEigen, //  maxEigen,
					clt_parameters.plDispNorm,
					clt_parameters.plDispNorm,
@@ -2870,6 +2880,12 @@ public class TileProcessor {
//			sdfa_instance.showArrays(plane_data_nonan, wh[0], wh[1], true, "plane_data_noNaN");
//			sdfa_instance.showArrays(plane_data_nonan, wh[0], wh[1], true, "plane_data_noNaN");
//			sdfa_instance.showArrays(plane_data_nan, wh[0], wh[1], true, "plane_data_NaN");
//			sdfa_instance.showArrays(plane_data_nan, wh[0], wh[1], true, "plane_data_NaN");
			sdfa_instance.showArrays(plane_data, wh[0], wh[1], true, "plane_data");
			sdfa_instance.showArrays(plane_data, wh[0], wh[1], true, "plane_data");
			
			
			
			
			
			
			// show plane data
			// show plane data


/*			
/*