Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
extrinsicsresidual.h
Go to the documentation of this file.
1
3#pragma once
4
5// ceres
6#include <ceres/ceres.h>
7
8#include "../detail/observationutils.h"
11
12namespace calib {
13
14template <typename T>
15static std::pair<Eigen::Matrix<T, 3, 3>, Eigen::Matrix<T, 3, 1>> get_camera_se3_target(
16 const Eigen::Matrix<T, 3, 3>& c_rot_r, const Eigen::Matrix<T, 3, 1>& c_tra_r,
17 const Eigen::Matrix<T, 3, 3>& r_rot_t, const Eigen::Matrix<T, 3, 1>& r_tra_t) {
18 auto [c_rot_t, c_tra_t] = product(c_rot_r, c_tra_r, r_rot_t, r_tra_t);
19 return {c_rot_t, c_tra_t};
20}
21
22template <camera_model CameraT>
23struct ExtrinsicResidual final {
25
26 explicit ExtrinsicResidual(PlanarView view_) : view(std::move(view_)) {}
27
28 template <typename T>
29 bool operator()(const T* c_qua_r, const T* c_tra_r, const T* r_qua_t, const T* r_tra_t,
30 const T* intrinsics, T* residuals) const {
31 const auto [c_rot_t, c_tra_t] =
34 auto cam = CameraTraits<CameraT>::template from_array<T>(intrinsics);
35
36 size_t idx = 0;
37 for (const auto& observation : view) {
38 auto point = Eigen::Matrix<T, 3, 1>(T(observation.object_xy.x()),
39 T(observation.object_xy.y()), T(0));
40 point = c_rot_t * point + c_tra_t;
41 Eigen::Matrix<T, 2, 1> projected_uv = cam.project(point);
42 residuals[idx++] = projected_uv.x() - T(observation.image_uv.x());
43 residuals[idx++] = projected_uv.y() - T(observation.image_uv.y());
44 }
45 return true;
46 }
47
48 static auto* create(const PlanarView& view) {
49 if (view.empty()) {
50 throw std::invalid_argument("No observations provided");
51 }
52
53 auto* functor = new ExtrinsicResidual(view);
54 constexpr int intr_size = CameraTraits<CameraT>::param_count;
55 auto* cost =
56 new ceres::AutoDiffCostFunction<ExtrinsicResidual, ceres::DYNAMIC, 4, 3, 4, 3,
57 intr_size>(functor, static_cast<int>(view.size()) * 2);
58 return cost;
59 }
60};
61
62} // namespace calib
std::vector< Eigen::Isometry3d > cam
Linear multi-camera extrinsics initialisation (DLT)
static Eigen::Matrix< T, 3, 1 > array_to_translation(const T *const arr)
std::pair< Eigen::Matrix< T, 3, 3 >, Eigen::Matrix< T, 3, 1 > > product(const Eigen::Matrix< T, 3, 3 > &rotation1, const Eigen::Matrix< T, 3, 1 > &translation1, const Eigen::Matrix< T, 3, 3 > &rotation2, const Eigen::Matrix< T, 3, 1 > &translation2)
static std::pair< Eigen::Matrix< T, 3, 3 >, Eigen::Matrix< T, 3, 1 > > get_camera_se3_target(const Eigen::Matrix< T, 3, 3 > &b_rot_t, const Eigen::Matrix< T, 3, 1 > &b_tra_t, const Eigen::Matrix< T, 3, 3 > &g_rot_c, const Eigen::Matrix< T, 3, 1 > &g_tra_c, const Eigen::Matrix< T, 3, 3 > &b_rot_g, const Eigen::Matrix< T, 3, 1 > &b_tra_g)
static Eigen::Matrix< T, 3, 3 > quat_array_to_rotmat(const T *const arr)
std::vector< PlanarObservation > PlanarView
Definition planarpose.h:26
Type traits template for camera model implementations.
Definition cameramodel.h:64
static auto * create(const PlanarView &view)
ExtrinsicResidual(PlanarView view_)
bool operator()(const T *c_qua_r, const T *c_tra_r, const T *r_qua_t, const T *r_tra_t, const T *intrinsics, T *residuals) const