blob: 089f3ac0eda080e111d84163c4ffc69b45f5d3a2 [file] [log] [blame]
Jim Ostrowskicb8b4082024-01-21 02:23:46 -08001#include "frc971/vision/vision_util_lib.h"
2
Austin Schuh99f7c6a2024-06-25 22:07:44 -07003#include "absl/log/check.h"
4#include "absl/log/log.h"
Jim Ostrowski33208982024-03-02 15:01:45 -08005#include "absl/strings/str_format.h"
Jim Ostrowskicb8b4082024-01-21 02:23:46 -08006
7namespace frc971::vision {
8
9std::optional<cv::Mat> CameraExtrinsics(
10 const frc971::vision::calibration::CameraCalibration *camera_calibration) {
11 CHECK(!camera_calibration->has_turret_extrinsics())
12 << "Turret not currently supported";
13
14 if (!camera_calibration->has_fixed_extrinsics()) {
15 return std::nullopt;
16 }
17 CHECK(camera_calibration->fixed_extrinsics()->has_data());
18 cv::Mat result(4, 4, CV_32F,
19 const_cast<void *>(static_cast<const void *>(
20 camera_calibration->fixed_extrinsics()->data()->data())));
21 result.convertTo(result, CV_64F);
22 CHECK_EQ(result.total(),
23 camera_calibration->fixed_extrinsics()->data()->size());
24
25 return result;
26}
27
28cv::Mat CameraIntrinsics(
29 const frc971::vision::calibration::CameraCalibration *camera_calibration) {
30 cv::Mat result(3, 3, CV_32F,
31 const_cast<void *>(static_cast<const void *>(
32 camera_calibration->intrinsics()->data())));
33 result.convertTo(result, CV_64F);
34 CHECK_EQ(result.total(), camera_calibration->intrinsics()->size());
35
36 return result;
37}
38
39cv::Mat CameraDistCoeffs(
40 const frc971::vision::calibration::CameraCalibration *camera_calibration) {
41 const cv::Mat result(5, 1, CV_32F,
42 const_cast<void *>(static_cast<const void *>(
43 camera_calibration->dist_coeffs()->data())));
44 CHECK_EQ(result.total(), camera_calibration->dist_coeffs()->size());
45 return result;
46}
47
Jim Ostrowskib974cca2024-01-28 15:07:50 -080048std::optional<uint16_t> CameraNumberFromChannel(std::string camera_channel) {
49 if (camera_channel.find("/camera") == std::string::npos) {
50 return std::nullopt;
51 }
52 // If the string doesn't end in /camera#, return nullopt
53 uint16_t cam_len = std::string("/camera").length();
54 if (camera_channel.length() != camera_channel.find("/camera") + cam_len + 1) {
55 return std::nullopt;
56 }
57
58 uint16_t camera_number = std::stoi(
59 camera_channel.substr(camera_channel.find("/camera") + cam_len, 1));
60 return camera_number;
61}
62
Jim Ostrowski33208982024-03-02 15:01:45 -080063std::string CalibrationFilename(std::string calibration_folder,
64 std::string node_name, int team_number,
65 int camera_number, std::string camera_id,
66 std::string timestamp) {
67 // Get rid of any fractional seconds-- we shouldn't need those and it makes
68 // the string unnecessarily longer
69 timestamp = timestamp.substr(0, timestamp.find("."));
70 std::string calibration_filename =
71 calibration_folder +
72 absl::StrFormat("/calibration_%s-%d-%d_cam-%s_%s.json", node_name.c_str(),
73 team_number, camera_number, camera_id.c_str(),
74 timestamp.c_str());
75 return calibration_filename;
76}
77
Jim Ostrowskicb8b4082024-01-21 02:23:46 -080078} // namespace frc971::vision