mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-21 01:01:41 +00:00
Reverted subclass "Calibration"
Fixed bug where single point calibration causes crash when no target is found
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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});
|
||||
|
||||
Reference in New Issue
Block a user