Refactor of apriltag detector to send out tags

Split into app in y2024, and libs in frc971

Added in calibration constants to y2024, including single basic camera

Modified team number parsing to work with orins

Pulled out year-by-year calibration call to a single FindCameraCalibration
call, and rest (extrinsics, intrinsics) are year-agnostic

Moving camera calibration files into constants/calib_files directory, instead
of vision/calib_files

Change-Id: Ic485086aad9665d2b571551a5afb337c9254d690
Signed-off-by: Jim Ostrowski <yimmy13@gmail.com>
diff --git a/frc971/vision/vision_util_lib.cc b/frc971/vision/vision_util_lib.cc
new file mode 100644
index 0000000..b65e883
--- /dev/null
+++ b/frc971/vision/vision_util_lib.cc
@@ -0,0 +1,46 @@
+#include "frc971/vision/vision_util_lib.h"
+
+#include "glog/logging.h"
+
+namespace frc971::vision {
+
+std::optional<cv::Mat> CameraExtrinsics(
+    const frc971::vision::calibration::CameraCalibration *camera_calibration) {
+  CHECK(!camera_calibration->has_turret_extrinsics())
+      << "Turret not currently supported";
+
+  if (!camera_calibration->has_fixed_extrinsics()) {
+    return std::nullopt;
+  }
+  CHECK(camera_calibration->fixed_extrinsics()->has_data());
+  cv::Mat result(4, 4, CV_32F,
+                 const_cast<void *>(static_cast<const void *>(
+                     camera_calibration->fixed_extrinsics()->data()->data())));
+  result.convertTo(result, CV_64F);
+  CHECK_EQ(result.total(),
+           camera_calibration->fixed_extrinsics()->data()->size());
+
+  return result;
+}
+
+cv::Mat CameraIntrinsics(
+    const frc971::vision::calibration::CameraCalibration *camera_calibration) {
+  cv::Mat result(3, 3, CV_32F,
+                 const_cast<void *>(static_cast<const void *>(
+                     camera_calibration->intrinsics()->data())));
+  result.convertTo(result, CV_64F);
+  CHECK_EQ(result.total(), camera_calibration->intrinsics()->size());
+
+  return result;
+}
+
+cv::Mat CameraDistCoeffs(
+    const frc971::vision::calibration::CameraCalibration *camera_calibration) {
+  const cv::Mat result(5, 1, CV_32F,
+                       const_cast<void *>(static_cast<const void *>(
+                           camera_calibration->dist_coeffs()->data())));
+  CHECK_EQ(result.total(), camera_calibration->dist_coeffs()->size());
+  return result;
+}
+
+}  // namespace frc971::vision