Reverted subclass "Calibration"

Fixed bug where single point calibration causes crash when no target is found
This commit is contained in:
Omer
2019-12-05 00:04:17 +02:00
parent 4c76d97d25
commit 054e6dd002
5 changed files with 63 additions and 50 deletions

View File

@@ -67,7 +67,7 @@ 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.calibrationSettings, camProps);
collect2dTargetsPipe = new Collect2dTargetsPipe(settings.calibrationMode,settings.point,settings.dualTargetCalibrationM,settings.dualTargetCalibrationB, camProps);
draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings();
draw2dCrosshairPipeSettings = new Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings();
// TODO: make settable from UI? config?
@@ -78,7 +78,7 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
draw2dContoursSettings.showMultiple = settings.multiple;
draw2dCrosshairPipeSettings.showCrosshair=true;
draw2dContoursPipe = new Draw2dContoursPipe(draw2dContoursSettings, camProps);
draw2dCrosshairPipe=new Draw2dCrosshairPipe(draw2dCrosshairPipeSettings,settings.calibrationSettings);
draw2dCrosshairPipe=new Draw2dCrosshairPipe(draw2dCrosshairPipeSettings,settings.calibrationMode,settings.point,settings.dualTargetCalibrationM,settings.dualTargetCalibrationB);
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.calibrationSettings, camProps);
collect2dTargetsPipe = new Collect2dTargetsPipe(settings.calibrationMode,settings.point,settings.dualTargetCalibrationM,settings.dualTargetCalibrationB, camProps);
draw2dContoursPipe.setConfig(settings.multiple, camProps);
draw2dCrosshairPipe.setConfig(true,settings.calibrationSettings);
draw2dCrosshairPipe.setConfig(draw2dCrosshairPipeSettings,settings.calibrationMode,settings.point,settings.dualTargetCalibrationM,settings.dualTargetCalibrationB);
outputMatPipe.setConfig(settings.isBinary);
long pipeInitTimeNanos = System.nanoTime() - pipelineStartTimeNanos;

View File

@@ -23,16 +23,8 @@ 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 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;
}
public List<Number> point = Arrays.asList(0, 0);
public CalibrationMode calibrationMode = CalibrationMode.None;
public double dualTargetCalibrationM = 1;
public double dualTargetCalibrationB = 0;
}

View File

@@ -2,7 +2,9 @@ package com.chameleonvision.vision.pipeline;
import com.chameleonvision.util.MemoryManager;
import com.chameleonvision.vision.camera.CameraCapture;
import com.chameleonvision.vision.enums.CalibrationMode;
import com.chameleonvision.vision.pipeline.pipes.Draw2dContoursPipe;
import com.chameleonvision.vision.pipeline.pipes.Draw2dCrosshairPipe;
import com.chameleonvision.vision.pipeline.pipes.RotateFlipPipe;
import org.apache.commons.lang3.tuple.Pair;
import org.opencv.core.Mat;
@@ -15,8 +17,10 @@ import static com.chameleonvision.vision.pipeline.DriverVisionPipeline.DriverPip
public class DriverVisionPipeline extends CVPipeline<DriverPipelineResult, CVPipelineSettings> {
private RotateFlipPipe rotateFlipPipe;
private Draw2dContoursPipe draw2dContoursPipe;
private Draw2dContoursPipe.Draw2dContoursSettings draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings();
// private Draw2dContoursPipe draw2dContoursPipe;
// private Draw2dContoursPipe.Draw2dContoursSettings draw2dContoursSettings = new Draw2dContoursPipe.Draw2dContoursSettings();
private Draw2dCrosshairPipe drawCrosshairPipe;
private Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings crosshairPipeSettings = new Draw2dCrosshairPipe.Draw2dCrosshairPipeSettings();
private final List<RotatedRect> blankList = List.of();
private final MemoryManager memoryManager = new MemoryManager(200, 20000);
@@ -30,6 +34,8 @@ public class DriverVisionPipeline extends CVPipeline<DriverPipelineResult, CVPip
public void initPipeline(CameraCapture capture) {
super.initPipeline(capture);
rotateFlipPipe = new RotateFlipPipe(settings.rotationMode, settings.flipMode);
crosshairPipeSettings.showCrosshair=true;
drawCrosshairPipe = new Draw2dCrosshairPipe(crosshairPipeSettings, CalibrationMode.None,null,0,0);
// draw2dContoursSettings.showCrosshair = true;
// draw2dContoursPipe = new Draw2dContoursPipe(draw2dContoursSettings, cameraCapture.getProperties().getStaticProperties());
}
@@ -38,14 +44,14 @@ public class DriverVisionPipeline extends CVPipeline<DriverPipelineResult, CVPip
public DriverPipelineResult runPipeline(Mat inputMat) {
rotateFlipPipe.setConfig(settings.rotationMode, settings.flipMode);
draw2dContoursPipe.setConfig(false, cameraCapture.getProperties().getStaticProperties());
// drawCrosshairPipe.setConfig(false, settings);
Pair<Mat, Long> rotateFlipResult = rotateFlipPipe.run(inputMat);
Pair<Mat, Long> draw2dContoursResult = draw2dContoursPipe.run(Pair.of(rotateFlipResult.getLeft(), blankList));
// Pair<Mat, Long> draw2dContoursResult = draw2dContoursPipe.run(Pair.of(rotateFlipResult.getLeft(), blankList));
Pair<Mat, Long> draw2dCrosshairResult = drawCrosshairPipe.run(Pair.of(rotateFlipResult.getLeft(),null));
memoryManager.run();
return new DriverPipelineResult(null, draw2dContoursResult.getLeft(), 0);
return new DriverPipelineResult(null, draw2dCrosshairResult.getLeft(), 0);
}
public static class DriverPipelineResult extends CVPipelineResult<Void> {

View File

@@ -16,15 +16,20 @@ public class Collect2dTargetsPipe implements Pipe<Pair<List<RotatedRect>, Captur
private CaptureStaticProperties camProps;
private CVPipeline2dSettings.Calibration calibrationSettings;
private CalibrationMode calibrationMode;
private List<Number> calibrationPoint;
private double calibrationM, calibrationB;
private List<CVPipeline2d.Target2d> targets = new ArrayList<>();
public Collect2dTargetsPipe(CVPipeline2dSettings.Calibration calibrationSettings, CaptureStaticProperties camProps) {
setConfig(calibrationSettings,camProps);
public Collect2dTargetsPipe(CalibrationMode calibrationMode, List<Number> calibrationPoint, double calibrationM, double calibrationB, CaptureStaticProperties camProps) {
setConfig(calibrationMode, calibrationPoint, calibrationM, calibrationB, camProps);
}
public void setConfig(CVPipeline2dSettings.Calibration calibrationSettings, CaptureStaticProperties camProps) {
this.calibrationSettings = calibrationSettings;
public void setConfig(CalibrationMode calibrationMode, List<Number> calibrationPoint, double calibrationM, double calibrationB, CaptureStaticProperties camProps) {
this.calibrationMode = calibrationMode;
this.calibrationPoint = calibrationPoint;
this.calibrationM = calibrationM;
this.calibrationB = calibrationB;
this.camProps = camProps;
}
@@ -40,18 +45,22 @@ public class Collect2dTargetsPipe implements Pipe<Pair<List<RotatedRect>, Captur
for (RotatedRect r : input) {
CVPipeline2d.Target2d t = new CVPipeline2d.Target2d();
t.rawPoint = r;
switch (calibrationSettings.calibrationMode) {
switch (this.calibrationMode) {
case Single:
if (this.calibrationPoint.get(0) == null)
this.calibrationPoint.set(0, camProps.centerX);
if (this.calibrationPoint.get(1) == null)
this.calibrationPoint.set(1, camProps.centerY);
t.calibratedX = this.calibrationPoint.get(0).doubleValue();
t.calibratedY = this.calibrationPoint.get(1).doubleValue();
break;
case None:
t.calibratedX = camProps.centerX;
t.calibratedY = camProps.centerY;
break;
case Single:
t.calibratedX = calibrationSettings.calibrationPoint.get(0).doubleValue();
t.calibratedY = calibrationSettings.calibrationPoint.get(1).doubleValue();
break;
case Dual:
t.calibratedX = (r.center.y - calibrationSettings.calibrationB) / calibrationSettings.calibrationM;
t.calibratedY = (r.center.x * calibrationSettings.calibrationM) + calibrationSettings.calibrationB;
t.calibratedX = (r.center.y - this.calibrationB) / this.calibrationM;
t.calibratedY = (r.center.x * this.calibrationM) + this.calibrationB;
break;
}

View File

@@ -2,6 +2,7 @@ package com.chameleonvision.vision.pipeline.pipes;
import com.chameleonvision.util.Helpers;
import com.chameleonvision.vision.camera.CaptureStaticProperties;
import com.chameleonvision.vision.enums.CalibrationMode;
import com.chameleonvision.vision.pipeline.CVPipeline2d;
import com.chameleonvision.vision.pipeline.CVPipeline2dSettings;
import org.apache.commons.lang3.tuple.Pair;
@@ -16,19 +17,23 @@ public class Draw2dCrosshairPipe implements Pipe<Pair<Mat, List<CVPipeline2d.Tar
//Settings
private Draw2dCrosshairPipeSettings crosshairSettings;
private CVPipeline2dSettings.Calibration calibrationSettings;
private CalibrationMode calibrationMode;
private List<Number> calibrationPoint;
private double calibrationM, calibrationB;
private Point xMax = new Point(), xMin = new Point(), yMax = new Point(), yMin = new Point();
public Draw2dCrosshairPipe(Draw2dCrosshairPipeSettings crosshairSettings, CVPipeline2dSettings.Calibration calibrationSettings) {
this.crosshairSettings = crosshairSettings;
this.calibrationSettings = calibrationSettings;
public Draw2dCrosshairPipe(Draw2dCrosshairPipeSettings crosshairSettings, CalibrationMode calibrationMode, List<Number> calibrationPoint, double calibrationM, double calibrationB) {
setConfig(crosshairSettings, calibrationMode, calibrationPoint, calibrationM, calibrationB);
}
public void setConfig(boolean showCrosshair, CVPipeline2dSettings.Calibration calibrationSettings) {
this.crosshairSettings.showCrosshair = showCrosshair;
this.calibrationSettings = calibrationSettings;
public void setConfig(Draw2dCrosshairPipeSettings crosshairSettings, CalibrationMode calibrationMode, List<Number> calibrationPoint, double calibrationM, double calibrationB) {
this.crosshairSettings = crosshairSettings;
this.calibrationMode = calibrationMode;
this.calibrationPoint = calibrationPoint;
this.calibrationM = calibrationM;
this.calibrationB = calibrationB;
}
@Override
@@ -40,23 +45,24 @@ public class Draw2dCrosshairPipe implements Pipe<Pair<Mat, List<CVPipeline2d.Tar
drawCrosshair:
if (this.crosshairSettings.showCrosshair) {
switch (calibrationSettings.calibrationMode) {
case None:
x = image.rows() / 2;
y = image.cols() / 2;
break;
x = image.cols() / 2;
y = image.rows() / 2;
switch (this.calibrationMode) {
case Single:
x = targets.get(0).calibratedX;
y = targets.get(0).calibratedY;
if (this.calibrationPoint.get(0) == null)
this.calibrationPoint.set(0, image.cols()/2);
if (this.calibrationPoint.get(1) == null)
this.calibrationPoint.set(1, image.rows()/2);
x = this.calibrationPoint.get(0).intValue();
y = this.calibrationPoint.get(1).intValue();
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 {
} else
break drawCrosshair;
}
break;
}
xMax.set(new double[]{x + scale, y});