stop instantiating new pipes every tick

This commit is contained in:
Matt
2019-11-24 16:54:10 -08:00
parent 80d4451e56
commit d53f047ad7
11 changed files with 127 additions and 36 deletions

View File

@@ -1,5 +1,6 @@
package com.chameleonvision.vision.pipeline;
import com.chameleonvision.vision.camera.CameraProcess;
import com.chameleonvision.vision.camera.CameraStaticProperties;
import com.chameleonvision.vision.pipeline.pipes.*;
import com.chameleonvision.vision.enums.ImageRotation;
@@ -16,6 +17,16 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
private Mat rawCameraMat = new Mat();
private Mat hsvOutputMat = new Mat();
private RotateFlipPipe rotateFlipPipe;
private BlurPipe blurPipe;
private ErodeDilatePipe erodeDilatePipe;
private HsvPipe hsvPipe;
private FindContoursPipe findContoursPipe;
private FilterContoursPipe filterContoursPipe;
private SpeckleRejectPipe speckleRejectPipe;
private GroupContoursPipe groupContoursPipe;
private SortContoursPipe sortContoursPipe;
private Collect2dTargetsPipe collect2dTargetsPipe;
public CVPipeline2d() {
super(new CVPipeline2dSettings());
@@ -29,6 +40,27 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
super(settings);
}
@Override
public void initPipeline(CameraProcess process) {
super.initPipeline(process);
var camProps = cameraProcess.getProperties().staticProperties;
var hsvLower = new Scalar(settings.hue.get(0).intValue(), settings.saturation.get(0).intValue(), settings.value.get(0).intValue());
var hsvUpper = new Scalar(settings.hue.get(1).intValue(), settings.saturation.get(1).intValue(), settings.value.get(1).intValue());
rotateFlipPipe = new RotateFlipPipe(ImageRotation.DEG_0, settings.flipMode);
blurPipe = new BlurPipe(5);
erodeDilatePipe = new ErodeDilatePipe(settings.erode, settings.dilate, 7);
hsvPipe = new HsvPipe(hsvLower, hsvUpper);
findContoursPipe = new FindContoursPipe();
filterContoursPipe = new FilterContoursPipe(settings.area, settings.ratio, settings.extent, camProps);
speckleRejectPipe = new SpeckleRejectPipe(settings.speckle.doubleValue());
groupContoursPipe = new GroupContoursPipe(settings.targetGroup, settings.targetIntersection);
sortContoursPipe = new SortContoursPipe(settings.sortMode, camProps);
collect2dTargetsPipe = new Collect2dTargetsPipe(settings.calibrationMode, settings.point,
settings.dualTargetCalibrationM, settings.dualTargetCalibrationB, camProps);
}
@Override
public CVPipeline2dResult runPipeline(Mat inputMat) {
long totalProcessTimeNanos = 0;
@@ -50,21 +82,19 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
// rawCameraMat = inputMat;
// prepare pipes
RotateFlipPipe rotateFlipPipe = new RotateFlipPipe(ImageRotation.DEG_0, settings.flipMode);
BlurPipe blurPipe = new BlurPipe(5);
ErodeDilatePipe erodeDilatePipe = new ErodeDilatePipe(settings.erode, settings.dilate, 7);
Scalar hsvLower = new Scalar(settings.hue.get(0).intValue(), settings.saturation.get(0).intValue(), settings.value.get(0).intValue());
Scalar hsvUpper = new Scalar(settings.hue.get(1).intValue(), settings.saturation.get(1).intValue(), settings.value.get(1).intValue());
HsvPipe hsvPipe = new HsvPipe(hsvLower, hsvUpper);
FindContoursPipe findContoursPipe = new FindContoursPipe();
FilterContoursPipe filterContoursPipe = new FilterContoursPipe(settings.area, settings.ratio, settings.extent, camProps);
SpeckleRejectPipe speckleRejectPipe = new SpeckleRejectPipe(settings.speckle.doubleValue());
GroupContoursPipe groupContoursPipe = new GroupContoursPipe(settings.targetGroup, settings.targetIntersection);
SortContoursPipe sortContoursPipe = new SortContoursPipe(settings.sortMode, camProps);
Collect2dTargetsPipe collect2dTargetsPipe = new Collect2dTargetsPipe(settings.calibrationMode, settings.point,
rotateFlipPipe.setConfig(ImageRotation.DEG_0, settings.flipMode);
blurPipe.setConfig(5);
erodeDilatePipe.setConfig(settings.erode, settings.dilate, 7);
hsvPipe.setConfig(hsvLower, hsvUpper);
filterContoursPipe.setConfig(settings.area, settings.ratio, settings.extent, camProps);
speckleRejectPipe.setConfig(settings.speckle.doubleValue());
groupContoursPipe.setConfig(settings.targetGroup, settings.targetIntersection);
sortContoursPipe.setConfig(settings.sortMode, camProps);
collect2dTargetsPipe.setConfig(settings.calibrationMode, settings.point,
settings.dualTargetCalibrationM, settings.dualTargetCalibrationB, camProps);
OutputMatPipe outputMatPipe = new OutputMatPipe(settings.isBinary);

View File

@@ -8,7 +8,7 @@ import org.opencv.imgproc.Imgproc;
public class BlurPipe implements Pipe<Mat, Mat> {
private final int blurSize;
private int blurSize;
private Mat processBuffer = new Mat();
private Mat outputMat = new Mat();
@@ -17,6 +17,10 @@ public class BlurPipe implements Pipe<Mat, Mat> {
this.blurSize = blurSize;
}
public void setConfig(int blurSize) {
this.blurSize = blurSize;
}
@Override
public Pair<Mat, Long> run(Mat input) {
long processStartNanos = System.nanoTime();

View File

@@ -12,14 +12,24 @@ import java.util.List;
public class Collect2dTargetsPipe implements Pipe<List<RotatedRect>, List<CVPipeline2d.Target2d>> {
private final CalibrationMode calibrationMode;
private final CameraStaticProperties camProps;
private final List<Number> calibrationPoint;
private final double calibrationM, calibrationB;
private CalibrationMode calibrationMode;
private CameraStaticProperties camProps;
private List<Number> calibrationPoint;
private double calibrationM, calibrationB;
private List<CVPipeline2d.Target2d> targets = new ArrayList<>();
public Collect2dTargetsPipe(CalibrationMode calibrationMode, List<Number> calibrationPoint, double calibrationM, double calibrationB, CameraStaticProperties camProps) {
public Collect2dTargetsPipe(CalibrationMode calibrationMode, List<Number> calibrationPoint,
double calibrationM, double calibrationB, CameraStaticProperties camProps) {
this.calibrationMode = calibrationMode;
this.camProps = camProps;
this.calibrationPoint = calibrationPoint;
this.calibrationM = calibrationM;
this.calibrationB = calibrationB;
}
public void setConfig(CalibrationMode calibrationMode, List<Number> calibrationPoint,
double calibrationM, double calibrationB, CameraStaticProperties camProps) {
this.calibrationMode = calibrationMode;
this.camProps = camProps;
this.calibrationPoint = calibrationPoint;

View File

@@ -7,8 +7,9 @@ import org.opencv.imgproc.Imgproc;
public class ErodeDilatePipe implements Pipe<Mat, Mat> {
private final boolean erode, dilate;
private final Mat kernel;
private boolean erode;
private boolean dilate;
private Mat kernel;
private Mat processBuffer = new Mat();
private Mat outputMat = new Mat();
@@ -19,6 +20,12 @@ public class ErodeDilatePipe implements Pipe<Mat, Mat> {
kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(kernelSize, kernelSize));
}
public void setConfig(boolean erode, boolean dilate, int kernelSize) {
this.erode = erode;
this.dilate = dilate;
kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(kernelSize, kernelSize));
}
@Override
public Pair<Mat, Long> run(Mat input) {
long processStartNanos = System.nanoTime();

View File

@@ -13,8 +13,10 @@ import java.util.List;
public class FilterContoursPipe implements Pipe<List<MatOfPoint>, List<MatOfPoint>> {
private final List<Number> area, ratio, extent;
private final CameraStaticProperties camProps;
private List<Number> area;
private List<Number> ratio;
private List<Number> extent;
private CameraStaticProperties camProps;
private List<MatOfPoint> filteredContours = new ArrayList<>();
@@ -25,6 +27,13 @@ public class FilterContoursPipe implements Pipe<List<MatOfPoint>, List<MatOfPoin
this.camProps = camProps;
}
public void setConfig(List<Number> area, List<Number> ratio, List<Number> extent, CameraStaticProperties camProps) {
this.area = area;
this.ratio = ratio;
this.extent = extent;
this.camProps = camProps;
}
@Override
public Pair<List<MatOfPoint>, Long> run(List<MatOfPoint> input) {
long processStartNanos = System.nanoTime();

View File

@@ -18,8 +18,8 @@ public class GroupContoursPipe implements Pipe<List<MatOfPoint>, List<RotatedRec
private static final Comparator<MatOfPoint> sortByMomentsX =
Comparator.comparingDouble(GroupContoursPipe::calcMomentsX);
private final TargetGroup group;
private final TargetIntersection intersection;
private TargetGroup group;
private TargetIntersection intersection;
private List<RotatedRect> groupedContours = new ArrayList<>();
private MatOfPoint2f intersectMatA = new MatOfPoint2f();
@@ -30,6 +30,11 @@ public class GroupContoursPipe implements Pipe<List<MatOfPoint>, List<RotatedRec
this.intersection = intersection;
}
public void setConfig(TargetGroup group, TargetIntersection intersection) {
this.group = group;
this.intersection = intersection;
}
@Override
public Pair<List<RotatedRect>, Long> run(List<MatOfPoint> input) {
long processStartNanos = System.nanoTime();

View File

@@ -9,7 +9,8 @@ import org.opencv.imgproc.Imgproc;
public class HsvPipe implements Pipe<Mat, Mat> {
private final Scalar hsvLower, hsvUpper;
private Scalar hsvLower;
private Scalar hsvUpper;
private Mat processBuffer = new Mat();
private Mat outputMat = new Mat();
@@ -19,6 +20,11 @@ public class HsvPipe implements Pipe<Mat, Mat> {
this.hsvUpper = hsvUpper;
}
public void setConfig(Scalar hsvLower, Scalar hsvUpper) {
this.hsvLower = hsvLower;
this.hsvUpper = hsvUpper;
}
@Override
public Pair<Mat, Long> run(Mat input) {
long processStartNanos = System.nanoTime();

View File

@@ -8,8 +8,8 @@ import org.opencv.core.Mat;
public class RotateFlipPipe implements Pipe<Mat, Mat> {
private final ImageRotation rotation;
private final ImageFlipMode flip;
private ImageRotation rotation;
private ImageFlipMode flip;
private Mat processBuffer = new Mat();
private Mat outputMat = new Mat();
@@ -19,6 +19,11 @@ public class RotateFlipPipe implements Pipe<Mat, Mat> {
this.flip = flip;
}
public void setConfig(ImageRotation rotation, ImageFlipMode flip) {
this.rotation = rotation;
this.flip = flip;
}
@Override
public Pair<Mat, Long> run(Mat input) {
long processStartNanos = System.nanoTime();

View File

@@ -24,8 +24,8 @@ public class SortContoursPipe implements Pipe<List<RotatedRect>, List<RotatedRec
private static final Comparator<RotatedRect> SortByRightmostComparator = SortByLeftmostComparator.reversed();
private final SortMode sort;
private final CameraStaticProperties camProps;
private SortMode sort;
private CameraStaticProperties camProps;
private List<RotatedRect> sortedContours = new ArrayList<>();
@@ -34,6 +34,11 @@ public class SortContoursPipe implements Pipe<List<RotatedRect>, List<RotatedRec
this.camProps = camProps;
}
public void setConfig(SortMode sort, CameraStaticProperties camProps) {
this.sort = sort;
this.camProps = camProps;
}
@Override
public Pair<List<RotatedRect>, Long> run(List<RotatedRect> input) {
long processStartNanos = System.nanoTime();

View File

@@ -9,7 +9,7 @@ import java.util.List;
public class SpeckleRejectPipe implements Pipe<List<MatOfPoint>, List<MatOfPoint>> {
private final double minPercentOfAvg;
private double minPercentOfAvg;
private List<MatOfPoint> despeckledContours = new ArrayList<>();
@@ -17,6 +17,10 @@ public class SpeckleRejectPipe implements Pipe<List<MatOfPoint>, List<MatOfPoint
this.minPercentOfAvg = minPercentOfAvg;
}
public void setConfig(double minPercentOfAvg) {
this.minPercentOfAvg = minPercentOfAvg;
}
@Override
public Pair<List<MatOfPoint>, Long> run(List<MatOfPoint> input) {
long processStartNanos = System.nanoTime();