Attempt further memory fixes, begin unit tests, fix DriverMode rotation

This commit is contained in:
Banks Troutman
2019-12-01 04:39:21 -05:00
parent daa51b78b3
commit a24e633ceb
17 changed files with 186 additions and 50 deletions

View File

@@ -1,6 +1,7 @@
package com.chameleonvision.vision.pipeline;
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.pipeline.pipes.*;
@@ -78,6 +79,8 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
outputMatPipe = new OutputMatPipe(settings.isBinary);
}
private final MemoryManager memManager = new MemoryManager(120);
@Override
public CVPipeline2dResult runPipeline(Mat inputMat) {
long totalPipelineTimeNanos = 0;
@@ -181,6 +184,8 @@ public class CVPipeline2d extends CVPipeline<CVPipeline2dResult, CVPipeline2dSet
System.out.printf("full pipeline run time was %.3fms (%.2fFPS)\n", truePipelineTimeMillis, truePipelineFPS);
}
memManager.run(Main.testMode);
return new CVPipeline2dResult(collect2dTargetsResult.getLeft(), draw2dContoursResult.getLeft(), totalPipelineTimeNanos);
}

View File

@@ -7,14 +7,16 @@ import java.util.List;
public abstract class CVPipelineResult<T> {
public final List<T> targets;
public final boolean hasTarget;
public final Mat outputMat = new Mat();
public final Mat outputMat;
public final long processTime;
public long imageTimestamp = 0;
public CVPipelineResult(List<T> targets, Mat outputMat, long processTime) {
this.targets = targets;
hasTarget = targets != null && !targets.isEmpty();
outputMat.copyTo(this.outputMat);
this.outputMat = outputMat;
// outputMat.copyTo(this.outputMat);
// outputMat.release();
this.processTime = processTime;
}

View File

@@ -1,7 +1,10 @@
package com.chameleonvision.vision.pipeline;
import com.chameleonvision.Main;
import com.chameleonvision.util.MemoryManager;
import com.chameleonvision.vision.camera.CameraCapture;
import com.chameleonvision.vision.pipeline.pipes.Draw2dContoursPipe;
import com.chameleonvision.vision.pipeline.pipes.RotateFlipPipe;
import org.apache.commons.lang3.tuple.Pair;
import org.opencv.core.Mat;
import org.opencv.core.RotatedRect;
@@ -12,10 +15,13 @@ 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 final List<RotatedRect> blankList = List.of();
private final MemoryManager memoryManager = new MemoryManager(50);
public DriverVisionPipeline(CVPipelineSettings settings) {
super(settings);
settings.index = -1;
@@ -24,6 +30,7 @@ public class DriverVisionPipeline extends CVPipeline<DriverPipelineResult, CVPip
@Override
public void initPipeline(CameraCapture capture) {
super.initPipeline(capture);
rotateFlipPipe = new RotateFlipPipe(settings.rotationMode, settings.flipMode);
draw2dContoursSettings.showCrosshair = true;
draw2dContoursPipe = new Draw2dContoursPipe(draw2dContoursSettings, cameraCapture.getProperties().getStaticProperties());
}
@@ -31,12 +38,17 @@ public class DriverVisionPipeline extends CVPipeline<DriverPipelineResult, CVPip
@Override
public DriverPipelineResult runPipeline(Mat inputMat) {
inputMat.copyTo(outputMat);
// inputMat.copyTo(outputMat);
rotateFlipPipe.setConfig(settings.rotationMode, settings.flipMode);
draw2dContoursPipe.setConfig(false, cameraCapture.getProperties().getStaticProperties());
draw2dContoursPipe.run(Pair.of(outputMat, blankList)).getLeft().copyTo(outputMat);
return new DriverPipelineResult(null, outputMat, 0);
Pair<Mat, Long> rotateFlipResult = rotateFlipPipe.run(inputMat);
Pair<Mat, Long> draw2dContoursResult = draw2dContoursPipe.run(Pair.of(rotateFlipResult.getLeft(), blankList));
memoryManager.run(Main.testMode);
return new DriverPipelineResult(null, draw2dContoursResult.getLeft(), 0);
}
public static class DriverPipelineResult extends CVPipelineResult<Void> {

View File

@@ -40,7 +40,8 @@ public class Draw2dContoursPipe implements Pipe<Pair<Mat, List<RotatedRect>>, Ma
long processStartNanos = System.nanoTime();
if (settings.showCrosshair || settings.showCentroid || settings.showMaximumBox || settings.showRotatedBox) {
input.getLeft().copyTo(processBuffer);
// input.getLeft().copyTo(processBuffer);
processBuffer = input.getLeft();
if (input.getRight().size() > 0) {
for (int i = 0; i < input.getRight().size(); i++) {
@@ -81,14 +82,14 @@ public class Draw2dContoursPipe implements Pipe<Pair<Mat, List<RotatedRect>>, Ma
Imgproc.line(processBuffer, yMax, yMin, Helpers.colorToScalar(settings.crosshairColor), 2);
}
processBuffer.copyTo(outputMat);
processBuffer.release();
// processBuffer.copyTo(outputMat);
// processBuffer.release();
} else {
input.getLeft().copyTo(outputMat);
// input.getLeft().copyTo(outputMat);
}
long processTime = System.nanoTime() - processStartNanos;
return Pair.of(outputMat, processTime);
return Pair.of(processBuffer, processTime);
}
public static class Draw2dContoursSettings {

View File

@@ -32,23 +32,23 @@ public class RotateFlipPipe implements Pipe<Mat, Mat> {
boolean shouldRotate = !rotation.equals(ImageRotationMode.DEG_0);
if (shouldFlip || shouldRotate) {
input.copyTo(processBuffer);
// input.copyTo(processBuffer);
if (shouldFlip) {
Core.flip(processBuffer, processBuffer, flip.value);
Core.flip(input, input, flip.value);
}
if (shouldRotate) {
Core.rotate(processBuffer, processBuffer, rotation.value);
Core.rotate(input, input, rotation.value);
}
processBuffer.copyTo(outputMat);
processBuffer.release();
// processBuffer.copyTo(outputMat);
// processBuffer.release();
} else {
input.copyTo(outputMat);
// input.copyTo(outputMat);
}
long processTime = System.nanoTime() - processStartNanos;
return Pair.of(outputMat, processTime);
return Pair.of(input, processTime);
}
}