code: package resa.evaluation.topology.tomVLD;
  
  /**
   * Parameters for detection.
   */
  public class Parameters {
      public SIFTParameters getSiftParameters() {
          return siftParameters;
      }
  
      public void setSiftParameters(SIFTParameters siftParameters) {
          this.siftParameters = siftParameters;
      }
  
      public RANSACParameters getRansacParameters() {
          return ransacParameters;
      }
  
      public void setRansacParameters(RANSACParameters ransacParameters) {
          this.ransacParameters = ransacParameters;
      }
  
      public MatchingParameters getMatchingParameters() {
          return matchingParameters;
      }
  
      public void setMatchingParameters(MatchingParameters matchingParameters) {
          this.matchingParameters = matchingParameters;
      }
  
      public WindowParameters getWindowParameters() {
          return windowParameters;
      }
  
      public void setWindowParameters(WindowParameters windowParameters) {
          this.windowParameters = windowParameters;
      }
  
  
      public static class SIFTParameters {
          private double contrastThreshold, edgeThreshold, sigma;
          public SIFTParameters() {
              contrastThreshold = 0.04;
              edgeThreshold = 10;
              sigma = 2.0;
          }
          public SIFTParameters withContrastThreshold(double threshold) {
              this.contrastThreshold = threshold;
              return this;
          }
          public SIFTParameters withEdgeThreshold(double threshold) {
              this.edgeThreshold = threshold;
              return this;
          }
          public SIFTParameters withSigma(double sigma) {
              this.sigma = sigma;
              return this;
          }
  
          public double getContrastThreshold() {
              return contrastThreshold;
          }
  
          public void setContrastThreshold(double contrastThreshold) {
              this.contrastThreshold = contrastThreshold;
          }
  
          public double getEdgeThreshold() {
              return edgeThreshold;
          }
  
          public void setEdgeThreshold(double edgeThreshold) {
              this.edgeThreshold = edgeThreshold;
          }
  
          public double getSigma() {
              return sigma;
          }
  
          public void setSigma(double sigma) {
              this.sigma = sigma;
          }
      }
      public static class RANSACParameters {
          private double reprojectionThreshold;
          public RANSACParameters() {
              reprojectionThreshold = 1.0;
          }
          public RANSACParameters withReprojectionThreshold(double threshold) {
              this.reprojectionThreshold = threshold;
              return this;
          }
  
          public double getReprojectionThreshold() {
              return reprojectionThreshold;
          }
  
          public void setReprojectionThreshold(double reprojectionThreshold) {
              this.reprojectionThreshold = reprojectionThreshold;
          }
      }
      public static class MatchingParameters {
          private int minimalNumberOfMatches;
          private double ratioOfDistances;
          private int minimalResolution;
          private double boxAccuracy;
          public MatchingParameters() {
              minimalNumberOfMatches = 8;
              ratioOfDistances = 0.8;
              minimalResolution = 5; //pixels
              boxAccuracy = 0.9;
          }
  
          public MatchingParameters withMinimalNumberOfMatches(int minimalNumberOfMatches) {
              this.minimalNumberOfMatches = minimalNumberOfMatches;
              return this;
          }
  
          public int getMinimalNumberOfMatches() {
              return minimalNumberOfMatches;
          }
  
          public void setMinimalNumberOfMatches(int minimalNumberOfMatches) {
              this.minimalNumberOfMatches = minimalNumberOfMatches;
          }
  
          public double getRatioOfDistances() {
              return ratioOfDistances;
          }
  
          public void setRatioOfDistances(double ratioOfDistances) {
              this.ratioOfDistances = ratioOfDistances;
          }
  
          public int getMinimalResolution() {
              return minimalResolution;
          }
  
          public void setMinimalResolution(int minimalResolution) {
              this.minimalResolution = minimalResolution;
          }
  
          public double getBoxAccuracy() {
              return boxAccuracy;
          }
  
          public void setBoxAccuracy(double boxAccuracy) {
              this.boxAccuracy = boxAccuracy;
          }
      }
      public static class WindowParameters {
          private double [] windowSizes;
          private double xStep, yStep;
          public WindowParameters() {
              windowSizes = new double[]{.25}; // by default 1/4 of the frame
              xStep = .33; // in terms of window size
              yStep = .33;
          }
  
          public double[] getWindowSizes() {
              return windowSizes;
          }
  
          public void setWindowSizes(double[] windowSizes) {
              this.windowSizes = windowSizes;
          }
  
          public double getyStep() {
              return yStep;
          }
  
          public void setyStep(double yStep) {
              this.yStep = yStep;
          }
  
          public double getxStep() {
              return xStep;
          }
  
          public void setxStep(double xStep) {
              this.xStep = xStep;
          }
      }
  
  
      private SIFTParameters siftParameters;
      private RANSACParameters ransacParameters;
      private MatchingParameters matchingParameters;
      private WindowParameters windowParameters;
  
      public Parameters() {
          siftParameters = new SIFTParameters();
          ransacParameters = new RANSACParameters();
          matchingParameters = new MatchingParameters();
          windowParameters = new WindowParameters();
      }
      public Parameters withSIFTParameters(SIFTParameters siftParameters) {
          this.siftParameters = siftParameters;
          return this;
      }
      public Parameters withRANSACParameters(RANSACParameters ransacParameters) {
          this.ransacParameters = ransacParameters;
          return this;
      }
      public Parameters withMatchingParameters(MatchingParameters matchingParameters) {
          this.matchingParameters = matchingParameters;
          return this;
      }
      public Parameters withWindowParameters(WindowParameters windowParameters) {
          this.windowParameters = windowParameters;
          return this;
      }
  
  }
  