001/*
002 * Copyright (C) Photon Vision.
003 *
004 * This program is free software: you can redistribute it and/or modify
005 * it under the terms of the GNU General Public License as published by
006 * the Free Software Foundation, either version 3 of the License, or
007 * (at your option) any later version.
008 *
009 * This program is distributed in the hope that it will be useful,
010 * but WITHOUT ANY WARRANTY; without even the implied warranty of
011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
012 * GNU General Public License for more details.
013 *
014 * You should have received a copy of the GNU General Public License
015 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
016 */
017
018package org.photonvision.vision.calibration;
019
020import java.util.List;
021import java.util.stream.Collectors;
022import org.opencv.core.Size;
023
024public class UICameraCalibrationCoefficients extends CameraCalibrationCoefficients {
025    public int numSnapshots;
026    public List<Double> meanErrors;
027
028    public UICameraCalibrationCoefficients(
029            Size resolution,
030            JsonMatOfDouble cameraIntrinsics,
031            JsonMatOfDouble distCoeffs,
032            double[] calobjectWarp,
033            List<BoardObservation> observations,
034            Size calobjectSize,
035            double calobjectSpacing,
036            CameraLensModel lensmodel) {
037        // yeet observations, keep all else
038        super(
039                resolution,
040                cameraIntrinsics,
041                distCoeffs,
042                calobjectWarp,
043                List.of(),
044                calobjectSize,
045                calobjectSpacing,
046                lensmodel);
047
048        this.numSnapshots = observations.size();
049        this.meanErrors =
050                observations.stream()
051                        .map(
052                                it2 ->
053                                        it2.reprojectionErrors.stream()
054                                                .mapToDouble(it -> Math.sqrt(it.x * it.x + it.y * it.y))
055                                                .average()
056                                                .orElse(0))
057                        .collect(Collectors.toList());
058    }
059}