diff --git a/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java b/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java index bc75347fa..578171845 100644 --- a/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java +++ b/Main/src/main/java/com/chameleonvision/vision/VisionProcess.java @@ -362,13 +362,11 @@ public class VisionProcess { result = currentPipeline.runPipeline(streamBuffer); lastPipelineResult = result; - var yes = lastPipelineResult==null; + if (result != null) { + updateNetworkTableData(lastPipelineResult); + updateUI(lastPipelineResult); + } - updateNetworkTableData(lastPipelineResult); - updateUI(lastPipelineResult); - - } else { -// System.err.println("Bad streambuffer mat"); } var deltaTimeNanos = lastUpdateTimeNanos - System.nanoTime(); 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 e9645a2f0..fd057df30 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/CVPipeline2d.java @@ -31,6 +31,8 @@ public class CVPipeline2d extends CVPipeline rotateFlipResult = rotateFlipPipe.run(inputMat); totalProcessTimeNanos += rotateFlipResult.getRight(); - procTimeStringBuilder.append(String.format("RotateFlip: %.2fms, ", rotateFlipResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("RotateFlip: %.2fms, ", rotateFlipResult.getRight() / 1000000.0)); Pair blurResult = blurPipe.run(rotateFlipResult.getLeft()); totalProcessTimeNanos += blurResult.getRight(); - procTimeStringBuilder.append(String.format("Blur: %.2fms, ", blurResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("Blur: %.2fms, ", blurResult.getRight() / 1000000.0)); Pair erodeDilateResult = erodeDilatePipe.run(blurResult.getLeft()); totalProcessTimeNanos += erodeDilateResult.getRight(); - procTimeStringBuilder.append(String.format("ErodeDilate: %.2fms, ", erodeDilateResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("ErodeDilate: %.2fms, ", erodeDilateResult.getRight() / 1000000.0)); Pair hsvResult = hsvPipe.run(erodeDilateResult.getLeft()); totalProcessTimeNanos += hsvResult.getRight(); - Imgproc.cvtColor(hsvResult.getLeft(), hsvOutputMat, Imgproc.COLOR_GRAY2BGR, 3); - procTimeStringBuilder.append(String.format("HSV: %.2fms, ", hsvResult.getRight() / 1000.0)); + + try { + Imgproc.cvtColor(hsvResult.getLeft(), hsvOutputMat, Imgproc.COLOR_GRAY2BGR, 3); + } catch (CvException e) { + System.err.println("(CVPipeline2d) Exception thrown by OpenCV: \n" + e.getMessage()); + } + + procTimeStringBuilder.append(String.format("HSV: %.2fms, ", hsvResult.getRight() / 1000000.0)); Pair, Long> findContoursResult = findContoursPipe.run(hsvResult.getLeft()); totalProcessTimeNanos += findContoursResult.getRight(); - procTimeStringBuilder.append(String.format("FindContours: %.2fms, ", findContoursResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("FindContours: %.2fms, ", findContoursResult.getRight() / 1000000.0)); Pair, Long> filterContoursResult = filterContoursPipe.run(findContoursResult.getLeft()); totalProcessTimeNanos += filterContoursResult.getRight(); - procTimeStringBuilder.append(String.format("FilterContours: %.2fms, ", filterContoursResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("FilterContours: %.2fms, ", filterContoursResult.getRight() / 1000000.0)); Pair, Long> speckleRejectResult = speckleRejectPipe.run(filterContoursResult.getLeft()); totalProcessTimeNanos += speckleRejectResult.getRight(); - procTimeStringBuilder.append(String.format("SpeckleReject: %.2fms, ", speckleRejectResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("SpeckleReject: %.2fms, ", speckleRejectResult.getRight() / 1000000.0)); Pair, Long> groupContoursResult = groupContoursPipe.run(speckleRejectResult.getLeft()); totalProcessTimeNanos += groupContoursResult.getRight(); - procTimeStringBuilder.append(String.format("GroupContours: %.2fms, ", groupContoursResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("GroupContours: %.2fms, ", groupContoursResult.getRight() / 1000000.0)); Pair, Long> sortContoursResult = sortContoursPipe.run(groupContoursResult.getLeft()); totalProcessTimeNanos += sortContoursResult.getRight(); - procTimeStringBuilder.append(String.format("SortContours: %.2fms, ", sortContoursResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("SortContours: %.2fms, ", sortContoursResult.getRight() / 1000000.0)); Pair, Long> collect2dTargetsResult = collect2dTargetsPipe.run(sortContoursResult.getLeft()); totalProcessTimeNanos += collect2dTargetsResult.getRight(); - procTimeStringBuilder.append(String.format("SortContours: %.2fms, ", sortContoursResult.getRight() / 1000.0)); + procTimeStringBuilder.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)); totalProcessTimeNanos += outputMatResult.getRight(); - procTimeStringBuilder.append(String.format("OutputMat: %.2fms, ", outputMatResult.getRight() / 1000.0)); + procTimeStringBuilder.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())); totalProcessTimeNanos += draw2dContoursResult.getRight(); - procTimeStringBuilder.append(String.format("Draw2dContours: %.2fms, ", draw2dContoursResult.getRight() / 1000.0)); + procTimeStringBuilder.append(String.format("Draw2dContours: %.2fms, ", draw2dContoursResult.getRight() / 1000000.0)); System.out.println(procTimeStringBuilder.toString()); - System.out.printf("Pipeline ran in %.3fms\n", totalProcessTimeNanos / 1000.0); + System.out.printf("Pipeline ran in %.3fms\n", totalProcessTimeNanos / 1000000.0); - return new CVPipeline2dResult(collect2dTargetsResult.getLeft(), draw2dContoursResult.getLeft(), totalProcessTimeNanos / 1000); + return new CVPipeline2dResult(collect2dTargetsResult.getLeft(), draw2dContoursResult.getLeft(), totalProcessTimeNanos); } public static class CVPipeline2dResult extends CVPipelineResult { - public CVPipeline2dResult(List targets, Mat outputMat, long processTime) { - super(targets, outputMat, processTime); + public CVPipeline2dResult(List targets, Mat outputMat, long processTimeNanos) { + super(targets, outputMat, processTimeNanos); } } diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/BlurPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/BlurPipe.java index f490c4f7f..51a216a8e 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/BlurPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/BlurPipe.java @@ -1,7 +1,10 @@ package com.chameleonvision.vision.pipeline.pipes; import org.apache.commons.lang3.tuple.Pair; +import org.opencv.core.CvException; import org.opencv.core.Mat; +import org.opencv.core.Size; +import org.opencv.imgproc.Imgproc; public class BlurPipe implements Pipe { @@ -18,15 +21,15 @@ public class BlurPipe implements Pipe { public Pair run(Mat input) { long processStartNanos = System.nanoTime(); - // TODO (HIGH) make this blur - input.copyTo(processBuffer); -// if (blurSize > 0) { -// Imgproc.blur(outputMat, outputMat, new Size(blurSize, blurSize)); -// } + try { + if (blurSize > 0) { + Imgproc.blur(outputMat, outputMat, new Size(blurSize, blurSize)); + } + } catch (CvException e) { + System.err.println("(BlurPipe) Exception thrown by OpenCV: \n" + e.getMessage()); + } - processBuffer.copyTo(outputMat); - - long processTime = processStartNanos - System.nanoTime(); + long processTime = System.nanoTime() - processStartNanos; Pair output = Pair.of(outputMat, processTime); processBuffer.release(); diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java index 3d9fcf0ba..cb0111c76 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/Collect2dTargetsPipe.java @@ -56,7 +56,7 @@ public class Collect2dTargetsPipe implements Pipe, List>, Ma } } - long processTime = processStartNanos - System.nanoTime(); + long processTime = System.nanoTime() - processStartNanos; Pair output = Pair.of(outputMat, processTime); outputMat.release(); return output; diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/ErodeDilatePipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/ErodeDilatePipe.java index e0e86641c..adb26805f 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/ErodeDilatePipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/ErodeDilatePipe.java @@ -35,8 +35,7 @@ public class ErodeDilatePipe implements Pipe { input.copyTo(processBuffer); } - long processTime = processStartNanos - System.nanoTime(); - processBuffer.copyTo(outputMat); + long processTime = System.nanoTime() - processStartNanos; Pair output = Pair.of(outputMat, processTime); processBuffer.release(); diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java index 404bbcd5a..429b79052 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/FilterContoursPipe.java @@ -56,7 +56,7 @@ public class FilterContoursPipe implements Pipe, List> { Imgproc.findContours(input, foundContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_TC89_L1); - long processTime = processStartNanos - System.nanoTime(); + long processTime = System.nanoTime() - processStartNanos; return Pair.of(foundContours, processTime); } } diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/GroupContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/GroupContoursPipe.java index db3a374e6..4f9581b31 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/GroupContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/GroupContoursPipe.java @@ -85,7 +85,7 @@ public class GroupContoursPipe implements Pipe, List { public Pair run(Mat input) { long processStartNanos = System.nanoTime(); - // convert from rgb to hsv - if(input.empty()) { - throw new RuntimeException("HSV input cannot be empty!"); + try { + Imgproc.cvtColor(input, outputMat, Imgproc.COLOR_RGB2HSV, 3); + Core.inRange(outputMat, hsvLower, hsvUpper, outputMat); + } catch (CvException e) { + System.err.println("(HsvPipe) Exception thrown by OpenCV: \n" + e.getMessage()); } - Imgproc.cvtColor(input, processBuffer, Imgproc.COLOR_RGB2HSV, 3); - Core.inRange(processBuffer, hsvLower, hsvUpper, processBuffer); - - long processTime = processStartNanos - System.nanoTime(); - processBuffer.copyTo(outputMat); + long processTime = System.nanoTime() - processStartNanos; Pair output = Pair.of(outputMat, processTime); processBuffer.release(); return output; 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 f0dc2af3d..7593a2ca8 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 @@ -19,7 +19,7 @@ public class OutputMatPipe implements Pipe, Mat> { outputMat = showThresholded ? input.getRight() : input.getLeft(); - long processTime = processStartNanos - System.nanoTime(); + long processTime = System.nanoTime() - processStartNanos; Pair output = Pair.of(outputMat, processTime); outputMat.release(); return output; diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java index 03a67ccdd..cb7378d5c 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/RotateFlipPipe.java @@ -26,8 +26,7 @@ public class RotateFlipPipe implements Pipe { Core.flip(input, processBuffer, flip.value); Core.rotate(processBuffer, processBuffer, rotation.value); - long processTime = processStartNanos - System.nanoTime(); - processBuffer.copyTo(outputMat); + long processTime = System.nanoTime() - processStartNanos; Pair output = Pair.of(outputMat, processTime); processBuffer.release(); return output; diff --git a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java index 1a6934849..89454222a 100644 --- a/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java +++ b/Main/src/main/java/com/chameleonvision/vision/pipeline/pipes/SortContoursPipe.java @@ -64,7 +64,7 @@ public class SortContoursPipe implements Pipe, List, List