James Kuszmaul | d67f6d2 | 2023-02-05 17:37:25 -0800 | [diff] [blame] | 1 | #include "y2023/vision/vision_util.h" |
| 2 | |
| 3 | #include "glog/logging.h" |
| 4 | |
| 5 | namespace y2023::vision { |
milind-u | f2a4e32 | 2023-02-01 19:33:10 -0800 | [diff] [blame] | 6 | |
James Kuszmaul | d67f6d2 | 2023-02-05 17:37:25 -0800 | [diff] [blame] | 7 | const 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-u | f2a4e32 | 2023-02-01 19:33:10 -0800 | [diff] [blame] | 20 | |
James Kuszmaul | 258e4ee | 2023-02-23 14:22:30 -0800 | [diff] [blame] | 21 | std::optional<cv::Mat> CameraExtrinsics( |
milind-u | f2a4e32 | 2023-02-01 19:33:10 -0800 | [diff] [blame] | 22 | const frc971::vision::calibration::CameraCalibration *camera_calibration) { |
| 23 | CHECK(!camera_calibration->has_turret_extrinsics()) |
| 24 | << "No turret on 2023 robot"; |
| 25 | |
James Kuszmaul | 258e4ee | 2023-02-23 14:22:30 -0800 | [diff] [blame] | 26 | if (!camera_calibration->has_fixed_extrinsics()) { |
| 27 | return std::nullopt; |
| 28 | } |
| 29 | CHECK(camera_calibration->fixed_extrinsics()->has_data()); |
milind-u | f2a4e32 | 2023-02-01 19:33:10 -0800 | [diff] [blame] | 30 | 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 | |
| 40 | cv::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 | |
| 51 | cv::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 Kuszmaul | d67f6d2 | 2023-02-05 17:37:25 -0800 | [diff] [blame] | 60 | } // namespace y2023::vision |