From 79fd79be415548f80c0e439e96eca3cc8165fbe7 Mon Sep 17 00:00:00 2001 From: Banks Troutman Date: Mon, 25 Nov 2019 16:40:23 -0500 Subject: [PATCH] Memory cleanups --- .../vision/pipeline/CVPipeline2d.java | 75 +++++++++++-------- .../pipeline/pipes/Draw2dContoursPipe.java | 7 +- .../vision/pipeline/pipes/OutputMatPipe.java | 4 + 3 files changed, 52 insertions(+), 34 deletions(-) diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java index b895cb399..8bb2f3f51 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java @@ -17,6 +17,7 @@ public class CVPipeline2d extends CVPipeline rotateFlipResult = rotateFlipPipe.run(inputMat); totalPipelineTimeNanos += rotateFlipResult.getRight(); - pipelineTimeStringBuilder.append(String.format("RotateFlip: %.2fms, ", rotateFlipResult.getRight() / 1000000.0)); Pair blurResult = blurPipe.run(rotateFlipResult.getLeft()); totalPipelineTimeNanos += blurResult.getRight(); - pipelineTimeStringBuilder.append(String.format("Blur: %.2fms, ", blurResult.getRight() / 1000000.0)); Pair erodeDilateResult = erodeDilatePipe.run(blurResult.getLeft()); totalPipelineTimeNanos += erodeDilateResult.getRight(); - pipelineTimeStringBuilder.append(String.format("ErodeDilate: %.2fms, ", erodeDilateResult.getRight() / 1000000.0)); Pair hsvResult = hsvPipe.run(erodeDilateResult.getLeft()); totalPipelineTimeNanos += hsvResult.getRight(); + // Todo: move to a pipe try { Imgproc.cvtColor(hsvResult.getLeft(), hsvOutputMat, Imgproc.COLOR_GRAY2BGR, 3); } catch (CvException e) { System.err.println("(CVPipeline2d) Exception thrown by OpenCV: \n" + e.getMessage()); } - pipelineTimeStringBuilder.append(String.format("HSV: %.2fms, ", hsvResult.getRight() / 1000000.0)); - Pair, Long> findContoursResult = findContoursPipe.run(hsvResult.getLeft()); totalPipelineTimeNanos += findContoursResult.getRight(); - pipelineTimeStringBuilder.append(String.format("FindContours: %.2fms, ", findContoursResult.getRight() / 1000000.0)); Pair, Long> filterContoursResult = filterContoursPipe.run(findContoursResult.getLeft()); totalPipelineTimeNanos += filterContoursResult.getRight(); - pipelineTimeStringBuilder.append(String.format("FilterContours: %.2fms, ", filterContoursResult.getRight() / 1000000.0)); Pair, Long> speckleRejectResult = speckleRejectPipe.run(filterContoursResult.getLeft()); totalPipelineTimeNanos += speckleRejectResult.getRight(); - pipelineTimeStringBuilder.append(String.format("SpeckleReject: %.2fms, ", speckleRejectResult.getRight() / 1000000.0)); Pair, Long> groupContoursResult = groupContoursPipe.run(speckleRejectResult.getLeft()); totalPipelineTimeNanos += groupContoursResult.getRight(); - pipelineTimeStringBuilder.append(String.format("GroupContours: %.2fms, ", groupContoursResult.getRight() / 1000000.0)); Pair, Long> sortContoursResult = sortContoursPipe.run(groupContoursResult.getLeft()); totalPipelineTimeNanos += sortContoursResult.getRight(); - pipelineTimeStringBuilder.append(String.format("SortContours: %.2fms, ", sortContoursResult.getRight() / 1000000.0)); Pair, Long> collect2dTargetsResult = collect2dTargetsPipe.run(sortContoursResult.getLeft()); totalPipelineTimeNanos += collect2dTargetsResult.getRight(); - pipelineTimeStringBuilder.append(String.format("SortContours: %.2fms, ", sortContoursResult.getRight() / 1000000.0)); // takes pair of (Mat of original camera image, Mat of HSV thresholded image) Pair outputMatResult = outputMatPipe.run(Pair.of(rawCameraMat, hsvOutputMat)); totalPipelineTimeNanos += outputMatResult.getRight(); - pipelineTimeStringBuilder.append(String.format("OutputMat: %.2fms, ", outputMatResult.getRight() / 1000000.0)); // takes pair of (Mat to draw on, List of sorted contours) Pair draw2dContoursResult = draw2dContoursPipe.run(Pair.of(outputMatResult.getLeft(), sortContoursResult.getLeft())); totalPipelineTimeNanos += draw2dContoursResult.getRight(); + + pipelineTimeStringBuilder.append(String.format("PipeInit: %.2fms, ", pipeInitTimeNanos / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("RotateFlip: %.2fms, ", rotateFlipResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("Blur: %.2fms, ", blurResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("ErodeDilate: %.2fms, ", erodeDilateResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("HSV: %.2fms, ", hsvResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("FindContours: %.2fms, ", findContoursResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("FilterContours: %.2fms, ", filterContoursResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("SpeckleReject: %.2fms, ", speckleRejectResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("GroupContours: %.2fms, ", groupContoursResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("SortContours: %.2fms, ", sortContoursResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("Collect2dTargets: %.2fms, ", collect2dTargetsResult.getRight() / 1000000.0)); + pipelineTimeStringBuilder.append(String.format("OutputMat: %.2fms, ", outputMatResult.getRight() / 1000000.0)); pipelineTimeStringBuilder.append(String.format("Draw2dContours: %.2fms, ", draw2dContoursResult.getRight() / 1000000.0)); System.out.println(pipelineTimeStringBuilder.toString()); diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java index 6b95ca930..3fc361f47 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Draw2dContoursPipe.java @@ -2,6 +2,7 @@ package com.chameleonvision.vision.pipeline.pipes; import com.chameleonvision.vision.camera.CaptureStaticProperties; import com.chameleonvision.util.Helpers; +import com.chameleonvision.vision.image.CaptureProperties; import org.apache.commons.lang3.tuple.Pair; import org.opencv.core.Point; import org.opencv.core.*; @@ -14,7 +15,7 @@ import java.util.List; public class Draw2dContoursPipe implements Pipe>, Mat> { private final Draw2dContoursSettings settings; - private final CaptureStaticProperties camProps; + private CaptureStaticProperties camProps; private Mat outputMat = new Mat(); @@ -23,6 +24,10 @@ public class Draw2dContoursPipe implements Pipe>, Ma this.camProps = camProps; } + public void setConfig(CaptureStaticProperties captureProps) { + camProps = captureProps; + } + @Override public Pair run(Pair> input) { long processStartNanos = System.nanoTime(); diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/OutputMatPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/OutputMatPipe.java index 7593a2ca8..df7972108 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/OutputMatPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/OutputMatPipe.java @@ -13,6 +13,10 @@ public class OutputMatPipe implements Pipe, Mat> { this.showThresholded = showThresholded; } + public void setConfig(boolean showThresholded) { + this.showThresholded = showThresholded; + } + @Override public Pair run(Pair input) { long processStartNanos = System.nanoTime();