blob: 276341aa11e5ad56a9e7095be4b0f1763225fef1 [file] [log] [blame]
James Kuszmauld67f6d22023-02-05 17:37:25 -08001#include "y2023/vision/vision_util.h"
2
Austin Schuh99f7c6a2024-06-25 22:07:44 -07003#include "absl/log/check.h"
4#include "absl/log/log.h"
James Kuszmauld67f6d22023-02-05 17:37:25 -08005
6namespace y2023::vision {
milind-uf2a4e322023-02-01 19:33:10 -08007
James Kuszmauld67f6d22023-02-05 17:37:25 -08008const frc971::vision::calibration::CameraCalibration *FindCameraCalibration(
9 const y2023::Constants &calibration_data, std::string_view node_name) {
10 CHECK(calibration_data.has_cameras());
11 for (const y2023::CameraConfiguration *candidate :
12 *calibration_data.cameras()) {
13 CHECK(candidate->has_calibration());
14 if (candidate->calibration()->node_name()->string_view() != node_name) {
15 continue;
16 }
17 return candidate->calibration();
18 }
19 LOG(FATAL) << ": Failed to find camera calibration for " << node_name;
20}
milind-uf2a4e322023-02-01 19:33:10 -080021
James Kuszmaul258e4ee2023-02-23 14:22:30 -080022std::optional<cv::Mat> CameraExtrinsics(
milind-uf2a4e322023-02-01 19:33:10 -080023 const frc971::vision::calibration::CameraCalibration *camera_calibration) {
24 CHECK(!camera_calibration->has_turret_extrinsics())
25 << "No turret on 2023 robot";
26
James Kuszmaul258e4ee2023-02-23 14:22:30 -080027 if (!camera_calibration->has_fixed_extrinsics()) {
28 return std::nullopt;
29 }
30 CHECK(camera_calibration->fixed_extrinsics()->has_data());
milind-uf2a4e322023-02-01 19:33:10 -080031 cv::Mat result(4, 4, CV_32F,
32 const_cast<void *>(static_cast<const void *>(
33 camera_calibration->fixed_extrinsics()->data()->data())));
34 result.convertTo(result, CV_64F);
35 CHECK_EQ(result.total(),
36 camera_calibration->fixed_extrinsics()->data()->size());
37
38 return result;
39}
40
41cv::Mat CameraIntrinsics(
42 const frc971::vision::calibration::CameraCalibration *camera_calibration) {
43 cv::Mat result(3, 3, CV_32F,
44 const_cast<void *>(static_cast<const void *>(
45 camera_calibration->intrinsics()->data())));
46 result.convertTo(result, CV_64F);
47 CHECK_EQ(result.total(), camera_calibration->intrinsics()->size());
48
49 return result;
50}
51
52cv::Mat CameraDistCoeffs(
53 const frc971::vision::calibration::CameraCalibration *camera_calibration) {
54 const cv::Mat result(5, 1, CV_32F,
55 const_cast<void *>(static_cast<const void *>(
56 camera_calibration->dist_coeffs()->data())));
57 CHECK_EQ(result.total(), camera_calibration->dist_coeffs()->size());
58 return result;
59}
60
James Kuszmauld67f6d22023-02-05 17:37:25 -080061} // namespace y2023::vision