mirror of
https://github.com/PhotonVision/photonvision
synced 2026-06-21 01:01:41 +00:00
moved calibration stuff to static class under 2d pipeline settings
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user