diff --git a/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java b/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java index 2a50ea5ea..224c55653 100644 --- a/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java +++ b/photon-core/src/main/java/org/photonvision/common/util/TestUtils.java @@ -196,7 +196,8 @@ public class TestUtils { public enum ApriltagTestImages { kRobots, - kTag1_640_480; + kTag1_640_480, + kTag_corner_1280; public final Path path; @@ -302,6 +303,7 @@ public class TestUtils { private static final String LIFECAM_240P_CAL_FILE = "lifecam240p.json"; private static final String LIFECAM_480P_CAL_FILE = "lifecam480p.json"; + public static final String LIMELIGHT_480P_CAL_FILE = "limelight_1280_720.json"; public static CameraCalibrationCoefficients getCoeffs(String filename, boolean testMode) { try { diff --git a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/AprilTagPoseEstimatorPipe.java b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/AprilTagPoseEstimatorPipe.java index 0d13493da..2ff9a3fdd 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/AprilTagPoseEstimatorPipe.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/AprilTagPoseEstimatorPipe.java @@ -21,6 +21,11 @@ import edu.wpi.first.apriltag.AprilTagDetection; import edu.wpi.first.apriltag.AprilTagPoseEstimate; import edu.wpi.first.apriltag.AprilTagPoseEstimator; import edu.wpi.first.apriltag.AprilTagPoseEstimator.Config; +import java.util.Arrays; +import org.opencv.calib3d.Calib3d; +import org.opencv.core.MatOfPoint2f; +import org.opencv.core.Point; +import org.photonvision.vision.calibration.CameraCalibrationCoefficients; import org.photonvision.vision.pipe.CVPipe; public class AprilTagPoseEstimatorPipe @@ -37,8 +42,55 @@ public class AprilTagPoseEstimatorPipe super(); } + MatOfPoint2f temp = new MatOfPoint2f(); + @Override protected AprilTagPoseEstimate process(AprilTagDetection in) { + // Save the corner points of our detection to an array + Point corners[] = new Point[4]; + for (int i = 0; i < 4; i++) { + corners[i] = new Point(in.getCornerX(i), in.getCornerY(i)); + } + System.out.println("Before: " + Arrays.toString(corners)); + // And shove into our matofpoints + temp.fromArray(corners); + + System.out.println("Size " + temp.size().toString()); + + // Probably overwrites what was in temp before. I hope + Calib3d.undistortPoints( + temp, + temp, + params.calibration.getCameraIntrinsicsMat(), + params.calibration.getDistCoeffsMat()); + + // Save out undistorted corners + corners = temp.toArray(); + + // Apriltagdetection expects an array in form [x1 y1 x2 y2 ...] + var fixedCorners = new double[8]; + for (int i = 0; i < 4; i++) { + // https://stackoverflow.com/questions/8499984/how-to-undistort-points-in-camera-shot-coordinates-and-obtain-corresponding-undi + // perform transformation. + // In fact this is equivalent to multiplication to camera matrix + + fixedCorners[i * 2] = corners[i].x * params.config.fx + params.config.cx; + fixedCorners[i * 2 + 1] = corners[i].y * params.config.fy + params.config.cy; + } + System.out.println("After: " + Arrays.toString(fixedCorners)); + + // Create a new Detection with the fixed corners + var corrected = + new AprilTagDetection( + in.getFamily(), + in.getId(), + in.getHamming(), + in.getDecisionMargin(), + in.getHomography(), + in.getCenterX(), + in.getCenterY(), + fixedCorners); + return m_poseEstimator.estimateOrthogonalIteration(in, params.nIters); } @@ -57,11 +109,14 @@ public class AprilTagPoseEstimatorPipe public static class AprilTagPoseEstimatorPipeParams { final AprilTagPoseEstimator.Config config; + final CameraCalibrationCoefficients calibration; final int nIters; - public AprilTagPoseEstimatorPipeParams(Config config, int nIters) { + public AprilTagPoseEstimatorPipeParams( + Config config, CameraCalibrationCoefficients cal, int nIters) { this.config = config; this.nIters = nIters; + this.calibration = cal; } @Override diff --git a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dAprilTagsPipe.java b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dAprilTagsPipe.java index 89bbabd8d..017e97337 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dAprilTagsPipe.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dAprilTagsPipe.java @@ -30,6 +30,7 @@ public class Draw3dAprilTagsPipe extends Draw3dTargetsPipe { FrameDivisor divisor) { super(shouldDraw, cameraCalibrationCoefficients, targetModel, divisor); this.shouldDrawHull = false; + this.redistortPoints = true; } } } diff --git a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dTargetsPipe.java b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dTargetsPipe.java index f0a75ca9a..57989bf9e 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dTargetsPipe.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipe/impl/Draw3dTargetsPipe.java @@ -93,7 +93,12 @@ public class Draw3dTargetsPipe params.cameraCalibrationCoefficients.getDistCoeffsMat(), tempMat, jac); - // Distort the points so they match the image they're being overlaid on + + if (params.redistortPoints) { + // Distort the points so they match the image they're being overlaid on + distortPoints(tempMat, tempMat); + } + var bottomPoints = tempMat.toList(); Calib3d.projectPoints( @@ -104,6 +109,12 @@ public class Draw3dTargetsPipe params.cameraCalibrationCoefficients.getDistCoeffsMat(), tempMat, jac); + + if (params.redistortPoints) { + // Distort the points so they match the image they're being overlaid on + distortPoints(tempMat, tempMat); + } + var topPoints = tempMat.toList(); dividePointList(bottomPoints); @@ -290,6 +301,8 @@ public class Draw3dTargetsPipe public final CameraCalibrationCoefficients cameraCalibrationCoefficients; public final FrameDivisor divisor; + public boolean redistortPoints = false; + public Draw3dContoursParams( boolean shouldDraw, CameraCalibrationCoefficients cameraCalibrationCoefficients, diff --git a/photon-core/src/main/java/org/photonvision/vision/pipeline/AprilTagPipeline.java b/photon-core/src/main/java/org/photonvision/vision/pipeline/AprilTagPipeline.java index 0ed76354d..4e773605f 100644 --- a/photon-core/src/main/java/org/photonvision/vision/pipeline/AprilTagPipeline.java +++ b/photon-core/src/main/java/org/photonvision/vision/pipeline/AprilTagPipeline.java @@ -97,7 +97,9 @@ public class AprilTagPipeline extends CVPipeline