Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
intrinsicsemidltresidual.h
Go to the documentation of this file.
1
3#pragma once
4
5// std
6#include <numeric>
7#include <vector>
8
9// ceres
10#include <ceres/ceres.h>
11
12#include "../detail/observationutils.h"
15
16namespace calib {
17
18// Variable projection residual for full camera calibration.
19struct CalibVPResidual final {
20 const std::vector<PlanarView> views; // observations per view
21 const int num_radial_;
22 const size_t total_obs_;
23
24 CalibVPResidual(const std::vector<PlanarView>& v, int num_radial)
25 : views(v),
26 num_radial_(num_radial),
27 total_obs_(std::accumulate(
28 v.begin(), v.end(), size_t(0),
29 [](size_t sum, const PlanarView& view) { return sum + view.size(); })) {}
30
31 template <typename T>
32 bool operator()(T const* const* params, T* residuals) const {
33 std::vector<Observation<T>> o;
34 o.reserve(total_obs_);
35
36 auto c_se3_t = Eigen::Transform<T, 3, Eigen::Isometry>::Identity();
37
38 for (size_t i = 0; i < views.size(); ++i) {
39 c_se3_t.linear() = quat_array_to_rotmat<T>(params[2 * i + 1]);
40 c_se3_t.translation() = array_to_translation<T>(params[2 * i + 2]);
41 std::vector<Observation<T>> new_obs(views[i].size());
42 planar_observables_to_observables(views[i], new_obs, c_se3_t);
43 o.insert(o.end(), new_obs.begin(), new_obs.end());
44 }
45
46 const T* intr = params[0];
47 const CameraMatrixT<T> intrinsics{intr[0], intr[1], intr[2], intr[3], intr[4]};
48 auto dr = fit_distortion_full(o, intrinsics, num_radial_);
49 if (!dr) {
50 return false;
51 }
52 const auto& r = dr->residuals;
53 for (int i = 0; i < r.size(); ++i) {
54 residuals[i] = r[i];
55 }
56 return true;
57 }
58
59 static auto* create(const std::vector<PlanarView>& views, int num_radial) {
60 auto* functor = new CalibVPResidual(views, num_radial);
61 auto* cost = new ceres::DynamicAutoDiffCostFunction(functor);
62 cost->AddParameterBlock(5); // Intrinsics (fx, fy, cx, cy, skew)
63 for (size_t i = 0; i < views.size(); ++i) {
64 cost->AddParameterBlock(4); // Quaternion for each view
65 cost->AddParameterBlock(3); // Translation for each view
66 }
67 const size_t total_obs =
68 std::accumulate(views.begin(), views.end(), size_t(0),
69 [](size_t sum, const PlanarView& v) { return sum + v.size(); });
70 cost->SetNumResiduals(static_cast<int>(total_obs * 2));
71 return cost;
72 }
73};
74
75} // namespace calib
Lens distortion models and correction algorithms.
Linear multi-camera extrinsics initialisation (DLT)
static void planar_observables_to_observables(const PlanarView &planar_obs, std::vector< Observation< T > > &obs, const Eigen::Transform< T, 3, Eigen::Isometry > &camera_se3_target)
std::vector< PlanarObservation > PlanarView
Definition planarpose.h:26
auto fit_distortion_full(const std::vector< Observation< T > > &observations, const CameraMatrixT< T > &intrinsics, int num_radial=2, std::span< const int > fixed_indices={}, std::span< const T > fixed_values={}) -> std::optional< DistortionWithResiduals< T > >
Definition distortion.h:231
const std::vector< PlanarView > views
static auto * create(const std::vector< PlanarView > &views, int num_radial)
CalibVPResidual(const std::vector< PlanarView > &v, int num_radial)
bool operator()(T const *const *params, T *residuals) const