Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
intrinsics.cpp
Go to the documentation of this file.
2
3#include <algorithm>
4#include <chrono>
5#include <ctime>
6#include <iomanip>
7#include <sstream>
8#include <vector>
9
10namespace calib::pipeline {
11
12[[nodiscard]] auto compute_global_rms(const IntrinsicCalibrationOutputs& out) -> double {
13 const auto& refine = out.refine_result;
14 if (refine.view_errors.empty()) {
15 return 0.0;
16 }
17 double sum_sq = 0.0;
18 std::size_t total_measurements = 0;
19 for (std::size_t i = 0; i < refine.view_errors.size(); ++i) {
20 const double view_rms = refine.view_errors[i];
21 const std::size_t points =
22 i < out.active_views.size() ? out.active_views[i].corner_count : 0;
23 const std::size_t measurements = points * 2;
24 sum_sq += view_rms * view_rms * static_cast<double>(measurements);
25 total_measurements += measurements;
26 }
27 if (total_measurements == 0) {
28 return 0.0;
29 }
30 return std::sqrt(sum_sq / static_cast<double>(total_measurements));
31}
32
34 const CameraConfig& cam_cfg, const PlanarDetections& detections,
35 const IntrinsicCalibrationOutputs& outputs)
37 CameraReport camera;
38 camera.camera_id = cam_cfg.camera_id;
39 camera.model = cam_cfg.model;
40 camera.image_size = cam_cfg.image_size;
41
42 InitialGuessReport initial_guess;
43 initial_guess.intrinsics = outputs.linear_kmtx;
44 initial_guess.used_view_indices = outputs.linear_view_indices;
45 initial_guess.warning_counts =
46 InitialGuessWarningCounts{outputs.invalid_k_warnings, outputs.pose_warnings};
47 camera.initial_guess = std::move(initial_guess);
48
50 result.intrinsics = outputs.refine_result.camera.kmtx;
51 result.distortion_model = cam_cfg.model;
53 std::vector<double>(outputs.refine_result.camera.distortion.coeffs.data(),
54 outputs.refine_result.camera.distortion.coeffs.data() +
55 outputs.refine_result.camera.distortion.coeffs.size());
57
58 for (std::size_t i = 0; i < outputs.active_views.size(); ++i) {
59 const auto& view = outputs.active_views[i];
60 const double view_rms = i < outputs.refine_result.view_errors.size()
61 ? outputs.refine_result.view_errors[i]
62 : 0.0;
63 const bool used_in_linear =
64 std::find(outputs.linear_view_indices.begin(), outputs.linear_view_indices.end(), i) !=
65 outputs.linear_view_indices.end();
66 result.per_view.push_back(
67 PlanarViewReport{view.source_image, view.corner_count, view_rms, used_in_linear});
68 }
69
70 camera.result = std::move(result);
71
72 CalibrationReport calibration;
73 calibration.type = "intrinsics";
74 calibration.algorithm = cfg.algorithm;
75 calibration.options = cfg.options;
76 if (!detections.metadata.is_null() && detections.metadata.contains("detector")) {
77 calibration.detector = detections.metadata.at("detector");
78 } else {
79 calibration.detector = nlohmann::json::object();
80 }
81 calibration.cameras.push_back(std::move(camera));
82
83 return calibration;
84}
85
86} // namespace calib::pipeline
PlanarDetections detections
Definition loaders.cpp:15
auto build_planar_intrinsics_report(const IntrinsicCalibrationConfig &cfg, const CameraConfig &cam_cfg, const PlanarDetections &detections, const IntrinsicCalibrationOutputs &outputs) -> CalibrationReport
auto compute_global_rms(const IntrinsicCalibrationOutputs &out) -> double
std::vector< CameraReport > cameras
Definition intrinsics.h:53
IntrinsicCalibrationOptions options
Definition intrinsics.h:51
IntrinsicsResultReport result
Definition intrinsics.h:45
InitialGuessReport initial_guess
Definition intrinsics.h:44
std::optional< std::array< int, 2 > > image_size
Definition intrinsics.h:43
std::vector< std::size_t > used_view_indices
Definition intrinsics.h:21
InitialGuessWarningCounts warning_counts
Definition intrinsics.h:22
std::vector< double > distortion_coefficients
Definition intrinsics.h:35
std::vector< PlanarViewReport > per_view
Definition intrinsics.h:37