From bdafd316bc18593572c569a413feab042d5ddf77 Mon Sep 17 00:00:00 2001 From: thatcomputerguy0101 Date: Wed, 29 Jul 2026 12:43:32 -0400 Subject: [PATCH] Return partial used corners for calibration --- .../java/org/photonvision/mrcal/MrCalJNI.java | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/photonvision/mrcal/MrCalJNI.java b/src/main/java/org/photonvision/mrcal/MrCalJNI.java index f5c8dd1..2681448 100644 --- a/src/main/java/org/photonvision/mrcal/MrCalJNI.java +++ b/src/main/java/org/photonvision/mrcal/MrCalJNI.java @@ -57,6 +57,8 @@ public MrCalObservation(Point[] corners, float[] levels) { } } + protected static record ObservationInfo(double[] data, int[][] ids) {} + public static class MrCalResult { public boolean success; public double[] intrinsics; @@ -278,12 +280,13 @@ public static native double[] compute_uncertainty( * present. Levels will be converted to weights using weight = 0.5^level, as explained * [here](https://github.com/dkogan/mrcal/blob/7cd9ac4c854a4b244a35f554c9ebd0464d59e9ff/mrcal-calibrate-cameras#L152) */ - private static double[] makeObservations( + private static ObservationInfo makeObservations( int observationCount, Iterator observationData, int boardWidth, int boardHeight) { double[] observations = new double[boardWidth * boardHeight * 3 * observationCount]; + int[][] all_ids = new int[observationCount][]; Arrays.fill(observations, -1.0); for (int b = 0; b < observationCount; b++) { @@ -297,6 +300,7 @@ private static double[] makeObservations( final var corners = observation.corners; final var levels = observation.levels; final var ids = observation.ids; + all_ids[b] = ids; if (ids == null) { // No ids, assume a full rectangular board @@ -347,7 +351,7 @@ private static double[] makeObservations( return null; } - return observations; + return new ObservationInfo(observations, all_ids); } /** @@ -380,7 +384,28 @@ public static MrCalResult calibrateCamera( var observations = makeObservations(observationCount, observationData, boardWidth, boardHeight); - return mrcal_calibrate_camera( - observations, boardWidth, boardHeight, boardSpacing, imageWidth, imageHeight, focalLen); + var results = + mrcal_calibrate_camera( + observations.data, + boardWidth, + boardHeight, + boardSpacing, + imageWidth, + imageHeight, + focalLen); + + // Only return corners used for the corners that were provided in the input + for (int b = 0; b < observations.ids.length; b++) { + if (observations.ids[b] != null) { + boolean[] fullCorners = results.cornersUsed.get(b); + boolean[] partialCorners = new boolean[observations.ids[b].length]; + for (int i = 0; i < observations.ids[b].length; i++) { + partialCorners[i] = fullCorners[observations.ids[b][i]]; + } + results.cornersUsed.set(b, partialCorners); + } + } + + return results; } }