Skip to content

Commit

Permalink
Change meta parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
nfeybesse committed May 2, 2018
1 parent d7d7a6f commit 829a044
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 62 deletions.
30 changes: 23 additions & 7 deletions gs-cv/src/main/java/org/genericsystem/cv/application/MeshGrid.java
@@ -1,5 +1,10 @@
package org.genericsystem.cv.application;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
Expand All @@ -12,11 +17,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MeshGrid {

private static final Logger logger = LoggerFactory.getLogger(MeshGrid.class);
Expand Down Expand Up @@ -285,11 +285,11 @@ private Point intersect(Point hPoint, Point vPoint) { // intersection de la lign
hPoint = horizontalMove(hPoint, xDiff);
vPoint = verticalMove(vPoint, yDiff);
}
if (Math.abs(xDiff) < 1 && Math.abs(yDiff) < 1) {
if (Math.abs(xDiff) <= 1 && Math.abs(yDiff) <= 1) {
intersection = new Point(0.5 * (hPoint.x + vPoint.x), 0.5 * (hPoint.y + vPoint.y));
return intersection;
}
throw new IllegalStateException();
throw new IllegalStateException(xDiff + " " + yDiff);
}

private double xDiff(Point pt1, Point pt2) {
Expand All @@ -301,24 +301,40 @@ private double yDiff(Point pt1, Point pt2) {
}

private Point verticalMove(Point startingPoint, double deltaY) {
assert Double.isFinite(startingPoint.x);
assert Double.isFinite(startingPoint.y);
if (deltaY == 0)
return startingPoint;
double dY = Math.max(0.5, deltaY) * Math.signum(deltaY);
double x = startingPoint.x, y = startingPoint.y;
while (Math.abs(y - startingPoint.y - deltaY) >= 1) {
double dX = dY / Math.tan(interpolator.interpolateVerticals(x - xBorder, y - yBorder) + Math.PI / 2);
if (!Double.isFinite(dX))
dX = 0;
x += dX;
y += dY;
}
assert Double.isFinite(x);
assert Double.isFinite(y);
return new Point(x, y);
}

private Point horizontalMove(Point startingPoint, double deltaX) {
assert Double.isFinite(startingPoint.x);
assert Double.isFinite(startingPoint.y);
if (deltaX == 0)
return startingPoint;
double dX = Math.max(0.5, deltaX) * Math.signum(deltaX);
double x = startingPoint.x, y = startingPoint.y;
while (Math.abs(x - startingPoint.x - deltaX) >= 1) {
double dY = Math.tan(interpolator.interpolateHorizontals(x - xBorder, y - yBorder)) * dX;
if (!Double.isFinite(dY))
dY = 0;
x += dX;
y += dY;
}
assert Double.isFinite(x);
assert Double.isFinite(y);
return new Point(x, y);
}

Expand Down
@@ -1,5 +1,13 @@
package org.genericsystem.cv.application;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

import org.apache.commons.math3.analysis.FunctionUtils;
import org.apache.commons.math3.analysis.differentiation.UnivariateDifferentiableFunction;
import org.apache.commons.math3.analysis.function.Constant;
Expand All @@ -20,14 +28,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class MeshGridRadon extends MeshGrid {

private static final Logger logger = LoggerFactory.getLogger(MeshGridRadon.class);
Expand Down Expand Up @@ -73,7 +73,7 @@ private Map<Key, Point3[]> toPoint3d() {
}

// TODO: Possibility to configure all the parameters.
public void build(double anglePenalty, int minAngle, int maxAngle, double magnitudePow) {
public void build(double anglePenalty, int minAngle, int maxAngle) {
// Compute Vertical directions.
DirectionalFilter df = new DirectionalFilter();
int firstBin = 1;
Expand All @@ -95,7 +95,7 @@ public void build(double anglePenalty, int minAngle, int maxAngle, double magnit
VerticalInterpolator interpolator = new VerticalInterpolator(patchXs, patchYs, dirs, nSide, nBin);

// Compute lines.
List<PolynomialSplineFunction> hLines = RadonTransform.estimateBaselines(image, anglePenalty, minAngle, maxAngle, magnitudePow, yStep);
List<PolynomialSplineFunction> hLines = RadonTransform.estimateBaselines(image, anglePenalty, minAngle, maxAngle, yStep);

Point[] prevLine = null;
double angleTolerance = Math.PI / 180;
Expand Down
@@ -1,5 +1,10 @@
package org.genericsystem.cv.application;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;
import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;
import org.genericsystem.cv.Img;
Expand All @@ -19,11 +24,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

public class RadonTransform {

static {
Expand Down Expand Up @@ -80,7 +80,7 @@ public static Mat fastHoughTransform(Mat vStrip) {
Mat houghTransform = new Mat();
Ximgproc.FastHoughTransform(vStrip, houghTransform, CvType.CV_64FC1, Ximgproc.ARO_45_135, Ximgproc.FHT_ADD, Ximgproc.HDO_DESKEW);
Core.transpose(houghTransform, houghTransform);
Core.normalize(houghTransform, houghTransform, 0, 255, Core.NORM_MINMAX);
Core.normalize(houghTransform, houghTransform, 0, 1, Core.NORM_MINMAX);
return new Mat(houghTransform, new Range(vStrip.width() / 2, houghTransform.height() - vStrip.width() / 2), new Range(0, houghTransform.width()));
}

Expand All @@ -99,11 +99,35 @@ public static Mat fhtRemap(Mat houghTransform) {
return result;
}

public static TrajectStep[] bestTraject(Mat projectionMap, double anglePenality, double pow) {
// public static Function<Double, Double> approxTraject(Mat houghTransform) {
// List<double[]> values = new ArrayList<>();
// for (int row = 0; row < houghTransform.rows(); row++) {
// List<Double> houghLine = new ArrayList<>();
// Converters.Mat_to_vector_double(houghTransform.row(row).t(), houghLine);
// houghLine.add((double) row);
// values.add(houghLine.toArray(new double[houghLine.size() - 1]));
// }
// BiFunction<Double, double[], Double> f = (x, params) -> params[0] + params[1] * x + params[2] * x * x + params[3] * x * x * x + params[4] * x * x * x * x + params[5] * x * x * x * x * x;
// BiFunction<double[], double[], Double> error = (xy, params) -> {
// double[] magnitudes = new double[houghTransform.rows()];
// for (int row = 0; row < houghTransform.rows(); row++)
// magnitudes[row] = params[(int) Math.round(f.apply((double) row, params))];
//
// double average = Arrays.stream(magnitudes).average().getAsDouble();
// double variance = 0;
//
// return Math.sqrt(variance);
// };
//
// double[] params = new LevenbergImpl<>(error, values, new double[] { 0, 0, 0, 0, 0, 0 }).getParams();
// return x -> f.apply(x, params);
// }

public static TrajectStep[] bestTraject(Mat projectionMap, double anglePenality) {
double[][] score = new double[projectionMap.rows()][projectionMap.cols()];
int[][] thetaPrev = new int[projectionMap.rows()][projectionMap.cols()];
for (int theta = 0; theta < projectionMap.cols(); theta++)
score[0][theta] = Math.pow(projectionMap.get(0, theta)[0], pow);
score[0][theta] = projectionMap.get(0, theta)[0];
for (int k = 1; k < projectionMap.rows(); k++) {
for (int theta = 0; theta < projectionMap.cols(); theta++) {
double magnitude = projectionMap.get(k, theta)[0];
Expand Down Expand Up @@ -165,7 +189,7 @@ public static Mat extractStrip(Mat src, int startX, int width) {
return new Mat(src, new Range(0, src.rows()), new Range(startX, startX + width));
}

public static List<PolynomialSplineFunction> estimateBaselines(Mat image, double anglePenalty, int minAngle, int maxAngle, double magnitudePow, int yStep) {
public static List<PolynomialSplineFunction> estimateBaselines(Mat image, double anglePenalty, int minAngle, int maxAngle, int yStep) {

int n = 20;// Number of overlapping vertical strips.
float r = .5f;// Overlap ratio between two consecutive strips.
Expand All @@ -179,7 +203,7 @@ public static List<PolynomialSplineFunction> estimateBaselines(Mat image, double
Mat radonTransform = radonTransform(extractStrip(preprocessed, x, (int) w), minAngle, maxAngle);
Mat projMap = radonRemap(radonTransform, minAngle);
Imgproc.morphologyEx(projMap, projMap, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(2, 4)));
TrajectStep[] angles = bestTraject(projMap, anglePenalty, magnitudePow);
TrajectStep[] angles = bestTraject(projMap, anglePenalty);
projMap.release();
radonTransform.release();
approxFunctions.add(approxTraject(angles));
Expand Down Expand Up @@ -223,7 +247,7 @@ public static Function<Double, Double> approxTraject(TrajectStep[] traj) {
for (int k = 0; k < traj.length; k++)
values.add(new double[] { k, traj[k].theta, traj[k].magnitude });
BiFunction<Double, double[], Double> f = (x, params) -> params[0] + params[1] * x + params[2] * x * x + params[3] * x * x * x + params[4] * x * x * x * x + params[5] * x * x * x * x * x;
BiFunction<double[], double[], Double> error = (xy, params) -> (f.apply(xy[0], params) - xy[1]) * Math.pow(Math.max(xy[2] / 255, 0.33), 3);
BiFunction<double[], double[], Double> error = (xy, params) -> (f.apply(xy[0], params) - xy[1]) * xy[2];
double[] params = new LevenbergImpl<>(error, values, new double[] { 0, 0, 0, 0, 0, 0 }).getParams();
return x -> f.apply(x, params);
}
Expand Down
Expand Up @@ -137,10 +137,10 @@ private Image[] doWork() {

ref = trace("Compute FHT remap", ref);

List<TrajectStep[]> vTrajs = vProjectionMaps.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000, 2)).collect(Collectors.toList());
List<TrajectStep[]> hTrajs = hProjectionMaps.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000, 2)).collect(Collectors.toList());
List<TrajectStep[]> vHoughTrajs = vHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000, 2)).collect(Collectors.toList());
List<TrajectStep[]> hHoughTrajs = hHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000, 2)).collect(Collectors.toList());
List<TrajectStep[]> vTrajs = vProjectionMaps.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000)).collect(Collectors.toList());
List<TrajectStep[]> hTrajs = hProjectionMaps.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000)).collect(Collectors.toList());
List<TrajectStep[]> vHoughTrajs = vHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000)).collect(Collectors.toList());
List<TrajectStep[]> hHoughTrajs = hHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -1000)).collect(Collectors.toList());
ref = trace("Compute trajects", ref);
for (TrajectStep[] houghVtraj : vHoughTrajs)
for (int y = 0; y < houghVtraj.length; y++)
Expand Down
@@ -1,23 +1,22 @@
package org.genericsystem.cv.application;

import java.util.Arrays;
import java.util.Iterator;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

import org.genericsystem.cv.AbstractApp;
import org.genericsystem.cv.Img;
import org.genericsystem.cv.utils.NativeLibraryLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Range;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import java.util.Arrays;
import java.util.Iterator;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

import javafx.application.Platform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand Down Expand Up @@ -82,13 +81,13 @@ private Image[] doWork() {

long ref = System.currentTimeMillis();

// Img binarized = superFrame.getFrame().adaptativeGaussianInvThreshold(7, 5);
Img binarized = new Img(Mat.zeros(360, 640, CvType.CV_8UC1), false);
Img binarized = superFrame.getFrame().adaptativeGaussianInvThreshold(7, 5);
// Img binarized = new Img(Mat.zeros(360, 640, CvType.CV_8UC1), false);
double[] angles = { -10, -20, -5 };
int count = 0;
for (int y = 100; y <= 260; y += 80) {
double angle = angles[count] / 180 * Math.PI;
Imgproc.line(binarized.getSrc(), new Point(320 - 40 * Math.cos(angle), y - 40 * Math.sin(angle)), new Point(320 + 40 * Math.cos(angle), y + 40 * Math.sin(angle)), new Scalar(255), 1);
// Imgproc.line(binarized.getSrc(), new Point(320 - 40 * Math.cos(angle), y - 40 * Math.sin(angle)), new Point(320 + 40 * Math.cos(angle), y + 40 * Math.sin(angle)), new Scalar(255), 1);
count++;
}

Expand All @@ -111,12 +110,15 @@ private Image[] doWork() {
// Mat hough = RadonTransform.fhtRemap(houghTransform, stripWidth);
images[3] = new Img(houghTransform, false).toJfxImage();

Imgproc.morphologyEx(houghTransform, houghTransform, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(1, 2)));
Scalar mean = Core.mean(houghTransform);
Core.absdiff(houghTransform, mean, houghTransform);

// Imgproc.morphologyEx(houghTransform, houghTransform, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(1, 2)));
Core.normalize(houghTransform, houghTransform, 0, 255, Core.NORM_MINMAX);
images[4] = new Img(houghTransform, false).toJfxImage();

ref = trace("FHT compute", ref);
TrajectStep[] houghVtraj = RadonTransform.bestTraject(houghTransform, -20, 2);
TrajectStep[] houghVtraj = RadonTransform.bestTraject(houghTransform, -20);

for (int y = 0; y < houghVtraj.length; y++)
houghVtraj[y].theta = (int) Math.round(Math.atan((double) (houghVtraj[y].theta - stripWidth + 1) / (stripWidth - 1)) / Math.PI * 180 + 45);
Expand Down Expand Up @@ -178,7 +180,7 @@ private Image[] doWork() {
ref = trace("Radon + Projection", ref);
images[7] = new Img(vProjection, false).toJfxImage();

TrajectStep[] vtraj = RadonTransform.bestTraject(vProjection, -20, 2);
TrajectStep[] vtraj = RadonTransform.bestTraject(vProjection, -20);

for (int y = 0; y < vtraj.length; y++) {
if (vtraj[y].magnitude == 0)
Expand Down
@@ -1,5 +1,14 @@
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.function.Function;
import java.util.stream.Collectors;

import org.genericsystem.cv.AbstractApp;
import org.genericsystem.cv.Img;
import org.genericsystem.cv.application.GeneralInterpolator.OrientedPoint;
Expand All @@ -11,15 +20,6 @@
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.function.Function;
import java.util.stream.Collectors;

import javafx.application.Platform;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand Down Expand Up @@ -110,19 +110,28 @@ private Image[] doWork() {
List<Mat> hHoughs = hStrips.stream().map(strip -> RadonTransform.fastHoughTransform(strip)).collect(Collectors.toList());
vHoughs.stream().forEach(projectionMap -> Imgproc.resize(projectionMap, projectionMap, new Size(91, projectionMap.height()), 0, 0, Imgproc.INTER_LINEAR));
hHoughs.stream().forEach(projectionMap -> Imgproc.resize(projectionMap, projectionMap, new Size(91, projectionMap.height()), 0, 0, Imgproc.INTER_LINEAR));
vHoughs.stream().forEach(projectionMap -> Imgproc.morphologyEx(projectionMap, projectionMap, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(1, 2))));
hHoughs.stream().forEach(projectionMap -> Imgproc.morphologyEx(projectionMap, projectionMap, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(1, 2))));
vHoughs.stream().forEach(projectionMap -> Core.normalize(projectionMap, projectionMap, 0, 255, Core.NORM_MINMAX));
hHoughs.stream().forEach(projectionMap -> Core.normalize(projectionMap, projectionMap, 0, 255, Core.NORM_MINMAX));
vHoughs.stream().forEach(projectionMap -> {
Core.absdiff(projectionMap, new Scalar(0.2), projectionMap);
Core.pow(projectionMap, 2.5, projectionMap);
});
hHoughs.stream().forEach(projectionMap -> {
Core.absdiff(projectionMap, new Scalar(0.2), projectionMap);
Core.pow(projectionMap, 2.5, projectionMap);
});
// vHoughs.stream().forEach(projectionMap -> Imgproc.morphologyEx(projectionMap, projectionMap, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(1, 2))));
// hHoughs.stream().forEach(projectionMap -> Imgproc.morphologyEx(projectionMap, projectionMap, Imgproc.MORPH_GRADIENT, Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(1, 2))));

vHoughs.stream().forEach(projectionMap -> Core.normalize(projectionMap, projectionMap, 0, 1, Core.NORM_MINMAX));
hHoughs.stream().forEach(projectionMap -> Core.normalize(projectionMap, projectionMap, 0, 1, Core.NORM_MINMAX));
ref = trace("Compute FHT", ref);

List<TrajectStep[]> vHoughTrajs = vHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -20, 2)).collect(Collectors.toList());
List<TrajectStep[]> hHoughTrajs = hHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -20, 2)).collect(Collectors.toList());
List<TrajectStep[]> vHoughTrajs = vHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -0.01)).collect(Collectors.toList());
List<TrajectStep[]> hHoughTrajs = hHoughs.stream().map(projectionMap -> RadonTransform.bestTraject(projectionMap, -0.01)).collect(Collectors.toList());
ref = trace("Compute trajects", ref);

for (TrajectStep[] houghVtraj : vHoughTrajs) {
for (int y = 0; y < houghVtraj.length; y++)
houghVtraj[y].theta = (int) Math.round(Math.atan((double) (houghVtraj[y].theta - 45) / (44)) / Math.PI * 180 + 45);
houghVtraj[y].theta = (int) Math.round(Math.atan((double) (houghVtraj[y].theta - 45) / (45)) / Math.PI * 180 + 45);

for (int y = 0; y < houghVtraj.length; y++) {
if (houghVtraj[y].magnitude == 0)
Expand All @@ -139,7 +148,7 @@ private Image[] doWork() {

for (TrajectStep[] houghHtraj : hHoughTrajs) {
for (int y = 0; y < houghHtraj.length; y++)
houghHtraj[y].theta = (int) Math.round(Math.atan((double) (houghHtraj[y].theta - 45) / (44)) / Math.PI * 180 + 45);
houghHtraj[y].theta = (int) Math.round(Math.atan((double) (houghHtraj[y].theta - 45) / (45)) / Math.PI * 180 + 45);

for (int y = 0; y < houghHtraj.length; y++) {
if (houghHtraj[y].magnitude == 0)
Expand Down

0 comments on commit 829a044

Please sign in to comment.