blob: 089f3ac0eda080e111d84163c4ffc69b45f5d3a2 [file] [log] [blame]
#include "frc971/vision/vision_util_lib.h"
#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/strings/str_format.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;
}
std::optional<uint16_t> CameraNumberFromChannel(std::string camera_channel) {
if (camera_channel.find("/camera") == std::string::npos) {
return std::nullopt;
}
// If the string doesn't end in /camera#, return nullopt
uint16_t cam_len = std::string("/camera").length();
if (camera_channel.length() != camera_channel.find("/camera") + cam_len + 1) {
return std::nullopt;
}
uint16_t camera_number = std::stoi(
camera_channel.substr(camera_channel.find("/camera") + cam_len, 1));
return camera_number;
}
std::string CalibrationFilename(std::string calibration_folder,
std::string node_name, int team_number,
int camera_number, std::string camera_id,
std::string timestamp) {
// Get rid of any fractional seconds-- we shouldn't need those and it makes
// the string unnecessarily longer
timestamp = timestamp.substr(0, timestamp.find("."));
std::string calibration_filename =
calibration_folder +
absl::StrFormat("/calibration_%s-%d-%d_cam-%s_%s.json", node_name.c_str(),
team_number, camera_number, camera_id.c_str(),
timestamp.c_str());
return calibration_filename;
}
} // namespace frc971::vision