From 971ff3ac40615e86409434ed07074d7bb79a0053 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 31 Mar 2022 22:51:14 -0400 Subject: [PATCH] Calculate aspect ratio using rotated rect (#447) --- .../src/views/PipelineViews/ContoursTab.vue | 16 ++++++++++++++++ .../vision/pipe/impl/FilterContoursPipe.java | 13 ++++++------- .../vision/pipeline/ReflectivePipeline.java | 4 +++- .../vision/target/TargetCalculations.java | 17 +++++++++++++++++ 4 files changed, 42 insertions(+), 8 deletions(-) diff --git a/photon-client/src/views/PipelineViews/ContoursTab.vue b/photon-client/src/views/PipelineViews/ContoursTab.vue index 364bd6968..d04de02de 100644 --- a/photon-client/src/views/PipelineViews/ContoursTab.vue +++ b/photon-client/src/views/PipelineViews/ContoursTab.vue @@ -18,6 +18,14 @@ step="0.1" @input="handlePipelineData('contourRatio')" /> + , List, FilterContoursPipe.FilterContoursParams> { @@ -114,8 +112,7 @@ public class FilterContoursPipe if (contourArea <= minFullness || contourArea >= maxFullness) return; // Aspect Ratio Filtering. - Rect boundingRect = contour.getBoundingRect(); - double aspectRatio = (double) boundingRect.width / boundingRect.height; + double aspectRatio = TargetCalculations.getAspectRatio(contour.getMinAreaRect(), params.isLandscape); if (aspectRatio < params.getRatio().getFirst() || aspectRatio > params.getRatio().getSecond()) return; @@ -129,6 +126,7 @@ public class FilterContoursPipe private final FrameStaticProperties m_frameStaticProperties; private final double xTol; // IQR tolerance for x private final double yTol; // IQR tolerance for x + public final boolean isLandscape; public FilterContoursParams( DoubleCouple area, @@ -136,13 +134,14 @@ public class FilterContoursPipe DoubleCouple extent, FrameStaticProperties camProperties, double xTol, - double yTol) { + double yTol, boolean isLandscape) { this.m_area = area; this.m_ratio = ratio; this.m_fullness = extent; this.m_frameStaticProperties = camProperties; this.xTol = xTol; this.yTol = yTol; + this.isLandscape = isLandscape; } public DoubleCouple getArea() { diff --git a/photon-core/src/main/java/org/photonvision/vision/pipeline/ReflectivePipeline.java b/photon-core/src/main/java/org/photonvision/vision/pipeline/ReflectivePipeline.java index ac7476bed..f3da480ed 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipeline/ReflectivePipeline.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipeline/ReflectivePipeline.java @@ -30,6 +30,7 @@ import org.photonvision.vision.pipe.CVPipe.CVPipeResult; import org.photonvision.vision.pipe.impl.*; import org.photonvision.vision.pipeline.result.CVPipelineResult; import org.photonvision.vision.target.PotentialTarget; +import org.photonvision.vision.target.TargetOrientation; import org.photonvision.vision.target.TrackedTarget; /** Represents a pipeline for tracking retro-reflective targets. */ @@ -102,7 +103,8 @@ public class ReflectivePipeline extends CVPipeline1) + if (isLandscape && ratio < 1) { + ratio = 1.0 / ratio; + } + + // If portrait, should always be taller than wide (ratio < 1) + else if (!isLandscape && ratio > 1) { + ratio = 1.0 / ratio; + } + + return ratio; + } + public static Point calculateDualOffsetCrosshair( DualOffsetValues dualOffsetValues, double currentArea) { boolean firstLarger = dualOffsetValues.firstPointArea >= dualOffsetValues.secondPointArea;