Fix multicam and picam acceleration (#205)

Allows pipelines to access quirks
This commit is contained in:
Matt
2020-12-31 22:41:57 -08:00
committed by GitHub
parent d92595f622
commit f676023a5d
15 changed files with 88 additions and 105 deletions

View File

@@ -26,6 +26,7 @@ import org.junit.jupiter.api.Test;
import org.photonvision.common.util.TestUtils;
import org.photonvision.common.util.math.MathUtils;
import org.photonvision.common.util.numbers.NumberListUtils;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.FrameProvider;
import org.photonvision.vision.frame.provider.FileFrameProvider;
import org.photonvision.vision.opencv.CVMat;
@@ -122,7 +123,7 @@ public class BenchmarkTest {
// warmup for 5 loops.
System.out.println("Warming up for 5 loops...");
for (int i = 0; i < 5; i++) {
pipeline.run(frameProvider.get());
pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
}
final List<Double> processingTimes = new ArrayList<>();
@@ -140,7 +141,8 @@ public class BenchmarkTest {
+ frameProps.imageHeight);
var benchmarkStartMillis = System.currentTimeMillis();
do {
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get());
CVPipelineResult pipelineResult =
pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
pipelineResult.release();
processingTimes.add(pipelineResult.processingMillis);
latencyTimes.add(pipelineResult.getLatencyMillis());

View File

@@ -40,6 +40,7 @@ import org.junit.jupiter.api.Test;
import org.photonvision.common.util.TestUtils;
import org.photonvision.common.util.math.MathUtils;
import org.photonvision.common.util.numbers.NumberListUtils;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.FrameProvider;
import org.photonvision.vision.frame.provider.FileFrameProvider;
import org.photonvision.vision.opencv.CVMat;
@@ -150,7 +151,7 @@ public class ShapeBenchmarkTest {
// warmup for 5 loops.
System.out.println("Warming up for 5 loops...");
for (int i = 0; i < 5; i++) {
pipeline.run(frameProvider.get());
pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
}
final List<Double> processingTimes = new ArrayList<>();
@@ -168,7 +169,8 @@ public class ShapeBenchmarkTest {
+ frameProps.imageHeight);
var benchmarkStartMillis = System.currentTimeMillis();
do {
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get());
CVPipelineResult pipelineResult =
pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
pipelineResult.release();
processingTimes.add(pipelineResult.processingMillis);
latencyTimes.add(pipelineResult.getLatencyMillis());

View File

@@ -37,6 +37,7 @@ import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import org.photonvision.common.util.TestUtils;
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.Frame;
import org.photonvision.vision.frame.FrameStaticProperties;
import org.photonvision.vision.opencv.CVMat;
@@ -102,7 +103,8 @@ public class Calibrate3dPipeTest {
calibration3dPipeline.run(
new Frame(
new CVMat(Imgcodecs.imread(file.getAbsolutePath())),
new FrameStaticProperties(640, 480, 60, new Rotation2d(), null)));
new FrameStaticProperties(640, 480, 60, new Rotation2d(), null)),
QuirkyCamera.DefaultCamera);
// TestUtils.showImage(output.outputFrame.image.getMat());
output.release();
}
@@ -117,7 +119,8 @@ public class Calibrate3dPipeTest {
.run(
new Frame(
new CVMat(Imgcodecs.imread(directoryListing[0].getAbsolutePath())),
new FrameStaticProperties(640, 480, 60, new Rotation2d(), null)))
new FrameStaticProperties(640, 480, 60, new Rotation2d(), null)),
QuirkyCamera.DefaultCamera)
.release();
assertTrue(
@@ -264,7 +267,8 @@ public class Calibrate3dPipeTest {
new Frame(
new CVMat(Imgcodecs.imread(file.getAbsolutePath())),
new FrameStaticProperties(
(int) imgRes.width, (int) imgRes.height, 67, new Rotation2d(), null)));
(int) imgRes.width, (int) imgRes.height, 67, new Rotation2d(), null)),
QuirkyCamera.DefaultCamera);
// TestUtils.showImage(output.outputFrame.image.getMat(), file.getName(), 1);
output.outputFrame.release();

View File

@@ -25,6 +25,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.photonvision.common.util.TestUtils;
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.Frame;
import org.photonvision.vision.frame.provider.FileFrameProvider;
import org.photonvision.vision.opencv.CVMat;
@@ -114,7 +115,7 @@ public class CirclePNPTest {
new Rotation2d(),
TestUtils.get2020LifeCamCoeffs(true));
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get());
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
TestUtils.showImage(pipelineResult.outputFrame.image.getMat(), "Pipeline output", 999999);
@@ -125,7 +126,7 @@ public class CirclePNPTest {
pipeline.settings = settings;
while (true) {
CVPipelineResult pipelineResult = pipeline.run(frame);
CVPipelineResult pipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
int preRelease = CVMat.getMatCount();
pipelineResult.release();

View File

@@ -19,8 +19,8 @@ package org.photonvision.vision.pipeline;
import org.junit.jupiter.api.Test;
import org.photonvision.common.util.TestUtils;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.Frame;
import org.photonvision.vision.frame.FrameStaticProperties;
import org.photonvision.vision.frame.provider.FileFrameProvider;
import org.photonvision.vision.opencv.ContourGroupingMode;
import org.photonvision.vision.opencv.ContourIntersectionDirection;
@@ -30,38 +30,29 @@ import org.photonvision.vision.pipeline.result.CVPipelineResult;
public class ColoredShapePipelineTest {
public static void testTriangleDetection(
ColoredShapePipeline pipeline,
ColoredShapePipelineSettings settings,
FrameStaticProperties frameStaticProperties,
Frame frame) {
pipeline.setPipeParams(frameStaticProperties, settings);
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame);
ColoredShapePipeline pipeline, ColoredShapePipelineSettings settings, Frame frame) {
pipeline.settings = settings;
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
TestUtils.showImage(
colouredShapePipelineResult.outputFrame.image.getMat(), "Pipeline output: Triangle.");
printTestResults(colouredShapePipelineResult);
}
public static void testQuadrilateralDetection(
ColoredShapePipeline pipeline,
ColoredShapePipelineSettings settings,
FrameStaticProperties frameStaticProperties,
Frame frame) {
ColoredShapePipeline pipeline, ColoredShapePipelineSettings settings, Frame frame) {
settings.desiredShape = ContourShape.Quadrilateral;
pipeline.setPipeParams(frameStaticProperties, settings);
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame);
pipeline.settings = settings;
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
TestUtils.showImage(
colouredShapePipelineResult.outputFrame.image.getMat(), "Pipeline output: Quadrilateral.");
printTestResults(colouredShapePipelineResult);
}
public static void testCustomShapeDetection(
ColoredShapePipeline pipeline,
ColoredShapePipelineSettings settings,
FrameStaticProperties frameStaticProperties,
Frame frame) {
ColoredShapePipeline pipeline, ColoredShapePipelineSettings settings, Frame frame) {
settings.desiredShape = ContourShape.Custom;
pipeline.setPipeParams(frameStaticProperties, settings);
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame);
pipeline.settings = settings;
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
TestUtils.showImage(
colouredShapePipelineResult.outputFrame.image.getMat(), "Pipeline output: Custom.");
printTestResults(colouredShapePipelineResult);
@@ -69,13 +60,10 @@ public class ColoredShapePipelineTest {
@Test
public static void testCircleShapeDetection(
ColoredShapePipeline pipeline,
ColoredShapePipelineSettings settings,
FrameStaticProperties frameStaticProperties,
Frame frame) {
ColoredShapePipeline pipeline, ColoredShapePipelineSettings settings, Frame frame) {
settings.desiredShape = ContourShape.Circle;
pipeline.setPipeParams(frameStaticProperties, settings);
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame);
pipeline.settings = settings;
CVPipelineResult colouredShapePipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
TestUtils.showImage(
colouredShapePipelineResult.outputFrame.image.getMat(), "Pipeline output: Circle.");
printTestResults(colouredShapePipelineResult);
@@ -95,8 +83,7 @@ public class ColoredShapePipelineTest {
new FileFrameProvider(
TestUtils.getPowercellImagePath(TestUtils.PowercellTestImages.kPowercell_test_6, false),
TestUtils.WPI2019Image.FOV);
testCircleShapeDetection(
pipeline, settings, frameProvider.get().frameStaticProperties, frameProvider.get());
testCircleShapeDetection(pipeline, settings, frameProvider.get());
}
public static void main(String[] args) {
@@ -120,14 +107,10 @@ public class ColoredShapePipelineTest {
settings.accuracyPercentage = 30.0;
ColoredShapePipeline pipeline = new ColoredShapePipeline();
testTriangleDetection(
pipeline, settings, frameProvider.get().frameStaticProperties, frameProvider.get());
testQuadrilateralDetection(
pipeline, settings, frameProvider.get().frameStaticProperties, frameProvider.get());
testCustomShapeDetection(
pipeline, settings, frameProvider.get().frameStaticProperties, frameProvider.get());
testCircleShapeDetection(
pipeline, settings, frameProvider.get().frameStaticProperties, frameProvider.get());
testTriangleDetection(pipeline, settings, frameProvider.get());
testQuadrilateralDetection(pipeline, settings, frameProvider.get());
testCustomShapeDetection(pipeline, settings, frameProvider.get());
testCircleShapeDetection(pipeline, settings, frameProvider.get());
testPowercellDetection(settings, pipeline);
}

View File

@@ -20,6 +20,7 @@ package org.photonvision.vision.pipeline;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.photonvision.common.util.TestUtils;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.Frame;
import org.photonvision.vision.frame.provider.FileFrameProvider;
import org.photonvision.vision.opencv.CVMat;
@@ -50,7 +51,7 @@ public class ReflectivePipelineTest {
CVPipelineResult pipelineResult;
pipelineResult = pipeline.run(frameProvider.get());
pipelineResult = pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
Assertions.assertTrue(pipelineResult.hasTargets());
@@ -74,7 +75,7 @@ public class ReflectivePipelineTest {
TestUtils.getWPIImagePath(TestUtils.WPI2020Image.kBlueGoal_108in_Center, false),
TestUtils.WPI2020Image.FOV);
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get());
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
TestUtils.showImage(pipelineResult.outputFrame.image.getMat(), "Pipeline output");
@@ -84,7 +85,7 @@ public class ReflectivePipelineTest {
var pipeline = new ReflectivePipeline();
while (true) {
CVPipelineResult pipelineResult = pipeline.run(frame);
CVPipelineResult pipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
int preRelease = CVMat.getMatCount();
pipelineResult.release();

View File

@@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test;
import org.opencv.imgcodecs.Imgcodecs;
import org.photonvision.common.util.TestUtils;
import org.photonvision.vision.calibration.CameraCalibrationCoefficients;
import org.photonvision.vision.camera.QuirkyCamera;
import org.photonvision.vision.frame.Frame;
import org.photonvision.vision.frame.provider.FileFrameProvider;
import org.photonvision.vision.opencv.CVMat;
@@ -109,7 +110,7 @@ public class SolvePNPTest {
CVPipelineResult pipelineResult;
pipelineResult = pipeline.run(frameProvider.get());
pipelineResult = pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
// these numbers are not *accurate*, but they are known and expected
@@ -142,7 +143,7 @@ public class SolvePNPTest {
new Rotation2d(),
TestUtils.get2020LifeCamCoeffs(true));
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get());
CVPipelineResult pipelineResult = pipeline.run(frameProvider.get(), QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
// these numbers are not *accurate*, but they are known and expected
@@ -159,7 +160,7 @@ public class SolvePNPTest {
pipeline.settings = settings;
while (true) {
CVPipelineResult pipelineResult = pipeline.run(frame);
CVPipelineResult pipelineResult = pipeline.run(frame, QuirkyCamera.DefaultCamera);
printTestResults(pipelineResult);
int preRelease = CVMat.getMatCount();
pipelineResult.release();