Calibration Library 1.0.0
A C++ library for camera calibration and vision-related geometric transformations
Loading...
Searching...
No Matches
intrinsicresidual.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 <camera_model CameraT>
15struct IntrinsicResidual final {
17
18 explicit IntrinsicResidual(PlanarView v) : view(std::move(v)) {}
19
20 template <typename T>
21 bool operator()(const T* c_qua_t_, const T* c_tra_t_, const T* intrinsics, T* residuals) const {
22 auto c_rot_t = quat_array_to_rotmat(c_qua_t_);
23 auto c_tra_t = array_to_translation(c_tra_t_);
24 auto cam = CameraTraits<CameraT>::template from_array<T>(intrinsics);
25
26 size_t idx = 0;
27 for (const auto& ob : view) {
28 auto point = Eigen::Matrix<T, 3, 1>(T(ob.object_xy.x()), T(ob.object_xy.y()), T(0));
29 point = c_rot_t * point + c_tra_t;
30 Eigen::Matrix<T, 2, 1> uv = cam.project(point);
31 residuals[idx++] = uv.x() - T(ob.image_uv.x());
32 residuals[idx++] = uv.y() - T(ob.image_uv.y());
33 }
34 return true;
35 }
36
37 static auto* create(const PlanarView& v) {
38 if (v.empty()) {
39 throw std::invalid_argument("No observations provided");
40 };
41
42 auto* functor = new IntrinsicResidual(v);
43 constexpr int intr_size = CameraTraits<CameraT>::param_count;
44 auto* cost =
45 new ceres::AutoDiffCostFunction<IntrinsicResidual, ceres::DYNAMIC, 4, 3, intr_size>(
46 functor, static_cast<int>(v.size()) * 2);
47 return cost;
48 }
49};
50
51} // 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)
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
bool operator()(const T *c_qua_t_, const T *c_tra_t_, const T *intrinsics, T *residuals) const
static auto * create(const PlanarView &v)