diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java index 2e0f2f893..c0167d0e9 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java @@ -4,6 +4,7 @@ import com.chameleonvision.Main; import com.chameleonvision.util.MemoryManager; import com.chameleonvision.vision.camera.CameraCapture; import com.chameleonvision.vision.camera.CaptureStaticProperties; +import com.chameleonvision.vision.enums.CalibrationMode; import com.chameleonvision.vision.pipeline.pipes.*; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.*; @@ -66,19 +67,18 @@ public class CVPipeline2d extends CVPipeline point = Arrays.asList(0, 0); - public CalibrationMode calibrationMode = CalibrationMode.None; - public double dualTargetCalibrationM = 1; - public double dualTargetCalibrationB = 0; +// public List point = Arrays.asList(0, 0); +// public CalibrationMode calibrationMode = CalibrationMode.None; +// public double dualTargetCalibrationM = 1; +// public double dualTargetCalibrationB = 0; + public Calibration calibrationSettings = new Calibration(); + public static class Calibration + { + public CalibrationMode calibrationMode=CalibrationMode.None; + public List calibrationPoint= Arrays.asList(0,0); + public double calibrationM=1; + public double calibrationB=0; + } } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java index 572e9e6e2..7cd425694 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java @@ -3,6 +3,7 @@ package com.chameleonvision.vision.pipeline.pipes; import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.pipeline.CVPipeline2d; import com.chameleonvision.vision.enums.CalibrationMode; +import com.chameleonvision.vision.pipeline.CVPipeline2dSettings; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.math3.util.FastMath; import org.opencv.core.Mat; @@ -13,29 +14,18 @@ import java.util.List; public class Collect2dTargetsPipe implements Pipe, CaptureStaticProperties>, List> { - private CalibrationMode calibrationMode; - private CaptureStaticProperties camProps; - private List calibrationPoint; - private double calibrationM, calibrationB; + private CaptureStaticProperties camProps; + private CVPipeline2dSettings.Calibration calibrationSettings; private List targets = new ArrayList<>(); - public Collect2dTargetsPipe(CalibrationMode calibrationMode, List calibrationPoint, - double calibrationM, double calibrationB, CaptureStaticProperties camProps) { - this.calibrationMode = calibrationMode; - this.camProps = camProps; - this.calibrationPoint = calibrationPoint; - this.calibrationM = calibrationM; - this.calibrationB = calibrationB; + public Collect2dTargetsPipe(CVPipeline2dSettings.Calibration calibrationSettings, CaptureStaticProperties camProps) { + setConfig(calibrationSettings,camProps); } - public void setConfig(CalibrationMode calibrationMode, List calibrationPoint, - double calibrationM, double calibrationB, CaptureStaticProperties camProps) { - this.calibrationMode = calibrationMode; + public void setConfig(CVPipeline2dSettings.Calibration calibrationSettings, CaptureStaticProperties camProps) { + this.calibrationSettings = calibrationSettings; this.camProps = camProps; - this.calibrationPoint = calibrationPoint; - this.calibrationM = calibrationM; - this.calibrationB = calibrationB; } @Override @@ -50,18 +40,18 @@ public class Collect2dTargetsPipe implements Pipe, Captur for (RotatedRect r : input) { CVPipeline2d.Target2d t = new CVPipeline2d.Target2d(); t.rawPoint = r; - switch (calibrationMode) { + switch (calibrationSettings.calibrationMode) { case None: t.calibratedX = camProps.centerX; t.calibratedY = camProps.centerY; break; case Single: - t.calibratedX = calibrationPoint.get(0).doubleValue(); - t.calibratedY = calibrationPoint.get(1).doubleValue(); + t.calibratedX = calibrationSettings.calibrationPoint.get(0).doubleValue(); + t.calibratedY = calibrationSettings.calibrationPoint.get(1).doubleValue(); break; case Dual: - t.calibratedX = (r.center.y - calibrationB) / calibrationM; - t.calibratedY = (r.center.x * calibrationM) + calibrationB; + t.calibratedX = (r.center.y - calibrationSettings.calibrationB) / calibrationSettings.calibrationM; + t.calibratedY = (r.center.x * calibrationSettings.calibrationM) + calibrationSettings.calibrationB; break; } diff --git a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java index 8d7f29afd..f64b8df67 100644 --- a/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java +++ b/chameleon-server/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dCrosshairPipe.java @@ -3,6 +3,7 @@ package com.chameleonvision.vision.pipeline.pipes; import com.chameleonvision.util.Helpers; import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.vision.pipeline.CVPipeline2d; +import com.chameleonvision.vision.pipeline.CVPipeline2dSettings; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Mat; import org.opencv.core.Point; @@ -11,43 +12,67 @@ import org.opencv.imgproc.Imgproc; import java.awt.*; import java.util.List; -public class Draw2dCrosshairPipe implements Pipe>, Mat>{ +public class Draw2dCrosshairPipe implements Pipe>, Mat> { + + //Settings + private Draw2dCrosshairPipeSettings crosshairSettings; + private CVPipeline2dSettings.Calibration calibrationSettings; + - private final Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings settings; private Point xMax = new Point(), xMin = new Point(), yMax = new Point(), yMin = new Point(); - public Draw2dCrosshairPipe(Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings settings) { - this.settings = settings; + public Draw2dCrosshairPipe(Draw2dCrosshairPipeSettings crosshairSettings, CVPipeline2dSettings.Calibration calibrationSettings) { + this.crosshairSettings = crosshairSettings; + this.calibrationSettings = calibrationSettings; } - public void setConfig(boolean showCrosshair) { - this.settings.showCrosshair = showCrosshair; + public void setConfig(boolean showCrosshair, CVPipeline2dSettings.Calibration calibrationSettings) { + this.crosshairSettings.showCrosshair = showCrosshair; + this.calibrationSettings = calibrationSettings; } @Override - public Pair run(Pair> inputPair) { + public Pair run(Pair> inputPair) { long processStartNanos = System.nanoTime(); - + Mat image = inputPair.getLeft(); List targets = inputPair.getRight(); - double x,y; - if(targets != null && !targets.isEmpty()) { - x = targets.get(0).calibratedX; - y = targets.get(0).calibratedY; - if (this.settings.showCrosshair) { - xMax.set(new double[] {x + 10, y}); - xMin.set(new double[] {x - 10, y}); - yMax.set(new double[] {x, y + 10}); - yMin.set(new double[] {x, y - 10}); - Imgproc.line(inputPair.getLeft(), xMax, xMin, Helpers.colorToScalar(this.settings.crosshairColor), 2); - Imgproc.line(inputPair.getLeft(), yMax, yMin, Helpers.colorToScalar(this.settings.crosshairColor), 2); + double x = 0, y = 0, scale = image.cols() / 32.0; + + drawCrosshair: + if (this.crosshairSettings.showCrosshair) { + switch (calibrationSettings.calibrationMode) { + case None: + x = image.rows() / 2; + y = image.cols() / 2; + break; + case Single: + x = targets.get(0).calibratedX; + y = targets.get(0).calibratedY; + break; + case Dual: + if (targets != null && !targets.isEmpty()) { + x = targets.get(0).calibratedX; + y = targets.get(0).calibratedY; + //TODO dual point calibration crosshair checks + } else { + break drawCrosshair; + } + break; } + xMax.set(new double[]{x + scale, y}); + xMin.set(new double[]{x - scale, y}); + yMax.set(new double[]{x, y + scale}); + yMin.set(new double[]{x, y - scale}); + Imgproc.line(inputPair.getLeft(), xMax, xMin, Helpers.colorToScalar(this.crosshairSettings.crosshairColor), 2); + Imgproc.line(inputPair.getLeft(), yMax, yMin, Helpers.colorToScalar(this.crosshairSettings.crosshairColor), 2); } -// image.release(); + long processTime = System.nanoTime() - processStartNanos; return Pair.of(inputPair.getLeft(), processTime); } - public static class Draw2dCrosshairPipeSettings{ - public boolean showCrosshair =true; + + public static class Draw2dCrosshairPipeSettings { + public boolean showCrosshair = true; public Color crosshairColor = Color.GREEN; } }