moved calibration stuff to static class under 2d pipeline settings

This commit is contained in:
Omer
2019-12-04 22:49:07 +02:00
parent 1921ce3a40
commit 7f1e8909f3
4 changed files with 80 additions and 55 deletions

View File

@@ -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<CVPipeline2dResult, CVPipeline2dSet
speckleRejectPipe = new SpeckleRejectPipe(settings.speckle.doubleValue());
groupContoursPipe = new GroupContoursPipe(settings.targetGroup, settings.targetIntersection);
sortContoursPipe = new SortContoursPipe(settings.sortMode, camProps, 5);
collect2dTargetsPipe = new Collect2dTargetsPipe(settings.calibrationMode, settings.point,
settings.dualTargetCalibrationM, settings.dualTargetCalibrationB, camProps);
collect2dTargetsPipe = new Collect2dTargetsPipe(settings.calibrationSettings, camProps);
draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings();
draw2dCrosshairPipeSettings = new Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings();
// TODO: make settable from UI? config?
draw2dContoursSettings.showCentroid = false;
draw2dContoursSettings.boxOutlineSize = 2;
draw2dContoursSettings.showRotatedBox = true;
draw2dContoursSettings.showMaximumBox = true;
draw2dContoursSettings.showMultiple = settings.multiple;
draw2dContoursPipe = new Draw2dContoursPipe(draw2dContoursSettings, camProps);
draw2dCrosshairPipeSettings = new Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings();
draw2dCrosshairPipeSettings.showCrosshair=true;
draw2dCrosshairPipe=new Draw2dCrosshairPipe(draw2dCrosshairPipeSettings);
draw2dContoursPipe = new Draw2dContoursPipe(draw2dContoursSettings, camProps);
draw2dCrosshairPipe=new Draw2dCrosshairPipe(draw2dCrosshairPipeSettings,settings.calibrationSettings);
outputMatPipe = new OutputMatPipe(settings.isBinary);
}
@@ -115,9 +115,9 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
speckleRejectPipe.setConfig(settings.speckle.doubleValue());
groupContoursPipe.setConfig(settings.targetGroup, settings.targetIntersection);
sortContoursPipe.setConfig(settings.sortMode, camProps, 5);
collect2dTargetsPipe.setConfig(settings.calibrationMode, settings.point,
settings.dualTargetCalibrationM, settings.dualTargetCalibrationB, camProps);
collect2dTargetsPipe.setConfig(settings.calibrationSettings, camProps);
draw2dContoursPipe.setConfig(settings.multiple, camProps);
draw2dCrosshairPipe.setConfig(true,settings.calibrationSettings);
outputMatPipe.setConfig(settings.isBinary);
long pipeInitTimeNanos = System.nanoTime() - pipelineStartTimeNanos;
@@ -211,4 +211,6 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
public double area = 0.0;
public RotatedRect rawPoint;
}
}

View File

@@ -23,8 +23,16 @@ public class CVPipeline2dSettings extends CVPipelineSettings {
public boolean multiple = false;
public TargetGroup targetGroup = TargetGroup.Single;
public TargetIntersection targetIntersection = TargetIntersection.Up;
public List<Number> point = Arrays.asList(0, 0);
public CalibrationMode calibrationMode = CalibrationMode.None;
public double dualTargetCalibrationM = 1;
public double dualTargetCalibrationB = 0;
// public List<Number> 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<Number> calibrationPoint= Arrays.asList(0,0);
public double calibrationM=1;
public double calibrationB=0;
}
}

View File

@@ -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<Pair<List<RotatedRect>, CaptureStaticProperties>, List<CVPipeline2d.Target2d>> {
private CalibrationMode calibrationMode;
private CaptureStaticProperties camProps;
private List<Number> calibrationPoint;
private double calibrationM, calibrationB;
private CaptureStaticProperties camProps;
private CVPipeline2dSettings.Calibration calibrationSettings;
private List<CVPipeline2d.Target2d> targets = new ArrayList<>();
public Collect2dTargetsPipe(CalibrationMode calibrationMode, List<Number> 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<Number> 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<Pair<List<RotatedRect>, 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;
}

View File

@@ -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<Pair<Mat, List<CVPipeline2d.Target2d>>, Mat>{
public class Draw2dCrosshairPipe implements Pipe<Pair<Mat, List<CVPipeline2d.Target2d>>, 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<Mat, Long> run(Pair<Mat,List<CVPipeline2d.Target2d>> inputPair) {
public Pair<Mat, Long> run(Pair<Mat, List<CVPipeline2d.Target2d>> inputPair) {
long processStartNanos = System.nanoTime();
Mat image = inputPair.getLeft();
List<CVPipeline2d.Target2d> 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;
}
}