diff --git a/LinearRegressionTool/src/main/resources/libs/opencv-2413.jar b/LinearRegressionTool/libs/opencv-2413.jar similarity index 100% rename from LinearRegressionTool/src/main/resources/libs/opencv-2413.jar rename to LinearRegressionTool/libs/opencv-2413.jar diff --git a/LinearRegressionTool/src/main/resources/libs/x64/opencv_java2413.dll b/LinearRegressionTool/libs/x64/opencv_java2413.dll similarity index 100% rename from LinearRegressionTool/src/main/resources/libs/x64/opencv_java2413.dll rename to LinearRegressionTool/libs/x64/opencv_java2413.dll diff --git a/LinearRegressionTool/masterarbeit.properties b/LinearRegressionTool/masterarbeit.properties new file mode 100644 index 0000000..9d07d80 --- /dev/null +++ b/LinearRegressionTool/masterarbeit.properties @@ -0,0 +1,4 @@ +path.variable.kotlin_bundled=C\:\\Program Files\\JetBrains\\IntelliJ IDEA 2017.2.3\\plugins\\Kotlin\\kotlinc +path.variable.maven_repository=C\:\\Users\\Armin\\.m2\\repository +jdk.home.1.8=C\:/Program Files/Java/jdk1.8.0_121 +javac2.instrumentation.includeJavaRuntime=false \ No newline at end of file diff --git a/LinearRegressionTool/masterarbeit.xml b/LinearRegressionTool/masterarbeit.xml new file mode 100644 index 0000000..26e5d8a --- /dev/null +++ b/LinearRegressionTool/masterarbeit.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LinearRegressionTool/module_masterarbeit.xml b/LinearRegressionTool/module_masterarbeit.xml new file mode 100644 index 0000000..f1b6927 --- /dev/null +++ b/LinearRegressionTool/module_masterarbeit.xml @@ -0,0 +1,177 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LinearRegressionTool/pom.xml b/LinearRegressionTool/pom.xml index 3653ea1..fe09dd8 100644 --- a/LinearRegressionTool/pom.xml +++ b/LinearRegressionTool/pom.xml @@ -102,7 +102,9 @@ org opencv 2.4.13 - ${project.basedir}/src/main/resources/libs/opencv-2413.jar + system + ${project.basedir}/libs/opencv-2413.jar + native-all @@ -111,16 +113,17 @@ 2.4.13 system dll - ${project.basedir}/src/main/resources/libs/x64/opencv_java2413.dll + ${project.basedir}/libs/x64/opencv_java2413.dll native-all - + - org.apache.commons + commons-io commons-io - 1.3.2 + 2.5 + \ No newline at end of file diff --git a/LinearRegressionTool/src/main/java/App.java b/LinearRegressionTool/src/main/java/App.java index 03ce55b..b8027bd 100644 --- a/LinearRegressionTool/src/main/java/App.java +++ b/LinearRegressionTool/src/main/java/App.java @@ -7,10 +7,7 @@ import view.MainFrame; import javax.swing.*; import java.awt.*; -import java.io.File; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; /** * Implementierung verschiedener Algorithmen zur Berechnung von Ausgleichsgeraden. @@ -21,23 +18,13 @@ import java.io.OutputStream; */ public class App { - - 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"); - } + in = App.class.getResourceAsStream("/libs/x64/opencv_java2413.dll"); + fileOut = File.createTempFile("tmp", ".dll"); OutputStream out = new FileOutputStream(fileOut); IOUtils.copy(in, out); @@ -81,7 +68,11 @@ public class App { } public static void main(String[] args) { - loadLibrary(); + //loadLibrary(); + + System.out.println("Welcome to OpenCV " + Core.VERSION); + System.out.println(System.getProperty("java.library.path")); + System.loadLibrary(Core.NATIVE_LIBRARY_NAME); final Presenter presenter = new Presenter(new LineModel(), null); diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java index 5728251..6875809 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/advanced/TheilSenEstimator.java @@ -5,9 +5,7 @@ import model.Line; import model.Point; import presenter.Presenter; import presenter.algorithms.Algorithm; -import presenter.algorithms.util.BinomialCoeffizient; -import presenter.algorithms.util.FastElementSelector; -import presenter.algorithms.util.RandomSampler; +import presenter.algorithms.util.*; import java.util.*; @@ -58,7 +56,8 @@ public class TheilSenEstimator extends Observable implements Algorithm { this.yCoordinates = new ArrayList<>(); this.xCoordinates = new ArrayList<>(); this.N = BinomialCoeffizient.run(n, 2); - this.k = Integer.valueOf((int) (N * 0.5)) - 1; + //this.k = Integer.valueOf((int) (N * 0.5)) - 1; + this.k = (int) (N / 2); } public TheilSenEstimator(LinkedList setOfLines, ArrayList setOfIntersections) { @@ -120,8 +119,8 @@ public class TheilSenEstimator extends Observable implements Algorithm { //Double kthElement = FastElementSelector.randomizedSelect(xCoordinates, k); //Boolean cond1 = (kthElement > aVariant) && (kthElement <= bVariant); - int lowerCount = getIntervalSize(NEGATIV_INF, aVariant, setOfIntersections); - int higherCount = getIntervalSize(NEGATIV_INF, bVariant, setOfIntersections); + int lowerCount = getIntervalSize(NEGATIV_INF, aVariant); + int higherCount = getIntervalSize(NEGATIV_INF, bVariant); Boolean conda = k > lowerCount; Boolean condb = k <= higherCount; @@ -142,20 +141,18 @@ public class TheilSenEstimator extends Observable implements Algorithm { * @param b obere Grenze des Intrvals * @return Anzahl der Schnittpunkte im Interval [a,b) */ - public int getIntervalSize(double a, double b, ArrayList set) { - int counter = 0; - for (Point x : set) { - if (x.getX() >= a && x.getX() < b) { - counter++; - } - } - return counter; + public int getIntervalSize(double a, double b) { + IntersectionCounter ic = new IntersectionCounter(); + return ic.run(setOfLines, new Interval(a,b)); } /** * Berechne wieviele von den Schnittpunkten in dem Interval zwischen a und b * enthalten sind. * + * Inspiriert durch: + * https://stackoverflow.com/questions/136474/best-way-to-pick-a-random-subset-from-a-collection + * * @param a untere Grenze des Intervals * @param b obere Grenze des Intrvals * @return Anzahl der Schnittpunkte im Interval (a,b) diff --git a/LinearRegressionTool/src/main/java/presenter/algorithms/util/RandomSampler.java b/LinearRegressionTool/src/main/java/presenter/algorithms/util/RandomSampler.java index 0eade1f..c56fe9e 100644 --- a/LinearRegressionTool/src/main/java/presenter/algorithms/util/RandomSampler.java +++ b/LinearRegressionTool/src/main/java/presenter/algorithms/util/RandomSampler.java @@ -4,6 +4,8 @@ import model.Line; import model.Point; import java.util.ArrayList; +import java.util.List; +import java.util.Random; import java.util.concurrent.ThreadLocalRandom; /** @@ -43,14 +45,27 @@ public class RandomSampler { public static ArrayList run(ArrayList set, Double r) { ArrayList sampledLines = new ArrayList<>(); - Integer indexOfEnd = set.size(); +// Integer indexOfEnd = set.size()-1; +// +// for (int i = 0; i < r; i++) { +// sampledLines.add(set.get(ThreadLocalRandom.current().nextInt(0, indexOfEnd)).getX()); +// } - for (int i = 0; i < r; i++) { - Double px = set.get(ThreadLocalRandom.current().nextInt(0, indexOfEnd)).getX(); - if (!sampledLines.contains(px)) - sampledLines.add(px); +// return sampledLines; + + for (Point p : set){ + sampledLines.add(p.getX()); } - return sampledLines; + Random rand = new Random(); + int inputSize = sampledLines.size(); + for (int i = 0; i < r; i++) + { + int indexToSwap = i + rand.nextInt(inputSize - i); + Double temp = sampledLines.get(i); + sampledLines.set(i, sampledLines.get(indexToSwap)); + sampledLines.set(indexToSwap, temp); + } + return new ArrayList<>(sampledLines.subList(0, r.intValue())); } } diff --git a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java index c896cab..9543880 100644 --- a/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java +++ b/LinearRegressionTool/src/main/java/presenter/evaluation/PictureProcessor.java @@ -44,9 +44,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); Imgproc.cvtColor(image, source, Imgproc.COLOR_BGR2GRAY); + Highgui.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); //Konturen berechnen und filtern contours = new ArrayList<>(); Imgproc.findContours(source, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0)); @@ -59,6 +62,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); Mat resized = new Mat(); Imgproc.resize(viscont, resized, new Size(560, 560)); SwingUtilities.invokeLater(() -> { @@ -70,7 +74,7 @@ public class PictureProcessor extends Observable { dialog.add(label); dialog.setVisible(true); }); - return source; + return viscont; } diff --git a/LinearRegressionTool/src/main/java/presenter/io/EvalResultLatexExport.java b/LinearRegressionTool/src/main/java/presenter/io/EvalResultLatexExport.java index 6f54be7..5816cbf 100644 --- a/LinearRegressionTool/src/main/java/presenter/io/EvalResultLatexExport.java +++ b/LinearRegressionTool/src/main/java/presenter/io/EvalResultLatexExport.java @@ -39,14 +39,14 @@ public class EvalResultLatexExport { private String createOutputData() { String split = "&"; StringBuilder doc = new StringBuilder(); - doc.append("\\begin{tabular}{l|*{3}{r}}" + "\r\n"); + doc.append("\\begin{tabular}{|l|r|r|r|}" + "\\hline\r\n"); for (int i = 0; i < model.getColumnCount(); i++) { if (model.getValueAt(0, i).toString() != "" || model.getRowCount() > 5) doc.append("\\textsc{" + model.getColumnName(i) + "}" + split); } doc.deleteCharAt(doc.lastIndexOf(split)); - doc.append("\\\\\\hline\\hline" + "\r\n"); + doc.append("\\\\\\hline" + "\r\n"); for (int i = 0; i < model.getRowCount() - 1; i++) { for (int j = 0; j < model.getColumnCount(); j++) { @@ -62,7 +62,7 @@ public class EvalResultLatexExport { if (model.getValueAt(i, 0) != "") { doc.deleteCharAt(doc.lastIndexOf(split)); } - doc.append("\\\\" + "\r\n"); + doc.append("\\\\\\hline" + "\r\n"); } doc.append("\\end{tabular}"); return doc.toString();