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