diff --git a/LinearRegressionTool/libs/opencv-2413.jar b/LinearRegressionTool/libs/opencv-2413.jar deleted file mode 100644 index e5015ac..0000000 Binary files a/LinearRegressionTool/libs/opencv-2413.jar and /dev/null differ diff --git a/LinearRegressionTool/libs/x64/opencv_java2413.dll b/LinearRegressionTool/libs/x64/opencv_java2413.dll deleted file mode 100644 index 7366960..0000000 Binary files a/LinearRegressionTool/libs/x64/opencv_java2413.dll and /dev/null differ diff --git a/LinearRegressionTool/pom.xml b/LinearRegressionTool/pom.xml index fe09dd8..e3f90c3 100644 --- a/LinearRegressionTool/pom.xml +++ b/LinearRegressionTool/pom.xml @@ -97,26 +97,6 @@ 1.6.11 - - - org - opencv - 2.4.13 - system - ${project.basedir}/libs/opencv-2413.jar - native-all - - - - org - opencv - 2.4.13 - system - dll - ${project.basedir}/libs/x64/opencv_java2413.dll - native-all - - commons-io @@ -124,6 +104,12 @@ 2.5 - + + org.openpnp + opencv + 3.2.0-1 + + + \ No newline at end of file diff --git a/LinearRegressionTool/src/main/java/App.java b/LinearRegressionTool/src/main/java/App.java index b8027bd..5aaa562 100644 --- a/LinearRegressionTool/src/main/java/App.java +++ b/LinearRegressionTool/src/main/java/App.java @@ -1,13 +1,21 @@ +import model.Line; import model.LineModel; - +import nu.pattern.OpenCV; import org.apache.commons.io.IOUtils; -import org.opencv.core.Core; import presenter.Presenter; +import presenter.algorithms.advanced.RepeatedMedianEstimator; +import presenter.generator.DatasetGenerator; import view.MainFrame; import javax.swing.*; import java.awt.*; -import java.io.*; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.LinkedList; + +import static nu.pattern.OpenCV.loadShared; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -67,15 +75,23 @@ public class App { SwingUtilities.updateComponentTreeUI(view); } + static { + nu.pattern.OpenCV.loadShared(); + System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME); + } + public static void main(String[] args) { - //loadLibrary(); - - System.out.println("Welcome to OpenCV " + Core.VERSION); - System.out.println(System.getProperty("java.library.path")); - System.loadLibrary(Core.NATIVE_LIBRARY_NAME); + final String[] options = {"Normal", "Benchmark"}; + String chosen = (String) JOptionPane.showInputDialog(null, + "Bitte wählen Sie eine Ansicht!", + "Ausführungsoptionen", + JOptionPane.QUESTION_MESSAGE, + null, + options, + options[0]); + if (chosen == "Normal"){ final Presenter presenter = new Presenter(new LineModel(), null); - SwingUtilities.invokeLater(() -> { JFrame.setDefaultLookAndFeelDecorated(true); MainFrame view = new MainFrame(); @@ -84,8 +100,40 @@ public class App { view.setPresenter(presenter); view.setActionListeners(); presenter.setView(view); - }); + });} else { + benchmark(); + } + } + public static void benchmark() { + int[] sizes = {50, 500, 1000, 3000, 5000, 10000}; + + for (int i = 5; i < sizes.length; i++) { + System.out.println("---- Datasetgröße: " + sizes[i] + " ----"); + DatasetGenerator generator = new DatasetGenerator(); + LinkedList lines = generator.generateDataCloud(sizes[i]); +// IntersectionComputer computer = new IntersectionComputer(lines); +// ArrayList points = computer.compute(); + + //algorithms + //NaivLeastMedianOfSquaresEstimator naivLms = new NaivLeastMedianOfSquaresEstimator(lines); + //naivLms.run(); + +// NaivRepeatedMedianEstimator naivRm = new NaivRepeatedMedianEstimator(lines); +// naivRm.run(); +// +// NaivTheilSenEstimator naivTs = new NaivTheilSenEstimator(lines); +// naivTs.run(); + +// LeastMedianOfSquaresEstimator lms = new LeastMedianOfSquaresEstimator(lines,points); +// lms.run(); + + RepeatedMedianEstimator rm = new RepeatedMedianEstimator(lines); + rm.run(); + +// TheilSenEstimator ts = new TheilSenEstimator(lines,points); +// ts.run(); + } } } diff --git a/LinearRegressionTool/src/main/java/presenter/Presenter.java b/LinearRegressionTool/src/main/java/presenter/Presenter.java index 2ba8be3..e839481 100644 --- a/LinearRegressionTool/src/main/java/presenter/Presenter.java +++ b/LinearRegressionTool/src/main/java/presenter/Presenter.java @@ -196,12 +196,12 @@ public class Presenter extends AbstractPresenter { } } - public void generateDataset() { + public void generateDataset(int n) { if (generatorThread == null || !generatorThread.isAlive()) { generatorThread = new Thread(() -> { DatasetGenerator generator = new DatasetGenerator(); generator.addObserver(this); - getModel().setLines(generator.generateCircle(100)); + getModel().setLines(generator.generateDataCloud(n)); calculateIntersections(); getView().enableFunctionality(); }); diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java index d05abc2..02f30e5 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/LeastMedianOfSquaresEstimator.java @@ -64,6 +64,11 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit */ public void run() { + System.out.println("=== S T A R T - L M S ==="); + long start; + long end; + start = System.currentTimeMillis(); + //(2.) Let U <- (-inf, inf) be the initial active intervals... Comparator comparator = (o1, o2) -> { if (o1.getDistance() < o2.getDistance()) { @@ -91,7 +96,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit //(b.) apply plane sweep if ((constant * n) >= numberOfIntersections) { - sigmaMin = planeSweep(interval); + sigmaMin = pseudoSweep(interval); } else { //(c.) otherwise.... // get random intersections point... @@ -131,6 +136,8 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit this.intervals.remove(interval); } } + end = System.currentTimeMillis(); + System.out.println("Zeit: "+ ((end-start)/1000)); } /** @@ -154,7 +161,7 @@ public class LeastMedianOfSquaresEstimator extends Observable implements Algorit * @param interval * @return */ - public Line planeSweep(Interval interval) { + public Line pseudoSweep(Interval interval) { //initialisiere die x-Queue mit den 2D Punkten und sortiere nach x-Lexikographischer Ordnung ArrayList xQueue = new ArrayList<>(); diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/RepeatedMedianEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/RepeatedMedianEstimator.java index c6d1c8f..ce99f9b 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/RepeatedMedianEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/RepeatedMedianEstimator.java @@ -87,6 +87,11 @@ public class RepeatedMedianEstimator extends Observable implements Algorithm { */ public void run() { + System.out.println("=== S T A R T - R M ==="); + long start; + long end; + start = System.currentTimeMillis(); + while (linesInCenterSlab.size() != 1) { n = linesInCenterSlab.size(); r = Math.ceil(Math.pow(n, beta)); @@ -124,6 +129,8 @@ public class RepeatedMedianEstimator extends Observable implements Algorithm { contractIntervals(); } + end = System.currentTimeMillis(); + System.out.println("Zeit: "+ ((end-start)/1000)); } /** diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java index 2562cff..f3acd8a 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivLeastMedianOfSquaresEstimator.java @@ -37,8 +37,11 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { Double beta; Double alpha; Double dijk; + System.out.println("=== S T A R T - naiv L M S ==="); + long start; + long end; + start = System.currentTimeMillis(); for (Point i : set) { - System.out.println(i); for (Point j : set) { for (Point k : set) { triple.add(i); @@ -58,7 +61,8 @@ public class NaivLeastMedianOfSquaresEstimator implements Algorithm { } } } - System.out.printf("Naiv LMS: %6.2f * x + %6.3f\n", m, b); + end = System.currentTimeMillis(); + System.out.println("Zeit: "+ ((end-start)/1000)); } diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java index 9931444..efefc3d 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivRepeatedMedianEstimator.java @@ -36,6 +36,10 @@ public class NaivRepeatedMedianEstimator implements Algorithm { @Override public void run() { //init the List for the slopes + System.out.println("=== S T A R T - naiv R M ==="); + long start; + long end; + start = System.currentTimeMillis(); for (int j = 0; j < lines.size(); j++) { Line leq = lines.get(j); if (slopesPerLine.get(leq.getId()) == null) { @@ -79,7 +83,8 @@ public class NaivRepeatedMedianEstimator implements Algorithm { medianX = FastElementSelector.randomizedSelect(xMedians, xMedians.size() / 2); medianY = FastElementSelector.randomizedSelect(yMedians, yMedians.size() / 2); - System.out.printf("Naiv RM: %6.2f * x + %6.2f \n", medianX, medianY); + end = System.currentTimeMillis(); + System.out.println("Zeit: "+ ((end-start)/1000)); } @Override diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java index 875f609..0039820 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/naiv/NaivTheilSenEstimator.java @@ -30,6 +30,10 @@ public class NaivTheilSenEstimator implements Algorithm { @Override public void run() { + System.out.println("=== S T A R T - naiv T S ==="); + long start; + long end; + start = System.currentTimeMillis(); ArrayList slopesList = new ArrayList<>(); int cnt = 0; for (int i = 0; i < lines.size(); i++) { @@ -56,7 +60,8 @@ public class NaivTheilSenEstimator implements Algorithm { Double median2 = FastElementSelector.randomizedSelect(list2, list2.size() / 2); slope = FastElementSelector.randomizedSelect(slopesList, slopesList.size() / 2); yInterception = median2 - slope * median1; - System.out.printf("Naiv TS: %6.2f * x + %6.3f\n", slope, yInterception); + end = System.currentTimeMillis(); + System.out.println("Zeit: "+ ((end-start)/1000)); } @Override diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/util/IntersectionComputer.java b/LinearRegressionTool/src/main/java/presenter/algorithms/util/IntersectionComputer.java index 028fd15..bec4c7a 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/util/IntersectionComputer.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/util/IntersectionComputer.java @@ -41,23 +41,23 @@ public class IntersectionComputer { yMaximum = Double.MIN_VALUE; } - public ArrayList compute() { + public ArrayList compute(double lower, double higher) { if (lines.size() >= 12) { worker[0] = new Thread(() -> { - work(lines.subList(0, (lines.size() / 4))); + work(lines.subList(0, (lines.size() / 4)),lower,higher); }); worker[0].start(); worker[1] = new Thread(() -> { - work(lines.subList((lines.size() / 4) + 1, (lines.size() / 2))); + work(lines.subList((lines.size() / 4) + 1, (lines.size() / 2)),lower,higher); }); worker[1].start(); worker[2] = new Thread(() -> { - work(lines.subList((lines.size() / 2) + 1, 3 * (lines.size() / 4))); + work(lines.subList((lines.size() / 2) + 1, 3 * (lines.size() / 4)),lower,higher); }); worker[2].start(); worker[3] = new Thread(() -> { - work(lines.subList(3 * (lines.size() / 4) + 1, (lines.size()))); + work(lines.subList(3 * (lines.size() / 4) + 1, (lines.size())),lower,higher); }); worker[3].start(); @@ -70,16 +70,20 @@ public class IntersectionComputer { } } } else { - work(lines); + work(lines,lower,higher); } return new ArrayList<>(intersections); } - private synchronized void work(List lines) { + public ArrayList compute() { + return compute(-99999, 99999); + } + + private synchronized void work(List lines, double lower, double higher) { IntersectionCounter counter = new IntersectionCounter(); - counter.run(lines, new Interval(-99999, 99999)); + counter.run(lines, new Interval(lower, higher)); ArrayList points = counter.calculateIntersectionAbscissas(); for (Point p : points) { if (!isFound(p)) { diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java b/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java index d131ad9..4a50a4c 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/EvaluateAlgorithms.java @@ -129,10 +129,6 @@ public class EvaluateAlgorithms extends Observable { ArrayList result; ArrayList> multipleResults = new ArrayList<>(); - startLMS(); - startRM(); - startTS(); - System.out.println("alle advanced algorithmen sind berechnet!"); switch (type) { case 0: //der alg der gewählt wurde @@ -191,6 +187,8 @@ public class EvaluateAlgorithms extends Observable { ArrayList lineRes; switch (alg) { case 3: + startLMS(); + startRM(); result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]); multipleResults.add(result); @@ -206,6 +204,9 @@ public class EvaluateAlgorithms extends Observable { break; case 4: + startLMS(); + startTS(); + result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]); multipleResults.add(result); result = fillPseudoResults(); @@ -219,6 +220,9 @@ public class EvaluateAlgorithms extends Observable { sendPloteLineResults(lineRes, new Integer[]{0, 2}); break; case 5: + startRM(); + startTS(); + result = fillPseudoResults(); multipleResults.add(result); result = getPercentigeErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1]); @@ -232,6 +236,10 @@ public class EvaluateAlgorithms extends Observable { sendPloteLineResults(lineRes, new Integer[]{1, 2}); break; case 6: + startLMS(); + startRM(); + startTS(); + result = getPercentigeErrorBasedMeasure(arrangement.getLines(), lmsRes[0], lmsRes[1]); multipleResults.add(result); result = getPercentigeErrorBasedMeasure(arrangement.getLines(), rmRes[0], rmRes[1]); diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java index 9543880..b4a5c2e 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java @@ -1,8 +1,9 @@ package presenter.evaluation; import model.Line; + import org.opencv.core.*; -import org.opencv.highgui.Highgui; +import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; import presenter.Presenter; @@ -35,7 +36,7 @@ public class PictureProcessor extends Observable { } public void run() { - image = Highgui.imread(file.getAbsolutePath()); + image = Imgcodecs.imread(file.getAbsolutePath()); contour = process(image); contourLength = image.width() * 0.3; createInputData(); @@ -44,12 +45,12 @@ public class PictureProcessor extends Observable { 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); - Highgui.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-orig.png", image); + Imgcodecs.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-orig.png", image); Imgproc.cvtColor(image, source, Imgproc.COLOR_BGR2GRAY); - Highgui.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-Greyscale.png", source); + Imgcodecs.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-Greyscale.png", source); Imgproc.GaussianBlur(source, threshold, new Size(3, 3), 0, 0); Imgproc.Canny(threshold, source, 300, 600, 5, true); - Highgui.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-Canny.png", source); + Imgcodecs.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-Canny.png", source); //Konturen berechnen und filtern contours = new ArrayList<>(); Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0)); @@ -62,7 +63,7 @@ public class PictureProcessor extends Observable { Imgproc.drawContours(viscont, contours, i, new Scalar(255, 0, 0), 1); } } - Highgui.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-Contour.png", viscont); + Imgcodecs.imwrite(file.getAbsolutePath().substring(0,file.getAbsolutePath().lastIndexOf("."))+"-Contour.png", viscont); Mat resized = new Mat(); Imgproc.resize(viscont, resized, new Size(560, 560)); SwingUtilities.invokeLater(() -> { diff --git a/LinearRegressionTool/src/main/java/presenter/generator/DatasetGenerator.java b/LinearRegressionTool/src/main/java/presenter/generator/DatasetGenerator.java index fe5f3d3..8c03e63 100644 --- a/LinearRegressionTool/src/main/java/presenter/generator/DatasetGenerator.java +++ b/LinearRegressionTool/src/main/java/presenter/generator/DatasetGenerator.java @@ -47,7 +47,7 @@ public class DatasetGenerator extends Observable { line.setId(i - 1 + ""); lines.add(line); } - String[] ret = {"generator", "Es wurden " + 100 + " Daten generiert mit den Parametern", + String[] ret = {"generator", "Es wurden " + size + " Daten generiert mit den Parametern", "
m = " + m + "", "
b = " + b + ""}; setChanged(); @@ -89,7 +89,7 @@ public class DatasetGenerator extends Observable { idx++; } - String[] ret = {"generator", "Es wurden " + 100 + " Daten generiert mit den Parametern"}; + String[] ret = {"generator", "Es wurden " + n + " Daten generiert mit den Parametern"}; setChanged(); notifyObservers(ret); return lines; diff --git a/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java b/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java index 3e29760..5223cc9 100644 --- a/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java +++ b/LinearRegressionTool/src/main/java/view/listener/GenerateDataListener.java @@ -2,8 +2,13 @@ package view.listener; import presenter.Presenter; +import javax.swing.*; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.text.DecimalFormat; +import java.text.NumberFormat; +import java.util.Locale; /** @@ -16,6 +21,7 @@ import java.awt.event.ActionListener; public class GenerateDataListener implements ActionListener { private Presenter presenter; + private JDialog dialog; public GenerateDataListener(Presenter presenter) { this.presenter = presenter; @@ -23,7 +29,34 @@ public class GenerateDataListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { - Thread t = new Thread(() -> presenter.generateDataset()); - t.start(); + + SwingUtilities.invokeLater(() -> { + + if (dialog == null || !dialog.isVisible()) { + dialog = new JDialog(); + dialog.setAlwaysOnTop(true); + NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault()); + DecimalFormat decimalFormat = (DecimalFormat) numberFormat; + decimalFormat.setGroupingUsed(false); + JTextField textField = new JFormattedTextField(decimalFormat); + textField.setColumns(20); + JButton aproveButton = new JButton("start"); + dialog.setSize(350, 70); + dialog.setLayout(new FlowLayout()); + dialog.setResizable(false); + dialog.setLocationRelativeTo(presenter.getView()); + dialog.add(textField); + dialog.add(aproveButton); + aproveButton.addActionListener(e1 -> { + int n = Integer.parseInt(textField.getText()); + Thread t = new Thread(() -> presenter.generateDataset(n)); + t.start(); + dialog.dispose(); + }); + dialog.setVisible(true); + } + }); + + } } \ No newline at end of file