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