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
7#include "detail/ceresutils.h"
10
11namespace calib {
12
13template <camera_model CameraT>
14struct IntrinsicBlocks final : public ProblemParamBlocks {
16 std::vector<std::array<double, 4>> c_quat_t;
17 std::vector<std::array<double, 3>> c_tra_t;
18 std::array<double, intr_size> intr{};
19
20 explicit IntrinsicBlocks(size_t numviews) : c_quat_t(numviews), c_tra_t(numviews) {}
21
22 static IntrinsicBlocks create(const CameraT& camera,
23 const std::vector<Eigen::Isometry3d>& init_c_se3_t) {
24 const size_t num_views = init_c_se3_t.size();
25 IntrinsicBlocks blocks(num_views);
26
28 for (size_t v = 0; v < num_views; ++v) {
29 populate_quat_tran(init_c_se3_t[v], blocks.c_quat_t[v], blocks.c_tra_t[v]);
30 }
31 return blocks;
32 }
33
34 [[nodiscard]] std::vector<ParamBlock> get_param_blocks() const override {
35 std::vector<ParamBlock> blocks;
36 blocks.emplace_back(intr.data(), intr.size(), intr_size);
37
38 // Reserve space for efficiency
39 blocks.reserve(1 + c_quat_t.size() + c_tra_t.size());
40
41 // Add quaternion blocks using std::transform
42 std::transform(c_quat_t.begin(), c_quat_t.end(), std::back_inserter(blocks),
43 [](const auto& i) { return ParamBlock{i.data(), i.size(), 3}; });
44
45 // Add translation blocks using std::transform
46 std::transform(c_tra_t.begin(), c_tra_t.end(), std::back_inserter(blocks),
47 [](const auto& i) { return ParamBlock{i.data(), i.size(), 3}; });
48
49 return blocks;
50 }
51
53 const size_t num_views = c_quat_t.size();
54 result.c_se3_t.resize(num_views);
55
56 result.camera = CameraTraits<CameraT>::template from_array<double>(intr.data());
57 for (size_t v = 0; v < num_views; ++v) {
58 result.c_se3_t[v] = restore_pose(c_quat_t[v], c_tra_t[v]);
59 }
60 }
61};
62
63template <camera_model CameraT>
64static ceres::Problem build_problem(const std::vector<PlanarView>& views,
65 const IntrinsicsOptimOptions& opts,
67 ceres::Problem p;
68 for (size_t view_idx = 0; view_idx < views.size(); ++view_idx) {
69 const auto& view = views[view_idx];
70 auto* loss =
71 opts.core.huber_delta > 0 ? new ceres::HuberLoss(opts.core.huber_delta) : nullptr;
72 p.AddResidualBlock(IntrinsicResidual<CameraT>::create(view), loss,
73 blocks.c_quat_t[view_idx].data(), blocks.c_tra_t[view_idx].data(),
74 blocks.intr.data());
75 }
76
77 for (auto& c_quat_t : blocks.c_quat_t) {
78 p.SetManifold(c_quat_t.data(), new ceres::QuaternionManifold());
79 }
80
81 p.SetParameterLowerBound(blocks.intr.data(), CameraTraits<CameraT>::idx_fx, 0.0);
82 p.SetParameterLowerBound(blocks.intr.data(), CameraTraits<CameraT>::idx_fy, 0.0);
83 if (!opts.optimize_skew) {
84 p.SetManifold(blocks.intr.data(),
85 new ceres::SubsetManifold(IntrinsicBlocks<CameraT>::intr_size,
87 }
88
89 return p;
90}
91
92static void validate_input(const std::vector<PlanarView>& views) {
93 if (views.size() < 4) {
94 throw std::invalid_argument("Insufficient views for calibration (at least 4 required).");
95 }
96}
97
98template <camera_model CameraT>
99auto optimize_intrinsics(const std::vector<PlanarView>& views, const CameraT& init_camera,
100 std::vector<Eigen::Isometry3d> init_c_se3_t,
101 const IntrinsicsOptimOptions& opts)
103 validate_input(views);
104
105 auto blocks = IntrinsicBlocks<CameraT>::create(init_camera, init_c_se3_t);
106 ceres::Problem problem = build_problem(views, opts, blocks);
107
109 solve_problem(problem, opts.core, &result.core);
110
111 blocks.populate_result(result);
112 if (opts.core.compute_covariance) {
113 auto optcov = compute_covariance(blocks, problem);
114 if (optcov.has_value()) {
115 result.core.covariance = std::move(optcov.value());
116 }
117 }
118
119 return result;
120}
121
122template auto optimize_intrinsics(const std::vector<PlanarView>& views,
123 const PinholeCamera<BrownConradyd>& init_camera,
124 std::vector<Eigen::Isometry3d> init_c_se3_t,
125 const IntrinsicsOptimOptions& opts)
127
129 const std::vector<PlanarView>& views,
131 std::vector<Eigen::Isometry3d> init_c_se3_t, const IntrinsicsOptimOptions& opts)
133
134} // namespace calib
Pinhole camera model with intrinsics and distortion correction.
Definition pinhole.h:39
Lens distortion models and correction algorithms.
Linear multi-camera extrinsics initialisation (DLT)
void populate_quat_tran(const Eigen::Isometry3d &pose, std::array< double, 4 > &quat, std::array< double, 3 > &translation)
auto optimize_intrinsics(const std::vector< PlanarView > &views, const CameraT &init_camera, std::vector< Eigen::Isometry3d > init_c_se3_t, const IntrinsicsOptimOptions &opts={}) -> IntrinsicsOptimizationResult< CameraT >
static ceres::Problem build_problem(const std::vector< PlanarView > &views, const IntrinsicsOptimOptions &opts, IntrinsicBlocks< CameraT > &blocks)
void validate_input(const std::vector< BundleObservation > &observations, const std::vector< CameraT > &initial_cameras)
Definition bundle.cpp:136
Eigen::Isometry3d restore_pose(const std::array< double, 4 > &quat, const std::array< double, 3 > &translation)
auto compute_covariance(const ProblemParamBlocks &problem_param_blocks, ceres::Problem &problem, double sum_squared_residuals=0, size_t total_residuals=0) -> std::optional< Eigen::MatrixXd >
Definition ceresutils.h:69
void solve_problem(ceres::Problem &problem, const OptimOptions &opts, OptimResult *result)
Definition ceresutils.h:27
Type traits template for camera model implementations.
Definition cameramodel.h:64
void populate_result(IntrinsicsOptimizationResult< CameraT > &result) const
std::array< double, intr_size > intr
std::vector< std::array< double, 3 > > c_tra_t
std::vector< ParamBlock > get_param_blocks() const override
IntrinsicBlocks(size_t numviews)
std::vector< std::array< double, 4 > > c_quat_t
static constexpr size_t intr_size
static IntrinsicBlocks create(const CameraT &camera, const std::vector< Eigen::Isometry3d > &init_c_se3_t)
OptimOptions core
Non-linear optimization options.
Definition intrinsics.h:14
bool optimize_skew
Estimate skew parameter.
Definition intrinsics.h:16
OptimResult core
Optimization result details.
Definition intrinsics.h:24
CameraT camera
Estimated camera parameters.
Definition intrinsics.h:25
std::vector< Eigen::Isometry3d > c_se3_t
Estimated pose of each view.
Definition intrinsics.h:26
Eigen::MatrixXd covariance
Definition optimize.h:37
Camera model with a tilted sensor plane (Scheimpflug configuration).
Definition scheimpflug.h:35