diff --git a/LinearRegressionTool/pom.xml b/LinearRegressionTool/pom.xml index 7f049aa..3653ea1 100644 --- a/LinearRegressionTool/pom.xml +++ b/LinearRegressionTool/pom.xml @@ -1,53 +1,126 @@ - 4.0.0 + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - wwu - masterarbeit - 1.0-SNAPSHOT - - - - org.apache.maven.plugins - maven-compiler-plugin - - 1.8 - 1.8 - - - - + wwu + Masterarbeit + 1.0 + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + - - - - org.jfree - jfreechart - 1.0.14 - + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4.1 + + + + jar-with-dependencies + + + + + App + + - - - junit - junit - 4.12 - + + + + make-assembly + + package + + single + + + + + + com.googlecode.mavennatives + maven-nativedependencies-plugin + 0.0.7 + + + unpacknatives + generate-resources + + copy + + + + - - - com.opencsv - opencsv - 3.9 - + + - - - com.jtattoo - JTattoo - 1.6.11 - - + + + + + org.jfree + jfreechart + 1.0.14 + + + + + junit + junit + 4.12 + + + + + com.opencsv + opencsv + 3.9 + + + + + com.jtattoo + JTattoo + 1.6.11 + + + + + org + opencv + 2.4.13 + ${project.basedir}/src/main/resources/libs/opencv-2413.jar + + + + org + opencv + 2.4.13 + system + dll + ${project.basedir}/src/main/resources/libs/x64/opencv_java2413.dll + native-all + + + + + org.apache.commons + commons-io + 1.3.2 + + + \ No newline at end of file diff --git a/LinearRegressionTool/src/main/java/App.java b/LinearRegressionTool/src/main/java/App.java index ff5755b..03ce55b 100644 --- a/LinearRegressionTool/src/main/java/App.java +++ b/LinearRegressionTool/src/main/java/App.java @@ -1,12 +1,16 @@ import model.LineModel; + +import org.apache.commons.io.IOUtils; import org.opencv.core.Core; import presenter.Presenter; -import presenter.evaluation.PictureProcessor; import view.MainFrame; import javax.swing.*; import java.awt.*; -import java.lang.reflect.InvocationTargetException; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -17,7 +21,33 @@ import java.lang.reflect.InvocationTargetException; */ public class App { - static {System.loadLibrary(Core.NATIVE_LIBRARY_NAME);} + + + private static void loadLibrary() { + try { + InputStream in = null; + File fileOut = null; + String osName = System.getProperty("os.name"); + + int bitness = Integer.parseInt(System.getProperty("sun.arch.data.model")); + if(bitness == 32){ + in = App.class.getResourceAsStream("/libs/x86/opencv_java2413.dll"); + fileOut = File.createTempFile("tmp", ".dll"); + } + else if (bitness == 64){ + in = App.class.getResourceAsStream("/libs/x64/opencv_java2413.dll"); + fileOut = File.createTempFile("tmp", ".dll"); + } + + OutputStream out = new FileOutputStream(fileOut); + IOUtils.copy(in, out); + in.close(); + out.close(); + System.load(fileOut.toString()); + } catch (Exception e) { + throw new RuntimeException("Failed to load opencv native library", e); + } + } private static void setUIFont(javax.swing.plaf.FontUIResource f) { java.util.Enumeration keys = UIManager.getDefaults().keys(); @@ -32,10 +62,10 @@ public class App { private static void setLookAndFeel(JFrame view) { String[] laf = {"com.jtattoo.plaf.aluminium.AluminiumLookAndFeel", - "com.jtattoo.plaf.acryl.AcrylLookAndFeel", - "com.jtattoo.plaf.aero.AeroLookAndFeel", - "com.jtattoo.plaf.fast.FastLookAndFeel", - "com.jtattoo.plaf.graphite.GraphiteLookAndFeel"}; + "com.jtattoo.plaf.acryl.AcrylLookAndFeel", + "com.jtattoo.plaf.aero.AeroLookAndFeel", + "com.jtattoo.plaf.fast.FastLookAndFeel", + "com.jtattoo.plaf.graphite.GraphiteLookAndFeel"}; try { UIManager.setLookAndFeel(laf[4]); } catch (ClassNotFoundException e) { @@ -51,6 +81,7 @@ public class App { } public static void main(String[] args) { + loadLibrary(); final Presenter presenter = new Presenter(new LineModel(), null); diff --git a/LinearRegressionTool/src/main/java/model/Line.java b/LinearRegressionTool/src/main/java/model/Line.java index f97cbad..8701eb3 100644 --- a/LinearRegressionTool/src/main/java/model/Line.java +++ b/LinearRegressionTool/src/main/java/model/Line.java @@ -103,8 +103,8 @@ public class Line { this.y2 = y2; } - public boolean equals(Line other){ - if (other.getM() == this.getM() && other.getB() == this.getB()){ + public boolean equals(Line other) { + if (other.getM() == this.getM() && other.getB() == this.getB()) { return true; } else { return false; diff --git a/LinearRegressionTool/src/main/java/model/LineModel.java b/LinearRegressionTool/src/main/java/model/LineModel.java index 85b70b1..7089b2b 100644 --- a/LinearRegressionTool/src/main/java/model/LineModel.java +++ b/LinearRegressionTool/src/main/java/model/LineModel.java @@ -1,11 +1,7 @@ package model; -import sun.awt.image.ImageWatched; - import java.util.ArrayList; -import java.util.Collections; import java.util.LinkedList; -import java.util.List; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -90,7 +86,7 @@ public class LineModel { this.yMaximum = yMaximum; } - public void resetRanges(){ + public void resetRanges() { xMinimum = Double.MAX_VALUE; xMaximum = Double.MIN_VALUE; yMinimum = Double.MAX_VALUE; diff --git a/LinearRegressionTool/src/main/java/model/Point.java b/LinearRegressionTool/src/main/java/model/Point.java index 42d7fa4..632c038 100644 --- a/LinearRegressionTool/src/main/java/model/Point.java +++ b/LinearRegressionTool/src/main/java/model/Point.java @@ -55,8 +55,8 @@ public class Point implements Comparable { } } - public boolean equals(Point other){ - if (other.getX() == this.getX() && other.getY() == this.getY()){ + public boolean equals(Point other) { + if (other.getX() == this.getX() && other.getY() == this.getY()) { return true; } else { return false; diff --git a/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java b/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java index b822c87..4bab02b 100644 --- a/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java +++ b/LinearRegressionTool/src/main/java/presenter/AbstractPresenter.java @@ -1,9 +1,7 @@ package presenter; -import model.Interval; import model.LineModel; import presenter.algorithms.util.IntersectionComputer; -import presenter.algorithms.util.IntersectionCounter; import presenter.evaluation.EvaluateAlgorithms; import view.MainFrame; @@ -111,8 +109,8 @@ public abstract class AbstractPresenter implements Observer { getView().enableFunctionality(); getView().getProgressDialog().dispose(); getView().logHeading("Import aus Datei"); - getView().log("Anzahl der Geraden: "+ getModel().getLines().size() + "."); - getView().log("Anzahl der Schnittpunkte: "+getModel().getNodes().size()+"."); + getView().log("Anzahl der Geraden: " + getModel().getLines().size() + "."); + getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + "."); getView().logSuccess("Import war Erfolgreich!
"); }); } else { @@ -152,8 +150,8 @@ public abstract class AbstractPresenter implements Observer { SwingUtilities.invokeLater(() -> { getView().enableFunctionality(); getView().logHeading("Import eines Bildes"); - getView().log("Anzahl der Geraden: "+ getModel().getLines().size() + "."); - getView().log("Anzahl der Schnittpunkte: "+getModel().getNodes().size()+"."); + getView().log("Anzahl der Geraden: " + getModel().getLines().size() + "."); + getView().log("Anzahl der Schnittpunkte: " + getModel().getNodes().size() + "."); getView().logSuccess("Der Import war Erfolgreich!
"); }); @@ -161,8 +159,6 @@ public abstract class AbstractPresenter implements Observer { } - - public void calculateIntersections() { try { Thread thread = new Thread(() -> { diff --git a/LinearRegressionTool/src/main/java/presenter/Presenter.java b/LinearRegressionTool/src/main/java/presenter/Presenter.java index 9916fad..2ba8be3 100644 --- a/LinearRegressionTool/src/main/java/presenter/Presenter.java +++ b/LinearRegressionTool/src/main/java/presenter/Presenter.java @@ -23,7 +23,7 @@ import java.io.File; * @Email: a_wolf28@uni-muenster.de * @Date: 28.05.2017. */ -public class Presenter extends AbstractPresenter{ +public class Presenter extends AbstractPresenter { /* Threads */ private Thread tsThread; @@ -118,9 +118,9 @@ public class Presenter extends AbstractPresenter{ public void startImport(File file) { if (importThread == null || !importThread.isAlive()) { importThread = new Thread(() -> { - DataImporter importer = new DataImporter(file, this); + DataImporter importer = new DataImporter(file); importer.addObserver(this); - importer.run(); + getModel().setLines(importer.run()); }); importThread.start(); try { @@ -131,7 +131,7 @@ public class Presenter extends AbstractPresenter{ } } - public void startPictureDataImport(File file){ + public void startPictureDataImport(File file) { if (importPictureThread == null || !importPictureThread.isAlive()) { importPictureThread = new Thread(() -> { PictureProcessor pictureProcessor = new PictureProcessor(this, file); @@ -147,13 +147,28 @@ public class Presenter extends AbstractPresenter{ } - } public void startExport(File file) { if (exportThread == null || !exportThread.isAlive()) { exportThread = new Thread(() -> { - DataExporter exporter = new DataExporter(getModel(), file); + DataExporter exporter = new DataExporter(getModel().getLines(), file); + exporter.addObserver(this); + exporter.export(); + }); + exportThread.start(); + try { + exportThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + public void startDatasetExportEvaluation(File file) { + if (exportThread == null || !exportThread.isAlive()) { + exportThread = new Thread(() -> { + DataExporter exporter = new DataExporter(getEval().getData(), file); exporter.addObserver(this); exporter.export(); }); @@ -214,4 +229,20 @@ public class Presenter extends AbstractPresenter{ evalThread.start(); } } + + public void startEvaluation(int typ, int n, int alg, File file) { + + if (evalThread == null || !evalThread.isAlive()) { + evalThread = new Thread(() -> { + try { + setEval(new EvaluateAlgorithms(typ, n, alg, file)); + getEval().addObserver(this); + getEval().run(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }); + evalThread.start(); + } + } } diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java index 00aa371..7bb3b49 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java @@ -23,13 +23,13 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { private Double ds, b, m; public NaivLeastMedianOfSquaresEstimator(LinkedList lines) { - for (Line l :lines){ - set.add(new Point(l.getM(),l.getB())); + for (Line l : lines) { + set.add(new Point(l.getM(), l.getB())); } } - private void crudeAlg(){ + private void crudeAlg() { ds = Double.MAX_VALUE; b = 0d; m = 0d; @@ -37,21 +37,21 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { Double beta; Double alpha; Double dijk; - for (Point i : set){ + for (Point i : set) { for (Point j : set) { - for (Point k : set){ + for (Point k : set) { triple.add(i); triple.add(j); triple.add(k); Collections.sort(triple); - beta = (triple.get(0).getY() - triple.get(2).getY()) / (triple.get(0).getX() - triple.get(2).getX()); - alpha = (triple.get(1).getY() + triple.get(2).getY() - ( beta * (triple.get(1).getX() + triple.get(2).getX()))) / 2f; - dijk = f(alpha, beta); - if (dijk < ds){ + beta = (triple.get(0).getY() - triple.get(2).getY()) / (triple.get(0).getX() - triple.get(2).getX()); + alpha = (triple.get(1).getY() + triple.get(2).getY() - (beta * (triple.get(1).getX() + triple.get(2).getX()))) / 2f; + dijk = f(alpha, beta); + if (dijk < ds) { ds = dijk; b = alpha; m = beta; - // System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,b,m); + // System.out.printf("Distanz: %6.2f\tAlpha: %6.2f\tBeta: %6.2f",ds,b,m); } triple.clear(); } @@ -61,13 +61,12 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { } - - private Double f(Double a, Double b){ + private Double f(Double a, Double b) { ArrayList res = new ArrayList<>(); - for (Point p : set){ + for (Point p : set) { res.add(Math.abs(p.getY() - (a + b * p.getX()))); } - return FastElementSelector.randomizedSelect(res, res.size()/2); + return FastElementSelector.randomizedSelect(res, res.size() / 2); } @Override diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java index d8b2f4c..9931444 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java @@ -16,7 +16,7 @@ import java.util.LinkedList; * @Email: a_wolf28@uni-muenster.de * @Date: 15.09.2017. */ -public class NaivRepeatedMedianEstimator implements Algorithm{ +public class NaivRepeatedMedianEstimator implements Algorithm { private LinkedList lines; private HashMap> slopesPerLine; @@ -36,7 +36,7 @@ public class NaivRepeatedMedianEstimator implements Algorithm{ @Override public void run() { //init the List for the slopes - for (int j=0;j()); @@ -49,8 +49,8 @@ public class NaivRepeatedMedianEstimator implements Algorithm{ //calculate all slopes for each line Point ret; - for (int i=0;i lineA.getM()){ + if (lineB.getM() > lineA.getM()) { xi = lineA.getM(); yi = lineA.getB(); xj = lineB.getM(); @@ -106,9 +106,9 @@ public class NaivRepeatedMedianEstimator implements Algorithm{ } - Double m = (yj - yi) / (xj -xi); - Double b = ((xj * yi) - (xi * yj)) / (xj - xi); - return new Point(m,b); + Double m = (yj - yi) / (xj - xi); + Double b = ((xj * yi) - (xi * yj)) / (xj - xi); + return new Point(m, b); } public Double getM() { diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java index d854ca3..875f609 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java @@ -48,15 +48,15 @@ public class NaivTheilSenEstimator implements Algorithm { ArrayList list1 = new ArrayList<>(); ArrayList list2 = new ArrayList<>(); - for (int i=0;i compute(){ + public ArrayList compute() { if (lines.size() >= 12) { worker[0] = new Thread(() -> { @@ -77,12 +77,12 @@ public class IntersectionComputer { } - private synchronized void work(List lines){ + private synchronized void work(List lines) { IntersectionCounter counter = new IntersectionCounter(); counter.run(lines, new Interval(-99999, 99999)); ArrayList points = counter.calculateIntersectionAbscissas(); - for (Point p :points){ - if (!isFound(p)){ + for (Point p : points) { + if (!isFound(p)) { addIntersection(p); setRanges(p); } @@ -94,19 +94,19 @@ public class IntersectionComputer { return lines; } - public synchronized void addIntersection(Point p){ + public synchronized void addIntersection(Point p) { this.intersections.add(p); } - public synchronized boolean isFound(Point p){ - if (intersections.contains(p)){ + public synchronized boolean isFound(Point p) { + if (intersections.contains(p)) { return true; } else { return false; } } - public synchronized void setRanges(Point point){ + public synchronized void setRanges(Point point) { xMaximum = (point.getX() > xMaximum) ? point.getX() : xMaximum; xMinimum = (point.getX() < xMinimum) ? point.getX() : xMinimum; yMaximum = (point.getY() > yMaximum) ? point.getY() : yMaximum; diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java b/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java index caf128a..2e0d2d7 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java @@ -4,15 +4,17 @@ import model.Interval; import model.Line; import model.LineModel; import model.Point; +import presenter.algorithms.advanced.LeastMedianOfSquaresEstimator; +import presenter.algorithms.advanced.RepeatedMedianEstimator; +import presenter.algorithms.advanced.TheilSenEstimator; import presenter.algorithms.naiv.NaivLeastMedianOfSquaresEstimator; import presenter.algorithms.naiv.NaivRepeatedMedianEstimator; import presenter.algorithms.naiv.NaivTheilSenEstimator; import presenter.algorithms.util.IntersectionCounter; -import presenter.algorithms.advanced.LeastMedianOfSquaresEstimator; -import presenter.algorithms.advanced.RepeatedMedianEstimator; -import presenter.algorithms.advanced.TheilSenEstimator; import presenter.generator.DatasetGenerator; +import presenter.io.DataImporter; +import java.io.File; import java.util.ArrayList; import java.util.LinkedList; import java.util.Observable; @@ -45,7 +47,7 @@ public class EvaluateAlgorithms extends Observable { private DatasetGenerator generator; - private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE","Steigung","y-Achsenabschnitt", "S-MSE", "S-RMSE", "S-MAE", "S-MDAE", "Brute-force Steigung", "Brute-force y-Achsenabschnitt"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE","Steigung","y-Achsenabschnitt"}}; + private String[][] names = {{"MSE", "RMSE", "MAE", "MDAE", "Steigung", "y-Achsenabschnitt", "S-MSE", "S-RMSE", "S-MAE", "S-MDAE", "Brute-force Steigung", "Brute-force y-Achsenabschnitt"}, {"MAPE", "MDAPE", "RMSPE", "RMDSPE", "Steigung", "y-Achsenabschnitt"}}; //übergebene Parameter private int type; @@ -96,6 +98,30 @@ public class EvaluateAlgorithms extends Observable { tsP = new ArrayList<>(arrangement.getNodes()); } + + public EvaluateAlgorithms(int type, int n, int alg, File file) { + this.arrangement = new LineModel(); + + DataImporter importer = new DataImporter(file); + this.arrangement.setLines(importer.run()); + + this.type = type; + this.iterations = n; + this.alg = alg; + + IntersectionCounter counter = new IntersectionCounter(); + counter.run(arrangement.getLines(), new Interval(-99999, 99999)); + counter.calculateIntersectionAbscissas(arrangement); + + + lmsL = new LinkedList<>(arrangement.getLines()); + rmL = new LinkedList<>(arrangement.getLines()); + tsL = new LinkedList<>(arrangement.getLines()); + + lmsP = new ArrayList<>(arrangement.getNodes()); + tsP = new ArrayList<>(arrangement.getNodes()); + } + public void run() throws InterruptedException { setChanged(); String[] msg = {"eval-dataset-generated"}; @@ -134,8 +160,8 @@ public class EvaluateAlgorithms extends Observable { t.join(); result = getScaleDependentMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]); - result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1],m[0], b[0])); - Double[] tmp = {lmsRes[0], lmsRes[1],m[0], b[0]}; + result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1], m[0], b[0])); + Double[] tmp = {lmsRes[0], lmsRes[1], m[0], b[0]}; sendPlotLineResults(tmp, 0); } else if (alg == 1) { final double[] m = new double[1]; @@ -149,8 +175,8 @@ public class EvaluateAlgorithms extends Observable { t.start(); startRM(); result = getScaleDependentMeasure(arrangement.getLines(), rmRes[0], rmRes[1]); - result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1],m[0], b[0])); - Double[] tmp = {rmRes[0], rmRes[1],m[0], b[0]}; + result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1], m[0], b[0])); + Double[] tmp = {rmRes[0], rmRes[1], m[0], b[0]}; sendPlotLineResults(tmp, 1); } else { final double[] m = new double[1]; @@ -164,8 +190,8 @@ public class EvaluateAlgorithms extends Observable { t.start(); startTS(); result = getScaleDependentMeasure(arrangement.getLines(), tsRes[0], tsRes[1]); - result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1],m[0], b[0])); - Double[] tmp = {tsRes[0], tsRes[1],m[0], b[0]}; + result.addAll(getScaledErrorBasedMeasure(arrangement.getLines(), tsRes[0], tsRes[1], m[0], b[0])); + Double[] tmp = {tsRes[0], tsRes[1], m[0], b[0]}; sendPlotLineResults(tmp, 2); } sendTableApproximationTypes(); @@ -186,7 +212,7 @@ public class EvaluateAlgorithms extends Observable { lineRes = new ArrayList<>(); lineRes.add(lmsRes); lineRes.add(rmRes); - sendPloteLineResults(lineRes, new Integer[]{0,1}); + sendPloteLineResults(lineRes, new Integer[]{0, 1}); break; case 4: @@ -298,7 +324,7 @@ public class EvaluateAlgorithms extends Observable { lines.add("lines-res"); lines.add("" + alg); //lms res - for (int i=0;i { - LeastMedianOfSquaresEstimator lmsAlg = new LeastMedianOfSquaresEstimator(lmsL,lmsP); + LeastMedianOfSquaresEstimator lmsAlg = new LeastMedianOfSquaresEstimator(lmsL, lmsP); lmsAlg.run(); lmsAlg.getResult(); lmsRes[0] = lmsAlg.getSlope(); @@ -347,7 +373,7 @@ public class EvaluateAlgorithms extends Observable { public void startTS() throws InterruptedException { tsThread = new Thread(() -> { - TheilSenEstimator tsAlg = new TheilSenEstimator(tsL,tsP); + TheilSenEstimator tsAlg = new TheilSenEstimator(tsL, tsP); tsAlg.run(); tsAlg.getResult(); tsRes[0] = tsAlg.getSlope(); @@ -358,7 +384,6 @@ public class EvaluateAlgorithms extends Observable { } - public ArrayList getScaleDependentMeasure(final LinkedList lines, final Double m, final Double b) { ScaleDependentMeasure scaleDependentMeasure = new ScaleDependentMeasure(lines, m, b); ArrayList ret = new ArrayList<>(); diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java index 9eb0563..c896cab 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java @@ -1,8 +1,8 @@ package presenter.evaluation; -import jdk.nashorn.internal.scripts.JD; + import model.Line; import org.opencv.core.*; -import org.opencv.highgui.*; +import org.opencv.highgui.Highgui; import org.opencv.imgproc.Imgproc; import presenter.Presenter; @@ -20,7 +20,7 @@ import java.util.Observable; * @Email: a_wolf28@uni-muenster.de * @Date: 17.09.2017. */ -public class PictureProcessor extends Observable{ +public class PictureProcessor extends Observable { private Mat image; private Mat contour; @@ -29,43 +29,43 @@ public class PictureProcessor extends Observable{ private ArrayList contours; private double contourLength; - public PictureProcessor(Presenter presenter, File file) { + public PictureProcessor(Presenter presenter, File file) { this.file = file; this.presenter = presenter; } - public void run(){ + public void run() { image = Highgui.imread(file.getAbsolutePath()); contour = process(image); contourLength = image.width() * 0.3; createInputData(); } - private Mat process(Mat image){ + private Mat process(Mat image) { Mat threshold = new Mat(image.width(), image.height(), CvType.CV_8UC1); Mat source = new Mat(image.width(), image.height(), CvType.CV_8UC1); Imgproc.cvtColor(image, source, Imgproc.COLOR_BGR2GRAY); - Imgproc.GaussianBlur(source, threshold, new Size(3,3),0,0); - Imgproc.Canny(threshold, source,300,600,5,true); + Imgproc.GaussianBlur(source, threshold, new Size(3, 3), 0, 0); + Imgproc.Canny(threshold, source, 300, 600, 5, true); //Konturen berechnen und filtern contours = new ArrayList<>(); - Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0)); + Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0)); Mat viscont = new Mat(source.size(), source.type()); double minArea = 50; double maxArea = 0.2 * image.cols() * image.rows(); - for (int i=0;i acutualArea) { Imgproc.drawContours(viscont, contours, i, new Scalar(255, 0, 0), 1); } } Mat resized = new Mat(); - Imgproc.resize(viscont, resized,new Size(560,560)); + Imgproc.resize(viscont, resized, new Size(560, 560)); SwingUtilities.invokeLater(() -> { JDialog dialog = new JDialog(); - dialog.setSize(560,560); + dialog.setSize(560, 560); JLabel label = new JLabel(); - label.setSize(560,560); + label.setSize(560, 560); label.setIcon(new ImageIcon(toBufferedImage(resized))); dialog.add(label); dialog.setVisible(true); @@ -89,12 +89,12 @@ public class PictureProcessor extends Observable{ } - private void createInputData(){ + private void createInputData() { Thread t = new Thread(() -> { double minArea = 50; double maxArea = 0.2 * image.cols() * image.rows(); int id = 0; - for (int j=0;j acutualArea) { diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java b/LinearRegressionTool/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java index b263d15..cdb9936 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/ScaledErrorBasedMeasure.java @@ -37,7 +37,7 @@ public class ScaledErrorBasedMeasure { sampsonError.add(e); } - for (int i=0;i lines; private File file; - public DataExporter(LineModel model, File file) { + public DataExporter(LinkedList lines, File file) { this.file = file; - this.lineModel = model; + this.lines = lines; } public void export() { @@ -33,7 +34,7 @@ public class DataExporter extends Observable { writer = new CSVWriter(new FileWriter(file), ','); // feed in your array (or convert your data to an array) String[] entries = new String[3]; - for (Line line : lineModel.getLines()) { + for (Line line : lines) { entries[0] = line.getId(); entries[1] = line.getM().toString(); Double tmp = (-1) * line.getB(); diff --git a/LinearRegressionTool/src/main/java/presenter/io/DataImporter.java b/LinearRegressionTool/src/main/java/presenter/io/DataImporter.java index edc30d4..47fb374 100644 --- a/LinearRegressionTool/src/main/java/presenter/io/DataImporter.java +++ b/LinearRegressionTool/src/main/java/presenter/io/DataImporter.java @@ -1,14 +1,15 @@ package presenter.io; +import com.opencsv.CSVReader; import model.Line; import model.LineModel; import presenter.Presenter; -import com.opencsv.CSVReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.util.LinkedList; import java.util.List; import java.util.Observable; @@ -24,17 +25,10 @@ public class DataImporter extends Observable { private File file; private CSVReader reader; - private LineModel model; - private Presenter presenter; - public DataImporter(File file, Presenter presenter) { - this.model = new LineModel(); - this.presenter = presenter; - this.presenter.setModel(this.model); + public DataImporter(File file) { //System.out.println(this.model.getLines().size()+ " die Anzahl der aktuellen Lines."); - - this.file = file; try { @@ -44,8 +38,9 @@ public class DataImporter extends Observable { } } - public void run() { + public LinkedList run() { + LinkedList list = new LinkedList<>(); try { List lines = reader.readAll(); int counter = 0; @@ -57,8 +52,8 @@ public class DataImporter extends Observable { Double y = Double.parseDouble(nextLine[2]) * (-1); Line line = new Line(x, y); line.setId(counter + ""); - if (!this.presenter.getModel().getLines().contains(line)) { - this.presenter.getModel().addLine(line); + if (!list.contains(line)) { + list.add(line); } //System.out.format("|\t\t\t\t\t %-11d \t|\t\t\t\t\t %-11f \t|\t\t\t\t\t %-11f \t\t\t\t\t|\n", id,x,y); setChanged(); @@ -74,6 +69,7 @@ public class DataImporter extends Observable { } catch (InterruptedException e) { e.printStackTrace(); } + return list; } } diff --git a/LinearRegressionTool/src/main/java/view/MainFrame.java b/LinearRegressionTool/src/main/java/view/MainFrame.java index 2fc754c..df0fdb7 100644 --- a/LinearRegressionTool/src/main/java/view/MainFrame.java +++ b/LinearRegressionTool/src/main/java/view/MainFrame.java @@ -5,7 +5,10 @@ import model.Line; import presenter.AbstractPresenter; import presenter.Presenter; import view.listener.*; -import view.panels.*; +import view.panels.DualityPanel; +import view.panels.EvaluationPanel; +import view.panels.InfoPanel; +import view.panels.PlotPanel; import view.panels.tabs.LMSPanel; import view.panels.tabs.RMPanel; import view.panels.tabs.TSPanel; @@ -282,7 +285,7 @@ public class MainFrame extends JFrame { private void setDimensions() { this.setExtendedState(JFrame.MAXIMIZED_BOTH); - this.setMinimumSize(new Dimension(1024,768)); + this.setMinimumSize(new Dimension(1024, 768)); this.setResizable(true); GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); this.setMaximizedBounds(env.getMaximumWindowBounds()); @@ -360,8 +363,8 @@ public class MainFrame extends JFrame { lmsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), lmsPanel)); rmPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), rmPanel)); tsPanel.getStartButton().addActionListener(new StartAlgorithmListener(((Presenter) getPresenter()), tsPanel)); - importButton.addActionListener(new ImportDataListener((Presenter) this.getPresenter() , this)); - exportButton.addActionListener(new ExportDataListener((Presenter) this.getPresenter() , this)); + importButton.addActionListener(new ImportDataListener((Presenter) this.getPresenter(), this)); + exportButton.addActionListener(new ExportDataListener((Presenter) this.getPresenter(), this)); generateButton.addActionListener(new GenerateDataListener((Presenter) this.getPresenter())); } diff --git a/LinearRegressionTool/src/main/java/view/MenuBar.java b/LinearRegressionTool/src/main/java/view/MenuBar.java index 5e7e350..677a673 100644 --- a/LinearRegressionTool/src/main/java/view/MenuBar.java +++ b/LinearRegressionTool/src/main/java/view/MenuBar.java @@ -1,7 +1,6 @@ package view; import presenter.Presenter; -import view.MainFrame; import view.listener.ExportDataListener; import view.listener.GenerateDataListener; import view.listener.ImportDataListener; @@ -9,7 +8,6 @@ import view.listener.PictureImportListener; import view.panels.AboutPanel; import javax.swing.*; -import java.awt.*; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -69,16 +67,20 @@ public class MenuBar { menuBar.add(aboutMenu); } - public void addActionListeners(){ - this.exitItem.addActionListener(e -> {System.exit(0);}); - this.evaluateItem.addActionListener(e -> {view.showEvauluationDialog();}); + public void addActionListeners() { + this.exitItem.addActionListener(e -> { + System.exit(0); + }); + this.evaluateItem.addActionListener(e -> { + view.showEvauluationDialog(); + }); this.importItem.addActionListener(new ImportDataListener((Presenter) view.getPresenter(), view)); this.exportItem.addActionListener(new ExportDataListener((Presenter) view.getPresenter(), view)); this.generateItem.addActionListener(new GenerateDataListener((Presenter) view.getPresenter())); this.aboutItem.addActionListener(e -> { SwingUtilities.invokeLater(() -> { JDialog dialog = new JDialog(); - dialog.setSize(410,420); + dialog.setSize(410, 420); dialog.setResizable(false); dialog.add(new AboutPanel()); dialog.setVisible(true); diff --git a/LinearRegressionTool/src/main/java/view/listener/ExportDataListener.java b/LinearRegressionTool/src/main/java/view/listener/ExportDataListener.java index be2ce72..ca822cd 100644 --- a/LinearRegressionTool/src/main/java/view/listener/ExportDataListener.java +++ b/LinearRegressionTool/src/main/java/view/listener/ExportDataListener.java @@ -33,7 +33,7 @@ public class ExportDataListener implements ActionListener { File file = null; JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); chooser.setPreferredSize(new Dimension(800, 700)); - chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value", "csv", "text")); + chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text")); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); diff --git a/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java b/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java index 72991bc..3e29760 100644 --- a/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java +++ b/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java @@ -2,7 +2,6 @@ package view.listener; import presenter.Presenter; -import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; diff --git a/LinearRegressionTool/src/main/java/view/listener/ImportDataListener.java b/LinearRegressionTool/src/main/java/view/listener/ImportDataListener.java index ed46f9c..7bfe40e 100644 --- a/LinearRegressionTool/src/main/java/view/listener/ImportDataListener.java +++ b/LinearRegressionTool/src/main/java/view/listener/ImportDataListener.java @@ -33,7 +33,7 @@ public class ImportDataListener implements ActionListener { File file = null; JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); chooser.setPreferredSize(new Dimension(800, 700)); - chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value", "csv", "text")); + chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text")); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); diff --git a/LinearRegressionTool/src/main/java/view/listener/PictureImportListener.java b/LinearRegressionTool/src/main/java/view/listener/PictureImportListener.java index 459f6c9..b6c4bb3 100644 --- a/LinearRegressionTool/src/main/java/view/listener/PictureImportListener.java +++ b/LinearRegressionTool/src/main/java/view/listener/PictureImportListener.java @@ -32,7 +32,7 @@ public class PictureImportListener implements ActionListener { File file = null; JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); chooser.setPreferredSize(new Dimension(800, 700)); - chooser.setFileFilter(new FileNameExtensionFilter("Bilder", "tiff", "png","jpg","jpeg")); + chooser.setFileFilter(new FileNameExtensionFilter("Bilder", "tiff", "png", "jpg", "jpeg")); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); diff --git a/LinearRegressionTool/src/main/java/view/listener/StartAlgorithmListener.java b/LinearRegressionTool/src/main/java/view/listener/StartAlgorithmListener.java index d68a980..3f10b88 100644 --- a/LinearRegressionTool/src/main/java/view/listener/StartAlgorithmListener.java +++ b/LinearRegressionTool/src/main/java/view/listener/StartAlgorithmListener.java @@ -28,19 +28,19 @@ public class StartAlgorithmListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - if (tabPanel instanceof LMSPanel){ - if ( ((LMSPanel) tabPanel).getInput() != null) { + if (tabPanel instanceof LMSPanel) { + if (((LMSPanel) tabPanel).getInput() != null) { Thread t = new Thread( () -> presenter.calculateLMS(((LMSPanel) tabPanel).getInput())); t.start(); } - } else if (tabPanel instanceof RMPanel){ - if ( ((RMPanel) tabPanel).getInput() != null) { + } else if (tabPanel instanceof RMPanel) { + if (((RMPanel) tabPanel).getInput() != null) { Thread t = new Thread( () -> presenter.calculateRM(((RMPanel) tabPanel).getInput())); t.start(); } - } else if(tabPanel instanceof TSPanel){ + } else if (tabPanel instanceof TSPanel) { Thread t = new Thread( () -> presenter.calculateTS("")); t.start(); diff --git a/LinearRegressionTool/src/main/java/view/panels/AboutPanel.java b/LinearRegressionTool/src/main/java/view/panels/AboutPanel.java index c2e3cb9..c7d72e8 100644 --- a/LinearRegressionTool/src/main/java/view/panels/AboutPanel.java +++ b/LinearRegressionTool/src/main/java/view/panels/AboutPanel.java @@ -19,14 +19,14 @@ public class AboutPanel extends JPanel { private JPanel contentPane; private ImageIcon image; - public AboutPanel(){ + public AboutPanel() { super(); - this.setSize(new Dimension(410,400)); + this.setSize(new Dimension(410, 400)); this.setLayout(new BorderLayout()); contentPane = new JPanel(new BorderLayout()); this.textArea = new JTextArea(); this.textArea.setEditable(false); - this.textArea.setBackground(new Color(0,0,0,0)); + this.textArea.setBackground(new Color(0, 0, 0, 0)); contentPane.add(this.textArea, BorderLayout.CENTER); ClassLoader classLoader = getClass().getClassLoader(); try { diff --git a/LinearRegressionTool/src/main/java/view/panels/EvaluationPanel.java b/LinearRegressionTool/src/main/java/view/panels/EvaluationPanel.java index 16f5ad9..5962d9a 100644 --- a/LinearRegressionTool/src/main/java/view/panels/EvaluationPanel.java +++ b/LinearRegressionTool/src/main/java/view/panels/EvaluationPanel.java @@ -75,7 +75,7 @@ public class EvaluationPanel extends JPanel { datasetCountLabel = new JLabel("Größe des Datensatzes"); Integer[] choice = {50, 100, 200, 500, 1000, 1500}; datasetCountChoice = new JComboBox(choice); - String[] datatypes = {"Punktwolke", "Gerade", "Kreis und Gerade"}; + String[] datatypes = {"Punktwolke", "Gerade", "Kreis und Gerade", "Import von CSV-Datei"}; datasetType = new JComboBox<>(datatypes); start = new JButton("Start"); @@ -191,7 +191,29 @@ public class EvaluationPanel extends JPanel { alg = checkSelection(); n = (Integer) datasetCountChoice.getSelectedItem(); String datatyp = (String) datasetType.getSelectedItem(); - ((Presenter) view.getPresenter()).startEvaluation(type, n, alg, datatyp); + if (datatyp == "Import von CSV-Datei"){ + SwingUtilities.invokeLater(() -> { + File file = null; + JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + chooser.setPreferredSize(new Dimension(800, 700)); + chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text")); + + chooser.setMultiSelectionEnabled(false); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + //System.out.println ("Datei "+chooser.getSelectedFile()+ " ausgewählt."); + file = chooser.getSelectedFile(); + final File input = file; + Thread t = new Thread(() -> ((Presenter) view.getPresenter()).startEvaluation(type, n, alg, input)); + t.start(); + } + }); + + } else { + ((Presenter) view.getPresenter()).startEvaluation(type, n, alg, datatyp); + } clearTable.setEnabled(true); latexExport.setEnabled(true); exportData.setEnabled(true); @@ -224,7 +246,7 @@ public class EvaluationPanel extends JPanel { File file = null; JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); chooser.setPreferredSize(new Dimension(800, 700)); - chooser.setFileFilter(new FileNameExtensionFilter("LaTeX-Datei", "tex", "text")); + chooser.setFileFilter(new FileNameExtensionFilter("LaTeX-Datei, (*.tex)", "tex", "text")); chooser.setMultiSelectionEnabled(false); chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); @@ -257,7 +279,26 @@ public class EvaluationPanel extends JPanel { exportData.addActionListener(e -> { SwingUtilities.invokeLater(() -> { - JOptionPane.showMessageDialog(this, "Boooooooooooooooooooooooooooooooooooooooooooooooooooooo! :)"); + SwingUtilities.invokeLater(() -> { + File file = null; + JFileChooser chooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + chooser.setPreferredSize(new Dimension(800, 700)); + chooser.setFileFilter(new FileNameExtensionFilter("Comma-Separated Value, (*.csv)", "csv", "text")); + + chooser.setMultiSelectionEnabled(false); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + //System.out.println ("Datei "+chooser.getSelectedFile()+ " ausgewählt."); + file = chooser.getSelectedFile(); + String filename = file.getAbsolutePath().contains(".csv") ? file.getAbsolutePath() : file.getAbsolutePath().concat(".csv"); + File withExtension = new File(filename); + final File input = withExtension; + Thread t = new Thread(() ->((Presenter) view.getPresenter()).startDatasetExportEvaluation(input)); + t.start(); + } + }); }); }); diff --git a/LinearRegressionTool/src/main/java/view/panels/tabs/LMSPanel.java b/LinearRegressionTool/src/main/java/view/panels/tabs/LMSPanel.java index 561fe78..33a50ee 100644 --- a/LinearRegressionTool/src/main/java/view/panels/tabs/LMSPanel.java +++ b/LinearRegressionTool/src/main/java/view/panels/tabs/LMSPanel.java @@ -1,10 +1,6 @@ package view.panels.tabs; -import com.sun.istack.internal.Nullable; -import view.panels.PlotPanel; - import javax.swing.*; -import javax.swing.border.TitledBorder; import java.awt.*; /** @@ -84,7 +80,6 @@ public class LMSPanel extends TabPanel { } - @Nullable public String[] getInput() { String[] input = new String[3]; input[0] = this.input[0].getText(); diff --git a/LinearRegressionTool/src/main/java/view/panels/tabs/RMPanel.java b/LinearRegressionTool/src/main/java/view/panels/tabs/RMPanel.java index 0fc89d4..d35ba33 100644 --- a/LinearRegressionTool/src/main/java/view/panels/tabs/RMPanel.java +++ b/LinearRegressionTool/src/main/java/view/panels/tabs/RMPanel.java @@ -1,10 +1,6 @@ package view.panels.tabs; -import com.sun.istack.internal.Nullable; -import view.panels.PlotPanel; - import javax.swing.*; -import javax.swing.border.TitledBorder; import java.awt.*; /** @@ -77,7 +73,6 @@ public class RMPanel extends TabPanel { } - @Nullable public String getInput() { String input = ""; input = this.input.getText(); diff --git a/LinearRegressionTool/src/main/java/view/panels/tabs/TSPanel.java b/LinearRegressionTool/src/main/java/view/panels/tabs/TSPanel.java index 3151e9f..888af21 100644 --- a/LinearRegressionTool/src/main/java/view/panels/tabs/TSPanel.java +++ b/LinearRegressionTool/src/main/java/view/panels/tabs/TSPanel.java @@ -1,10 +1,6 @@ package view.panels.tabs; -import com.sun.istack.internal.Nullable; -import view.panels.PlotPanel; - import javax.swing.*; -import javax.swing.border.TitledBorder; import java.awt.*; /** diff --git a/LinearRegressionTool/src/main/java/view/panels/tabs/TabPanel.java b/LinearRegressionTool/src/main/java/view/panels/tabs/TabPanel.java index a28b013..98660e6 100644 --- a/LinearRegressionTool/src/main/java/view/panels/tabs/TabPanel.java +++ b/LinearRegressionTool/src/main/java/view/panels/tabs/TabPanel.java @@ -13,7 +13,7 @@ import java.awt.*; * @Email: a_wolf28@uni-muenster.de * @Date: 10.09.2017. */ -public abstract class TabPanel extends JPanel{ +public abstract class TabPanel extends JPanel { private PlotPanel plotPanel; @@ -41,6 +41,14 @@ public abstract class TabPanel extends JPanel{ this.startButton.setFont(new Font("Verdana", Font.PLAIN, 16)); } + protected void addTextfieldAndInput(int row, String name, Double value) { + //muss nicht obligatorisch implementiert werden + } + + public PlotPanel getPlotPanel() { + return plotPanel; + } + public void setPlotPanel(PlotPanel plotPanel) { this.plotPanel = plotPanel; if (this.centerPanel.getComponents().length > 0) @@ -52,14 +60,6 @@ public abstract class TabPanel extends JPanel{ this.revalidate(); } - protected void addTextfieldAndInput(int row, String name, Double value){ - //muss nicht obligatorisch implementiert werden - } - - public PlotPanel getPlotPanel() { - return plotPanel; - } - public JButton getStartButton() { return startButton; } diff --git a/LinearRegressionTool/libs/opencv-2413.jar b/LinearRegressionTool/src/main/resources/libs/opencv-2413.jar similarity index 100% rename from LinearRegressionTool/libs/opencv-2413.jar rename to LinearRegressionTool/src/main/resources/libs/opencv-2413.jar diff --git a/LinearRegressionTool/libs/x64/opencv_java2413.dll b/LinearRegressionTool/src/main/resources/libs/x64/opencv_java2413.dll similarity index 100% rename from LinearRegressionTool/libs/x64/opencv_java2413.dll rename to LinearRegressionTool/src/main/resources/libs/x64/opencv_java2413.dll diff --git a/LinearRegressionTool/src/main/resources/shannon-kelley-108053.jpg b/LinearRegressionTool/src/main/resources/shannon-kelley-108053.jpg deleted file mode 100644 index 2438687..0000000 Binary files a/LinearRegressionTool/src/main/resources/shannon-kelley-108053.jpg and /dev/null differ