Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
intrinsics_utils.h
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5#include <optional>
6#include <utility>
7
9
10namespace calib::detail {
11
12inline auto sanitize_intrinsics_impl(const CameraMatrix& kmtx,
13 const std::optional<CalibrationBounds>& bounds)
14 -> std::pair<CameraMatrix, bool> {
15 if (!bounds.has_value()) {
16 return {kmtx, false};
17 }
18
19 const auto& b = bounds.value();
20 CameraMatrix adjusted = kmtx;
21 bool modified = false;
22
23 const auto enforce_min_focal = [&modified](double value, double min_val) {
24 if (!std::isfinite(value) || value < min_val) {
25 modified = true;
26 return min_val;
27 }
28 return value;
29 };
30
31 const auto midpoint = [](double min_val, double max_val) { return 0.5 * (min_val + max_val); };
32
33 const auto adjust_principal_point = [&modified, &midpoint](double value, double min_val,
34 double max_val) {
35 if (!std::isfinite(value)) {
36 modified = true;
37 return midpoint(min_val, max_val);
38 }
39 if (value < min_val || value > max_val) {
40 modified = true;
41 return midpoint(min_val, max_val);
42 }
43 return value;
44 };
45
46 adjusted.fx = enforce_min_focal(adjusted.fx, b.fx_min);
47 adjusted.fy = enforce_min_focal(adjusted.fy, b.fy_min);
48 adjusted.cx = adjust_principal_point(adjusted.cx, b.cx_min, b.cx_max);
49 adjusted.cy = adjust_principal_point(adjusted.cy, b.cy_min, b.cy_max);
50
51 const double skew_min = std::min(b.skew_min, b.skew_max);
52 const double skew_max = std::max(b.skew_min, b.skew_max);
53 if (!std::isfinite(adjusted.skew) || adjusted.skew < skew_min || adjusted.skew > skew_max) {
54 modified = true;
55 adjusted.skew = std::clamp(0.0, skew_min, skew_max);
56 }
57 return {adjusted, modified};
58}
59
60} // namespace calib::detail
61
62namespace calib {
63
64inline auto sanitize_intrinsics(const CameraMatrix& kmtx,
65 const std::optional<CalibrationBounds>& bounds)
66 -> std::pair<CameraMatrix, bool> {
67 return detail::sanitize_intrinsics_impl(kmtx, bounds);
68}
69
70} // namespace calib
auto sanitize_intrinsics_impl(const CameraMatrix &kmtx, const std::optional< CalibrationBounds > &bounds) -> std::pair< CameraMatrix, bool >
Linear multi-camera extrinsics initialisation (DLT)
auto sanitize_intrinsics(const CameraMatrix &kmtx, const std::optional< CalibrationBounds > &bounds) -> std::pair< CameraMatrix, bool >