Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
nfeybesse committed Jun 25, 2018
1 parent 5925db6 commit 091c245
Show file tree
Hide file tree
Showing 8 changed files with 499 additions and 450 deletions.
5 changes: 5 additions & 0 deletions gs-cv/src/main/java/org/genericsystem/cv/AbstractApp.java
Expand Up @@ -91,4 +91,9 @@ protected void onT() {

protected abstract void fillGrid(GridPane mainGrid);

protected long trace(String message, long ref) {
long last = System.currentTimeMillis();
System.out.println(message + " : " + (last - ref));
return last;
}
}
97 changes: 47 additions & 50 deletions gs-cv/src/main/java/org/genericsystem/cv/Img.java
@@ -1,39 +1,19 @@
package org.genericsystem.cv;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

import javax.swing.ImageIcon;

import org.genericsystem.cv.utils.Tools;
import org.genericsystem.layout.Layout;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.KeyPoint;
import org.opencv.core.Mat;
import org.opencv.core.MatOfByte;
import org.opencv.core.MatOfFloat;
import org.opencv.core.MatOfInt;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfPoint2f;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.features2d.FeatureDetector;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.CLAHE;
import org.opencv.imgproc.Imgproc;
Expand All @@ -44,6 +24,23 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;

import javax.swing.ImageIcon;

import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

Expand Down Expand Up @@ -395,36 +392,36 @@ public Img multiply(Scalar scalar) {
return new Img(result, false);
}

public Img mser() {
Img gray = bgr2Gray();
MatOfKeyPoint keypoint = new MatOfKeyPoint();
FeatureDetector detector = FeatureDetector.create(FeatureDetector.MSER);
detector.detect(gray.getSrc(), keypoint);
List<KeyPoint> listpoint = keypoint.toList();
Mat result = Mat.zeros(gray.size(), CvType.CV_8UC1);
for (int ind = 0; ind < listpoint.size(); ind++) {
KeyPoint kpoint = listpoint.get(ind);
int rectanx1 = (int) (kpoint.pt.x - 0.5 * kpoint.size);
int rectany1 = (int) (kpoint.pt.y - 0.5 * kpoint.size);
int width = (int) (kpoint.size);
int height = (int) (kpoint.size);
if (rectanx1 <= 0)
rectanx1 = 1;
if (rectany1 <= 0)
rectany1 = 1;
if ((rectanx1 + width) > gray.width())
width = gray.width() - rectanx1;
if ((rectany1 + height) > gray.height())
height = gray.height() - rectany1;
Rect rectant = new Rect(rectanx1, rectany1, width, height);
Mat roi = new Mat(result, rectant);
roi.setTo(new Scalar(255));
}
Img img = new Img(result, false);
Img result_ = img.morphologyEx(Imgproc.MORPH_CLOSE, Imgproc.MORPH_RECT, new Size(17, 3));
img.close();
return result_;
}
// public Img mser() {
// Img gray = bgr2Gray();
// MatOfKeyPoint keypoint = new MatOfKeyPoint();
// FeatureDetector detector = FeatureDetector.create(FeatureDetector.MSER);
// detector.detect(gray.getSrc(), keypoint);
// List<KeyPoint> listpoint = keypoint.toList();
// Mat result = Mat.zeros(gray.size(), CvType.CV_8UC1);
// for (int ind = 0; ind < listpoint.size(); ind++) {
// KeyPoint kpoint = listpoint.get(ind);
// int rectanx1 = (int) (kpoint.pt.x - 0.5 * kpoint.size);
// int rectany1 = (int) (kpoint.pt.y - 0.5 * kpoint.size);
// int width = (int) (kpoint.size);
// int height = (int) (kpoint.size);
// if (rectanx1 <= 0)
// rectanx1 = 1;
// if (rectany1 <= 0)
// rectany1 = 1;
// if ((rectanx1 + width) > gray.width())
// width = gray.width() - rectanx1;
// if ((rectany1 + height) > gray.height())
// height = gray.height() - rectany1;
// Rect rectant = new Rect(rectanx1, rectany1, width, height);
// Mat roi = new Mat(result, rectant);
// roi.setTo(new Scalar(255));
// }
// Img img = new Img(result, false);
// Img result_ = img.morphologyEx(Imgproc.MORPH_CLOSE, Imgproc.MORPH_RECT, new Size(17, 3));
// img.close();
// return result_;
// }

public Img grad(double k1, double k2) {
// Img gray = bgr2Gray();
Expand Down
@@ -1,13 +1,5 @@
package org.genericsystem.cv.application;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import org.genericsystem.cv.AbstractApp;
import org.genericsystem.cv.Img;
import org.genericsystem.cv.Lines;
Expand All @@ -18,6 +10,14 @@
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

import javafx.application.Platform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand Down Expand Up @@ -152,12 +152,6 @@ private Image[] doWork() {
return images;
}

private long trace(String message, long ref) {
long last = System.currentTimeMillis();
System.out.println(message + " : " + (last - ref));
return last;
}

@Override
protected void onS() {
config.stabilizedMode = !config.stabilizedMode;
Expand Down
36 changes: 20 additions & 16 deletions gs-cv/src/main/java/org/genericsystem/cv/application/FHTDemo.java
@@ -1,13 +1,5 @@
package org.genericsystem.cv.application;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;
import org.genericsystem.cv.AbstractApp;
import org.genericsystem.cv.Img;
Expand All @@ -19,6 +11,14 @@
import org.opencv.core.Scalar;
import org.opencv.core.Size;

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javafx.application.Platform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand All @@ -40,6 +40,16 @@ public static void main(String[] args) {
private Config config = new Config();
private final ImageView[][] imageViews = new ImageView[][] { new ImageView[3], new ImageView[3], new ImageView[3], new ImageView[3] };
private int frameCount = 0;
private FHTManager fhtManager = new FHTManager();

public FHTDemo() {
addIntegerSliderProperty("hBlurSize", fhtManager.gethBlurSize(), 0, 200);
addIntegerSliderProperty("vBlurSize", fhtManager.getvBlurSize(), 0, 200);
addDoubleSliderProperty("hNeighbourPenality", fhtManager.gethNeighbourPenality(), -5000, 0);
addDoubleSliderProperty("vNeighbourPenality", fhtManager.getvNeighbourPenality(), -5000, 0);
addDoubleSliderProperty("hAnglePenality", fhtManager.gethAnglePenality(), -1, 0);
addDoubleSliderProperty("vAnglePenality", fhtManager.getvAnglePenality(), -1, 0);
}

private void startTimer() {
timer.scheduleAtFixedRate(() -> {
Expand Down Expand Up @@ -120,8 +130,8 @@ private Image[] doWork() {
List<List<TrajectStep>> hHoughTrajs = hHoughs.stream().map(projectionMap -> FHT.bestTrajectFHT(projectionMap, 21, -0.08)).collect(Collectors.toList());
ref = trace("Compute trajects", ref);

vHoughTrajs = StripTractor.optimize(vHoughs, 21, -0.08, -100, vHoughTrajs, vStep);
hHoughTrajs = StripTractor.optimize(hHoughs, 21, -0.08, -100, hHoughTrajs, hStep);
// vHoughTrajs = StripTractor.optimize(vHoughs, 21, -0.08, -100, vHoughTrajs, vStep);
// hHoughTrajs = StripTractor.optimize(hHoughs, 21, -0.08, -100, hHoughTrajs, hStep);

List<List<OrientedPoint>[]> fhtHorizontals = ProjectionLines.toHorizontalsOrientedPoints(vHoughTrajs, vStep, 0.5, 0.05);
List<List<OrientedPoint>[]> fhtVerticals = ProjectionLines.toVerticalsOrientedPoints(hHoughTrajs, hStep, 0.5, 0.05);
Expand Down Expand Up @@ -178,12 +188,6 @@ private Image[] doWork() {

}

private long trace(String message, long ref) {
long last = System.currentTimeMillis();
System.out.println(message + " : " + (last - ref));
return last;
}

@Override
protected void onS() {
config.stabilizedMode = !config.stabilizedMode;
Expand Down
@@ -1,12 +1,5 @@
package org.genericsystem.cv.application;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;
import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;
import org.genericsystem.cv.AbstractApp;
Expand All @@ -22,6 +15,13 @@
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javafx.application.Platform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand Down Expand Up @@ -315,12 +315,6 @@ private Image[] doWork() {
return images;
}

private long trace(String message, long ref) {
long last = System.currentTimeMillis();
System.out.println(message + " : " + (last - ref));
return last;
}

@Override
protected void onS() {
config.stabilizedMode = !config.stabilizedMode;
Expand Down
@@ -1,13 +1,5 @@
package org.genericsystem.cv.application;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import org.genericsystem.cv.AbstractApp;
import org.genericsystem.cv.Img;
import org.genericsystem.cv.utils.NativeLibraryLoader;
Expand All @@ -16,14 +8,20 @@
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.features2d.MSER;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javafx.application.Platform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand Down Expand Up @@ -110,6 +108,8 @@ private Image[] doWork() {

Img binarized = frame.adaptativeGaussianInvThreshold(7, 5);
Img flat = fhtManager.dewarp(frame.getSrc(), binarized.getSrc(), 0.75, 0.75);
// flat = fhtManager.dewarp(flat.getSrc(), flat.adaptativeGaussianInvThreshold(7, 5).getSrc(), 0.75, 0.75);

images[1] = flat.toJfxImage();

// Img flatBinarized = flat.adaptativeGaussianInvThreshold(7, 5);
Expand All @@ -119,15 +119,16 @@ private Image[] doWork() {
// Img flatBinarized = new Img(gray.getSrc(), false);
// images[2] = flatBinarized.toJfxImage();

Img mserMask = new Img(findMask(flat.bgr2Gray(), 10, 2000), false);
RobustTextDetectorManager rbm = new RobustTextDetectorManager(flat.bgr2Gray().getSrc(), 2);
Img mserMask = new Img(rbm.getEdgeEnhancedMserMask(), false);
images[2] = mserMask.toJfxImage();

List<Rect> detectedRects = detectRects(mserMask.getSrc(), 10, 2000);
List<Rect> detectedRects = detectRects(mserMask.getSrc(), 8, 100000, new Size(25, 1), Imgproc.MORPH_RECT);
Img flatDisplay = new Img(flat.getSrc(), true);
detectedRects.forEach(rect -> Imgproc.rectangle(flatDisplay.getSrc(), rect.tl(), rect.br(), new Scalar(0, 255, 0), 1));
images[3] = flatDisplay.toJfxImage();

Layout layout = mserMask.buildLayout(new Size(0, 0), new Size(0.001, 0.001), 8);
Layout layout = mserMask.buildLayout(new Size(0, 0), new Size(0.08, 0.001), 8);
Img flatDisplay2 = new Img(flat.getSrc(), true);
layout.draw(flatDisplay2, new Scalar(255, 0, 0), new Scalar(0, 255, 0), 0, 1);
layout.ocrTree(flat, 0, 0);
Expand Down Expand Up @@ -259,22 +260,24 @@ protected void onR() {
timer.schedule(() -> referenceManager.clear(), 0, TimeUnit.MILLISECONDS);
}

Mat findMask(Img gray, int minArea, int maxArea) {
MSER detector = MSER.create(2, minArea, maxArea, 1, 0.25, 100, 1.01, 0.03, 5);
ArrayList<MatOfPoint> regions = new ArrayList<>();
MatOfRect mor = new MatOfRect();
detector.detectRegions(gray.getSrc(), regions, mor);
Mat mserMask = new Mat(gray.size(), CvType.CV_8UC1, new Scalar(0));
for (MatOfPoint mop : regions)
for (Point p : mop.toArray())
mserMask.put((int) p.y, (int) p.x, 255);
return mserMask;
}

List<Rect> detectRects(Mat mserMask, int minArea, int maxArea) {
// Mat findMask(Img gray, int minArea, int maxArea) {
// MSER detector = MSER.create(2, minArea, maxArea, 1, 0.25, 100, 1.01, 0.03, 5);
// ArrayList<MatOfPoint> regions = new ArrayList<>();
// MatOfRect mor = new MatOfRect();
// detector.detectRegions(gray.getSrc(), regions, mor);
// Mat mserMask = new Mat(gray.size(), CvType.CV_8UC1, new Scalar(0));
// for (MatOfPoint mop : regions)
// for (Point p : mop.toArray())
// mserMask.put((int) p.y, (int) p.x, 255);
// return mserMask;
// }

List<Rect> detectRects(Mat mserMask, int minArea, int maxArea, Size closeSize, int closeShape) {
Mat closed = new Mat();
Imgproc.morphologyEx(mserMask, closed, Imgproc.MORPH_CLOSE, Imgproc.getStructuringElement(closeShape, closeSize));
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(mserMask, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Size size = mserMask.size();
Imgproc.findContours(closed, contours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
Size size = closed.size();
List<Rect> result = new ArrayList<>();
for (MatOfPoint contour : contours) {
double area = Imgproc.contourArea(contour);
Expand Down

0 comments on commit 091c245

Please sign in to comment.